diff --git a/Cargo.lock b/Cargo.lock index a6489d29e07..086c75136f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -423,7 +423,7 @@ dependencies = [ "bitflags 2.9.0", "cexpr", "clang-sys", - "itertools", + "itertools 0.10.999", "lazy_static", "lazycell", "proc-macro2", @@ -1854,7 +1854,7 @@ dependencies = [ [[package]] name = "error-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "error-support-macros", "lazy_static", @@ -1866,7 +1866,7 @@ dependencies = [ [[package]] name = "error-support-macros" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "proc-macro2", "quote", @@ -1983,7 +1983,7 @@ dependencies = [ [[package]] name = "firefox-versioning" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "serde_json", "thiserror 1.999.999", @@ -2643,9 +2643,9 @@ dependencies = [ [[package]] name = "glean" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251b9cb685554b96dcf785dba69ce90447006dd6d9229db783336c981c3777e1" +checksum = "95024f4707705270208e36983976cbac235dd7fc33c9f1cb0dee396ec1ce295d" dependencies = [ "crossbeam-channel", "glean-core", @@ -2657,9 +2657,9 @@ dependencies = [ [[package]] name = "glean-core" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753" +checksum = "5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e" dependencies = [ "android_logger", "bincode", @@ -3320,7 +3320,7 @@ dependencies = [ [[package]] name = "interrupt-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "lazy_static", "parking_lot", @@ -3393,9 +3393,16 @@ dependencies = [ [[package]] name = "itertools" -version = "0.10.5" +version = "0.10.999" +dependencies = [ + "itertools 0.14.0", +] + +[[package]] +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -4176,7 +4183,7 @@ dependencies = [ "futures", "getrandom 0.2.999", "hex", - "itertools", + "itertools 0.10.999", "maybe-async", "mls-rs-codec", "mls-rs-core", @@ -4423,7 +4430,7 @@ dependencies = [ "icu_properties", "idna", "indexmap", - "itertools", + "itertools 0.14.0", "libc", "lmdb-rkv-sys", "log", @@ -5028,7 +5035,7 @@ checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" [[package]] name = "payload-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "serde", "serde_derive", @@ -5338,7 +5345,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" dependencies = [ "anyhow", - "itertools", + "itertools 0.10.999", "proc-macro2", "quote", "syn", @@ -5531,7 +5538,7 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "relevancy" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "base64 0.21.999", @@ -5556,7 +5563,7 @@ dependencies = [ [[package]] name = "remote_settings" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "camino", @@ -5904,7 +5911,7 @@ dependencies = [ [[package]] name = "search" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "error-support", "firefox-versioning", @@ -6195,7 +6202,7 @@ dependencies = [ [[package]] name = "sql-support" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "interrupt-support", "lazy_static", @@ -6316,7 +6323,7 @@ dependencies = [ "gecko-profiler", "icu_segmenter", "indexmap", - "itertools", + "itertools 0.14.0", "itoa", "lazy_static", "log", @@ -6401,7 +6408,7 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "suggest" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "chrono", @@ -6453,7 +6460,7 @@ dependencies = [ [[package]] name = "sync-guid" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "base64 0.21.999", "rand", @@ -6464,7 +6471,7 @@ dependencies = [ [[package]] name = "sync15" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "error-support", @@ -6504,7 +6511,7 @@ dependencies = [ [[package]] name = "tabs" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "error-support", @@ -6848,7 +6855,7 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "types" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "rusqlite 0.33.0", "serde", @@ -7230,7 +7237,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "viaduct" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "ffi-support", "log", @@ -7400,7 +7407,7 @@ dependencies = [ [[package]] name = "webext-storage" version = "0.1.0" -source = "git+https://github.com/mozilla/application-services?rev=e1b42aa3292a71e788bc0f95fb5ab5fbe533996f#e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" +source = "git+https://github.com/mozilla/application-services?rev=41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8#41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" dependencies = [ "anyhow", "error-support", diff --git a/Cargo.toml b/Cargo.toml index a10ecb2377c..2043c9181fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,7 +68,7 @@ uniffi_bindgen = "0.29.1" # Shared across multiple application-services consumers. rusqlite = "0.33.0" # Shared across multiple glean consumers. -glean = "=64.0.1" +glean = "=64.1.1" # Explicitly specify what our profiles use. The opt-level setting here is # a total fiction; see the setup of MOZ_RUST_DEFAULT_FLAGS for what the @@ -220,6 +220,9 @@ ron = { path = "build/rust/ron" } # Patch `strum` 0.26.* to 0.27. strum = { path = "build/rust/strum" } +# Patch `itertools` 0.10.* to 0.14. +itertools = { path = "build/rust/itertools" } + # Overrides to allow easier use of common internal crates. moz_asserts = { path = "mozglue/static/rust/moz_asserts" } @@ -260,14 +263,14 @@ malloc_size_of_derive = { path = "xpcom/rust/malloc_size_of_derive" } objc = { git = "https://github.com/glandium/rust-objc", rev = "4de89f5aa9851ceca4d40e7ac1e2759410c04324" } # application-services overrides to make updating them all simpler. -interrupt-support = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -relevancy = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -search = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -sql-support = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -suggest = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -sync15 = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -tabs = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -viaduct = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } -webext-storage = { git = "https://github.com/mozilla/application-services", rev = "e1b42aa3292a71e788bc0f95fb5ab5fbe533996f" } +interrupt-support = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +relevancy = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +search = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +sql-support = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +suggest = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +sync15 = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +tabs = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +viaduct = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } +webext-storage = { git = "https://github.com/mozilla/application-services", rev = "41e0b8f5679977ff2f551eb60fa9b3288ce1f2d8" } allocator-api2 = { path = "third_party/rust/allocator-api2" } diff --git a/accessible/interfaces/msaa/moz.build b/accessible/interfaces/msaa/moz.build index 7a1053317a3..e06651313ed 100644 --- a/accessible/interfaces/msaa/moz.build +++ b/accessible/interfaces/msaa/moz.build @@ -4,7 +4,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -GeckoSharedLibrary("AccessibleMarshal", linkage=None) +GeckoSharedLibrary("AccessibleMarshal") # Missing here, is the notion that changes to the idl files included by # ISimpleDOM.idl (e.g. ISimpleDOMNode.idl) should rebuild the outputs. diff --git a/accessible/mac/AccessibleWrap.mm b/accessible/mac/AccessibleWrap.mm index 801d41845de..44a6a9f83bc 100644 --- a/accessible/mac/AccessibleWrap.mm +++ b/accessible/mac/AccessibleWrap.mm @@ -307,6 +307,9 @@ Class a11y::GetTypeFromRole(roles::Role aRole) { case roles::OUTLINEITEM: return [mozOutlineRowAccessible class]; + case roles::LABEL: + return [MOXLabelAccessible class]; + default: return [mozAccessible class]; } diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm index bc4c329772b..95582b56746 100644 --- a/accessible/mac/mozAccessible.mm +++ b/accessible/mac/mozAccessible.mm @@ -887,22 +887,19 @@ struct RoleDescrComparator { : nullptr; if (maybeRoot && maybeRoot->IsRoot() && [[self moxDOMIdentifier] isEqualToString:@"a11y-announcement"]) { - // Our actual announcement should be stored as a child of the alert, - // so we verify a child exists, and then query that child below. - NSArray* children = [self moxChildren]; - MOZ_ASSERT([children count] == 1 && children[0], - "A11yUtil event received, but no announcement found?"); - - mozAccessible* announcement = children[0]; - NSString* key; - if ([announcement providesLabelNotTitle]) { - key = [announcement moxLabel]; + nsAutoString name; + // Our actual announcement should be stored as a child of the alert. + if (Accessible* announcement = mGeckoAccessible->FirstChild()) { + announcement->Name(name); } else { - key = [announcement moxTitle]; + MOZ_ASSERT_UNREACHABLE( + "A11yUtil event received, but no announcement found?"); } NSDictionary* info = @{ - NSAccessibilityAnnouncementKey : key ? key : @(""), + NSAccessibilityAnnouncementKey : name.IsEmpty() + ? @("") + : nsCocoaUtils::ToNSString(name), // High priority means VO will stop what it is currently speaking // to speak our announcement. NSAccessibilityPriorityKey : @(NSAccessibilityPriorityHigh) diff --git a/accessible/mac/mozHTMLAccessible.h b/accessible/mac/mozHTMLAccessible.h index 48fd4b0bdc4..02a55960dfb 100644 --- a/accessible/mac/mozHTMLAccessible.h +++ b/accessible/mac/mozHTMLAccessible.h @@ -42,3 +42,10 @@ - (NSString*)moxTitle; @end + +@interface MOXLabelAccessible : mozAccessible + +// override +- (NSString*)moxTitle; + +@end diff --git a/accessible/mac/mozHTMLAccessible.mm b/accessible/mac/mozHTMLAccessible.mm index 09680033419..feb2c5d6602 100644 --- a/accessible/mac/mozHTMLAccessible.mm +++ b/accessible/mac/mozHTMLAccessible.mm @@ -81,3 +81,11 @@ using namespace mozilla::a11y; } @end + +@implementation MOXLabelAccessible + +- (NSString*)moxTitle { + return @""; +} + +@end diff --git a/accessible/tests/browser/mac/browser.toml b/accessible/tests/browser/mac/browser.toml index ea670e1cc04..0ee0d980c6d 100644 --- a/accessible/tests/browser/mac/browser.toml +++ b/accessible/tests/browser/mac/browser.toml @@ -23,6 +23,7 @@ https_first_disabled = true ["browser_aria_controls_flowto.js"] ["browser_aria_current.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1802555 ["browser_aria_expanded.js"] diff --git a/accessible/tests/browser/mac/browser_label_title.js b/accessible/tests/browser/mac/browser_label_title.js index f5bdd393346..233b0befcf6 100644 --- a/accessible/tests/browser/mac/browser_label_title.js +++ b/accessible/tests/browser/mac/browser_label_title.js @@ -22,8 +22,8 @@ addAccessibleTask( let n1 = getNativeInterface(accDoc, "n1"); let n1Label = n1.getAttributeValue("AXTitleUIElement"); // XXX: In Safari the label is an AXText with an AXValue, - // here it is an AXGroup witth an AXTitle - is(n1Label.getAttributeValue("AXTitle"), "Label"); + // we emulate that so VoiceOver does not speak the label twice. + is(n1Label.getAttributeValue("AXTitle"), ""); let n2 = getNativeInterface(accDoc, "n2"); is(n2.getAttributeValue("AXDescription"), "Two Labels"); diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000000..e365a9a22b9 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,14 @@ +dnl +dnl Local autoconf macros used with mozilla +dnl The contents of this file are under the Public Domain. +dnl + +builtin(include, build/autoconf/hooks.m4)dnl +builtin(include, build/autoconf/config.status.m4)dnl +builtin(include, build/autoconf/altoptions.m4)dnl + +# Read the user's .mozconfig script. We can't do this in +# configure.in: autoconf puts the argument parsing code above anything +# expanded from configure.in, and we need to get the configure options +# from .mozconfig in place before that argument parsing code. +MOZ_READ_MOZCONFIG(.) diff --git a/browser/actors/AboutReaderParent.sys.mjs b/browser/actors/AboutReaderParent.sys.mjs index 16801ea514f..60ab6a19175 100644 --- a/browser/actors/AboutReaderParent.sys.mjs +++ b/browser/actors/AboutReaderParent.sys.mjs @@ -101,25 +101,13 @@ export class AboutReaderParent extends JSWindowActorParent { let preferredWidth = message.data.preferredWidth || 0; let uri = Services.io.newURI(message.data.url); - let result = await new Promise(resolve => { - lazy.PlacesUtils.favicons.getFaviconURLForPage( - uri, - iconUri => { - if (iconUri) { - resolve({ - url: message.data.url, - faviconUrl: iconUri.spec, - }); - } else { - resolve(null); - } - }, - preferredWidth - ); - }); + let result = await lazy.PlacesUtils.favicons.getFaviconForPage( + uri, + preferredWidth + ); this.callListeners(message); - return result; + return result && { url: uri.spec, faviconUrl: result.uri.spec }; } catch (ex) { console.error( "Error requesting favicon URL for about:reader content: ", diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 53753b23fe0..96cef75b077 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -908,9 +908,6 @@ pref("browser.spin_cursor_while_busy", false); // Enable display of contextual-password-manager option in browser sidebar pref("browser.contextual-password-manager.enabled", false); -// Add the "Passwords" tool to the sidebar if contextual-password-manager is enabled. -pref("sidebar.newTool.migration.passwords", '{ "visibilityPref": "browser.contextual-password-manager.enabled"}'); - // Enables the display of the Mozilla VPN banner in private browsing windows pref("browser.privatebrowsing.vpnpromourl", "https://vpn.mozilla.org/?utm_source=firefox-browser&utm_medium=firefox-%CHANNEL%-browser&utm_campaign=private-browsing-vpn-link"); diff --git a/browser/base/content/metrics.yaml b/browser/base/content/metrics.yaml index 90e5fb5adef..00ce7e426ac 100644 --- a/browser/base/content/metrics.yaml +++ b/browser/base/content/metrics.yaml @@ -10,94 +10,6 @@ $schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 $tags: - 'Firefox :: General' -privacy.sanitize: - dialog_open: - type: event - description: > - Dispatched when one of the sanitize dialogs opens - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: 140 - extra_keys: - context: - description: > - string representing which context the dialog was opened in, - one of ["browser", "clearSiteData", "clearHistory"] - type: string - clear: - type: event - description: > - Dispatched when the dialog is accepted (to clear) - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: 140 - extra_keys: - context: - description: > - string representing which context the dialog was opened in, - one of ["browser", "clearSiteData", "clearHistory"] - type: string - history_and_downloads: - description: true if browsing history and downloads is selected to be cleared - type: boolean - cookies_and_storage: - description: true if cookies and storage is selected to be cleared - type: boolean - cache: - description: true if cache is selected to be cleared - type: boolean - site_settings: - description: true if site settings is selected to be cleared - type: boolean - form_data: - description: true if form data is selected to be cleared - type: boolean - clearing_time_span_selected: - type: event - description: > - The time span range selected to sanitize - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: 140 - extra_keys: - time_span: - description: The timespan that was selected corresponding to one of Sanitizer.TIMESPAN_*'s value - - type: string - load_time: - type: timing_distribution - time_unit: millisecond - description: > - How much time was spent to open the dialog, including loading data sizes - bugs: - - https://bugzilla.mozilla.org/1856417 - - https://bugzilla.mozilla.org/1922608 - data_reviews: - - https://bugzilla.mozilla.org/show_bug.cgi?id=1856417#c4 - notification_emails: - - wwen@mozilla.com - - emz@mozilla.com - expires: - 140 - security.ui.protectionspopup: open_protections_popup: type: event diff --git a/browser/base/content/sanitizeDialog.js b/browser/base/content/sanitizeDialog.js index 93a419e0139..661bc9926c3 100644 --- a/browser/base/content/sanitizeDialog.js +++ b/browser/base/content/sanitizeDialog.js @@ -111,18 +111,8 @@ var gSanitizePromptDialog = { } if (!lazy.USE_OLD_DIALOG) { - // Begin collecting how long it takes to load from here - let timerId = Glean.privacySanitize.loadTime.start(); this._dataSizesUpdated = false; - this.dataSizesFinishedUpdatingPromise = this.getAndUpdateDataSizes() - .then(() => { - // We're done loading, stop telemetry here - Glean.privacySanitize.loadTime.stopAndAccumulate(timerId); - }) - .catch(() => { - // We're done loading, stop telemetry here - Glean.privacySanitize.loadTime.cancel(timerId); - }); + this.dataSizesFinishedUpdatingPromise = this.getAndUpdateDataSizes(); // this promise is still used in tests } let OKButton = this._dialog.getButton("accept"); @@ -191,10 +181,6 @@ var gSanitizePromptDialog = { if (this._inClearOnShutdownNewDialog) { this.updatePrefs(); } else { - if (!lazy.USE_OLD_DIALOG) { - this.reportTelemetry("clear"); - } - this.sanitize(e); } }); @@ -224,10 +210,6 @@ var gSanitizePromptDialog = { } else { this.warningBox.hidden = true; } - - if (!lazy.USE_OLD_DIALOG) { - this.reportTelemetry("open"); - } }, updateAcceptButtonState() { @@ -558,42 +540,6 @@ var gSanitizePromptDialog = { } return items; }, - - reportTelemetry(event) { - let contextOpenedIn; - if (this._inClearSiteDataNewDialog) { - contextOpenedIn = "clearSiteData"; - } else if (this._inBrowserWindow) { - contextOpenedIn = "browser"; - } else { - contextOpenedIn = "clearHistory"; - } - - // Report time span and clearing options after sanitize is clicked - if (event == "clear") { - Glean.privacySanitize.clearingTimeSpanSelected.record({ - time_span: this.selectedTimespan.toString(), - }); - - let selectedOptions = this.getItemsToClear(); - Glean.privacySanitize.clear.record({ - context: contextOpenedIn, - history_and_downloads: selectedOptions.includes( - "browsingHistoryAndDownloads" - ), - cookies_and_storage: selectedOptions.includes("cookiesAndStorage"), - cache: selectedOptions.includes("cache"), - site_settings: selectedOptions.includes("siteSettings"), - form_data: selectedOptions.includes("formdata"), - }); - } - // if the dialog was just opened, just report which context it was opened in - else { - Glean.privacySanitize.dialogOpen.record({ - context: contextOpenedIn, - }); - } - }, }; // We need to give the dialog an opportunity to set up the DOM diff --git a/browser/base/content/test/favicons/browser_favicon_nostore.js b/browser/base/content/test/favicons/browser_favicon_nostore.js index 24a54461c47..a26170ff2e8 100644 --- a/browser/base/content/test/favicons/browser_favicon_nostore.js +++ b/browser/base/content/test/favicons/browser_favicon_nostore.js @@ -31,17 +31,10 @@ add_task(async function browser_loader() { // Ensure the favicon has not been stored. /* eslint-disable mozilla/no-arbitrary-setTimeout */ await new Promise(resolve => setTimeout(resolve, 1000)); - await new Promise((resolve, reject) => { - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI(PAGE_URL), - foundIconURI => { - if (foundIconURI) { - reject(new Error("An icon has been stored " + foundIconURI.spec)); - } - resolve(); - } - ); - }); + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(PAGE_URL) + ); + Assert.ok(!favicon); BrowserTestUtils.removeTab(tab); }); @@ -68,17 +61,10 @@ async function later_addition(iconUrl) { // Ensure the favicon has not been stored. /* eslint-disable mozilla/no-arbitrary-setTimeout */ await new Promise(resolve => setTimeout(resolve, 1000)); - await new Promise((resolve, reject) => { - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI(PAGE_URL), - foundIconURI => { - if (foundIconURI) { - reject(new Error("An icon has been stored " + foundIconURI.spec)); - } - resolve(); - } - ); - }); + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(PAGE_URL) + ); + Assert.ok(!favicon); BrowserTestUtils.removeTab(tab); } @@ -127,13 +113,10 @@ add_task(async function root_icon_stored() { }, async function () { await TestUtils.waitForCondition(async () => { - let uri = await new Promise(resolve => - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI("http://www.nostore.com/page"), - resolve - ) + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI("http://www.nostore.com/page") ); - return uri?.spec == "http://www.nostore.com/favicon.ico"; + return favicon?.uri.spec == "http://www.nostore.com/favicon.ico"; }, "wait for the favicon to be stored"); Assert.ok(await noStorePromise, "Should have received no-store header"); } @@ -174,13 +157,10 @@ add_task(async function root_icon_after_pageshow_stored() { }, async function () { await TestUtils.waitForCondition(async () => { - let uri = await new Promise(resolve => - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI("http://rootafterpageshow.com/page"), - resolve - ) + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI("http://rootafterpageshow.com/page") ); - return uri?.spec == "http://rootafterpageshow.com/favicon.ico"; + return favicon?.uri.spec == "http://rootafterpageshow.com/favicon.ico"; }, "wait for the favicon to be stored"); } ); diff --git a/browser/base/content/test/favicons/browser_favicon_store.js b/browser/base/content/test/favicons/browser_favicon_store.js index a183effe1af..43500e0a69d 100644 --- a/browser/base/content/test/favicons/browser_favicon_store.js +++ b/browser/base/content/test/favicons/browser_favicon_store.js @@ -21,22 +21,14 @@ async function test_icon(pageUrl, iconUrl) { // Ensure the favicon has been stored. await storedIconPromise; - await new Promise((resolve, reject) => { - PlacesUtils.favicons.getFaviconURLForPage( - Services.io.newURI(pageUrl), - foundIconURI => { - if (foundIconURI) { - Assert.equal( - foundIconURI.spec, - iconUrl, - "Should have stored the expected icon." - ); - resolve(); - } - reject(); - } - ); - }); + let favicon = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(pageUrl) + ); + Assert.equal( + favicon.uri.spec, + iconUrl, + "Should have stored the expected icon." + ); }); } diff --git a/browser/base/content/test/performance/browser.toml b/browser/base/content/test/performance/browser.toml index c1db25d758b..d6d7e0cdd19 100644 --- a/browser/base/content/test/performance/browser.toml +++ b/browser/base/content/test/performance/browser.toml @@ -67,6 +67,9 @@ run-if = [ "debug", "nightly_build", # Requires StartupRecorder.sys.mjs, which isn't shipped everywhere by default ] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1889278 +] ["browser_tabclose.js"] skip-if = [ diff --git a/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js b/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js index 833a74294a1..7d0c8fde432 100644 --- a/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js +++ b/browser/base/content/test/sanitize/browser_sanitizeDialog_v2.js @@ -767,134 +767,6 @@ add_task(async function test_clear_on_shutdown() { await SiteDataTestUtils.clear(); }); -add_task(async function testEntryPointTelemetry() { - Services.fog.testResetFOG(); - - // Telemetry count we expect for each context - const EXPECTED_CONTEXT_COUNTS = { - browser: 3, - clearHistory: 2, - clearSiteData: 1, - }; - - for (let key in EXPECTED_CONTEXT_COUNTS) { - let count = 0; - - for (let i = 0; i < EXPECTED_CONTEXT_COUNTS[key]; i++) { - await performActionsOnDialog({ context: key }); - } - - let contextTelemetry = Glean.privacySanitize.dialogOpen.testGetValue(); - for (let object of contextTelemetry) { - if (object.extra.context == key) { - count += 1; - } - } - - is( - count, - EXPECTED_CONTEXT_COUNTS[key], - `There should be ${EXPECTED_CONTEXT_COUNTS[key]} opens from ${key} context` - ); - } -}); - -add_task(async function testTimespanTelemetry() { - Services.fog.testResetFOG(); - - // Expected timespan selections from telemetry - const EXPECTED_TIMESPANS = [ - Sanitizer.TIMESPAN_HOUR, - Sanitizer.TIMESPAN_2HOURS, - Sanitizer.TIMESPAN_4HOURS, - Sanitizer.TIMESPAN_EVERYTHING, - ]; - - for (let timespan of EXPECTED_TIMESPANS) { - await performActionsOnDialog({ timespan }); - } - - for (let index in EXPECTED_TIMESPANS) { - is( - Glean.privacySanitize.clearingTimeSpanSelected.testGetValue()[index].extra - .time_span, - EXPECTED_TIMESPANS[index].toString(), - `Selected timespan should be ${EXPECTED_TIMESPANS[index]}` - ); - } -}); - -add_task(async function testLoadtimeTelemetry() { - Services.fog.testResetFOG(); - - // loadtime metric is collected everytime that the dialog is opened - // expected number of times dialog will be opened for the test for each context - let EXPECTED_CONTEXT_COUNTS = { - browser: 2, - clearHistory: 3, - clearSiteData: 2, - }; - - // open dialog based on expected_context_counts - for (let context in EXPECTED_CONTEXT_COUNTS) { - for (let i = 0; i < EXPECTED_CONTEXT_COUNTS[context]; i++) { - await performActionsOnDialog({ context }); - } - } - - let loadTimeDistribution = Glean.privacySanitize.loadTime.testGetValue(); - - let expectedNumberOfCounts = Object.entries(EXPECTED_CONTEXT_COUNTS).reduce( - (acc, [, value]) => acc + value, - 0 - ); - // No guarantees from timers means no guarantees on buckets. - // But we can guarantee it's only two samples. - is( - Object.entries(loadTimeDistribution.values).reduce( - (acc, [, count]) => acc + count, - 0 - ), - expectedNumberOfCounts, - `Only ${expectedNumberOfCounts} buckets with samples` - ); -}); - -add_task(async function testClearingOptionsTelemetry() { - Services.fog.testResetFOG(); - - let expectedObject = { - context: "clearSiteData", - history_and_downloads: "true", - cookies_and_storage: "false", - cache: "true", - site_settings: "true", - form_data: "false", - }; - - await performActionsOnDialog({ - context: "clearSiteData", - browsingHistoryAndDownloads: true, - cookiesAndStorage: false, - cache: true, - siteSettings: true, - formData: false, - }); - - let telemetryObject = Glean.privacySanitize.clear.testGetValue(); - Assert.equal( - telemetryObject.length, - 1, - "There should be only 1 telemetry object recorded" - ); - - Assert.deepEqual( - expectedObject, - telemetryObject[0].extra, - `Expected ${telemetryObject} to be the same as ${expectedObject}` - ); -}); - add_task(async function testClearHistoryCheckboxStatesAfterMigration() { await SpecialPowers.pushPrefEnv({ set: [ diff --git a/browser/base/content/test/webrtc/browser.toml b/browser/base/content/test/webrtc/browser.toml index 452651da9a4..06a7fd94df6 100644 --- a/browser/base/content/test/webrtc/browser.toml +++ b/browser/base/content/test/webrtc/browser.toml @@ -18,6 +18,9 @@ prefs = [ ] ["browser_WebrtcGlobalInformation.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1961544 +] ["browser_device_controls_menus.js"] skip-if = [ diff --git a/browser/base/content/test/webrtc/gracePeriod/browser.toml b/browser/base/content/test/webrtc/gracePeriod/browser.toml index 88dd800314c..ff0bd3cb5e8 100644 --- a/browser/base/content/test/webrtc/gracePeriod/browser.toml +++ b/browser/base/content/test/webrtc/gracePeriod/browser.toml @@ -13,3 +13,4 @@ prefs = [ ] ["../browser_devices_get_user_media_grace.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # Bug 1961543 diff --git a/browser/base/content/webext-panels.xhtml b/browser/base/content/webext-panels.xhtml index fcbfc198d54..ca0cf1b1130 100644 --- a/browser/base/content/webext-panels.xhtml +++ b/browser/base/content/webext-panels.xhtml @@ -5,7 +5,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. - + { + e.preventDefault(); + lazy.SpecialMessageActions.handleAction( + { type: "OPEN_URL", data: { args: a.href, where: part.where } }, + browser + ); + }); - return docFragment; + if (part.string_id) { + const l10n = lazy.RemoteL10n.createElement(doc, "span", { + content: { + string_id: part.string_id, + ...(part.args && { args: part.args }), + }, + }); + a.appendChild(l10n); + } else { + a.textContent = part.raw || ""; + } + node = a; + } else if (part.string_id) { + node = lazy.RemoteL10n.createElement(doc, "span", { + content: { + string_id: part.string_id, + ...(part.args && { args: part.args }), + }, + }); + } else { + const text = part.raw !== null ? part.raw : String(part); + node = doc.createTextNode(text); + } + + frag.appendChild(node); + } + + return frag; } formatButtonConfig(button) { diff --git a/browser/components/asrouter/tests/browser/browser.toml b/browser/components/asrouter/tests/browser/browser.toml index 7ff3638523e..48267bd2989 100644 --- a/browser/components/asrouter/tests/browser/browser.toml +++ b/browser/components/asrouter/tests/browser/browser.toml @@ -48,6 +48,9 @@ skip-if = ["a11y_checks"] # Bug 1854515 and 1858041 to investigate intermittent ["browser_bookmarks_bar_button.js"] ["browser_feature_callout.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1796720 +] ["browser_feature_callout_in_chrome.js"] skip-if = [ diff --git a/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js b/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js index 374b21c2d80..07e6abad196 100644 --- a/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js +++ b/browser/components/asrouter/tests/browser/browser_asrouter_experimentsAPILoader.js @@ -201,7 +201,7 @@ add_task(async function test_loading_experimentsAPI() { // Fetch the new recipe from RS await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); @@ -219,7 +219,7 @@ add_task(async function test_loading_fxms_message_1_feature() { // Fetch the new recipe from RS await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "fxms-message-1" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "fxms-message-1" }), "ExperimentAPI should return an experiment" ); @@ -253,7 +253,7 @@ add_task(async function test_exposure_ping() { // Fetch the new recipe from RS await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); @@ -312,7 +312,7 @@ add_task(async function test_update_on_enrollments_changed() { await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); await enrollmentChanged; @@ -349,7 +349,7 @@ add_task(async function test_emptyMessage() { await setup(experiment); await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId: "cfr" }), + () => ExperimentAPI.getExperimentMetaData({ featureId: "cfr" }), "ExperimentAPI should return an experiment" ); @@ -404,7 +404,7 @@ add_task(async function test_multiMessageTreatment() { await setup(recipe); await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId }), + () => ExperimentAPI.getExperimentMetaData({ featureId }), "ExperimentAPI should return an experiment" ); diff --git a/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js b/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js index 9a8f555ebd8..e337e83f0b8 100644 --- a/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js +++ b/browser/components/asrouter/tests/browser/browser_asrouter_infobar.js @@ -252,3 +252,119 @@ add_task( ); } ); + +function getMeaningfulNodes(infobar) { + return [...infobar.notification.messageText.childNodes].filter( + n => + n.nodeType === Node.ELEMENT_NODE || + (n.nodeType === Node.TEXT_NODE && n.textContent.trim()) + ); +} + +async function showInfobar(text, box, browser) { + let msg = { + id: "Test Infobar", + content: { + text, + type: "global", + priority: box.PRIORITY_INFO_LOW, + buttons: [{ label: "Close", action: { type: "CANCEL" } }], + }, + }; + let stub = sinon.stub(); + let infobar = await InfoBar.showInfoBarMessage(browser, msg, stub); + return { infobar, stub }; +} + +add_task(async function test_formatMessageConfig_single_string() { + const win = BrowserWindowTracker.getTopWindow(); + const browser = win.gBrowser.selectedBrowser; + const box = win.gNotificationBox; + + let { infobar } = await showInfobar("Just a plain string", box, browser); + const nodes = getMeaningfulNodes(infobar); + + Assert.equal(nodes.length, 1, "One meaningful node for single string"); + Assert.equal(nodes[0].nodeType, Node.TEXT_NODE, "That node is a text node"); + Assert.equal(nodes[0].textContent.trim(), "Just a plain string"); + + infobar.notification.closeButton.click(); + await BrowserTestUtils.waitForCondition(() => !InfoBar._activeInfobar); +}); + +add_task(async function test_formatMessageConfig_array() { + const win = BrowserWindowTracker.getTopWindow(); + const browser = win.gBrowser.selectedBrowser; + const box = win.gNotificationBox; + + let parts = [ + "A", + { raw: "B" }, + { string_id: "launch-on-login-infobar-message" }, + { href: "https://x.test/", raw: "LINK" }, + "Z", + ]; + let { infobar } = await showInfobar(parts, box, browser); + const nodes = getMeaningfulNodes(infobar); + + Assert.equal(nodes.length, parts.length, "One node per array part"); + Assert.equal(nodes[0].textContent, "A", "Plain text"); + Assert.equal(nodes[1].textContent, "B", "Raw text"); + Assert.equal(nodes[2].localName, "remote-text", "L10n element"); + Assert.equal( + nodes[2].getAttribute("fluent-remote-id"), + "launch-on-login-infobar-message", + "Fluent ID" + ); + const [, , , a] = nodes; + Assert.equal(a.localName, "a", "It's a link"); + Assert.equal(a.getAttribute("href"), "https://x.test/", "hred preserved"); + Assert.equal(a.textContent, "LINK", "Link text"); + Assert.equal(nodes[4].textContent, "Z", "Trailing text"); + + infobar.notification.closeButton.click(); + await BrowserTestUtils.waitForCondition(() => !InfoBar._activeInfobar); +}); + +add_task(async function test_specialMessageAction_onLinkClick() { + const win = BrowserWindowTracker.getTopWindow(); + const browser = win.gBrowser.selectedBrowser; + const box = win.gNotificationBox; + + const { SpecialMessageActions } = ChromeUtils.importESModule( + "resource://messaging-system/lib/SpecialMessageActions.sys.mjs" + ); + let handleStub = sinon.stub(SpecialMessageActions, "handleAction"); + + const parts = [ + "Click ", + { raw: "here", href: "https://example.com/foo", where: "tab" }, + " to continue", + ]; + let { infobar } = await showInfobar(parts, box, browser); + + let link = infobar.notification.messageText.querySelector("a[href]"); + Assert.ok(link, "Found the link"); + EventUtils.synthesizeMouseAtCenter(link, {}, browser.ownerGlobal); + + Assert.equal(handleStub.callCount, 1, "handleAction was invoked once"); + let [actionArg, browserArg] = handleStub.firstCall.args; + Assert.deepEqual( + actionArg, + { + type: "OPEN_URL", + data: { args: "https://example.com/foo", where: "tab" }, + }, + "Passed correct action to handleAction" + ); + Assert.equal( + browserArg, + browser, + "Passed the selectedBrowser to handleAction" + ); + + infobar.notification.closeButton.click(); + await BrowserTestUtils.waitForCondition(() => !InfoBar._activeInfobar); + + handleStub.restore(); +}); diff --git a/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js b/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js index b350bedc913..a2e927a09a1 100644 --- a/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js +++ b/browser/components/asrouter/tests/browser/browser_trigger_messagesLoaded.js @@ -111,7 +111,7 @@ add_task(async function test_messagesLoaded_reach_experiment() { }); await RemoteSettingsExperimentLoader.updateRecipes(); await BrowserTestUtils.waitForCondition( - () => ExperimentAPI.getExperiment({ featureId }), + () => ExperimentAPI.getExperimentMetaData({ featureId }), "ExperimentAPI should return an experiment" ); diff --git a/browser/components/asrouter/tests/unit/ASRouter.test.js b/browser/components/asrouter/tests/unit/ASRouter.test.js index ce57f07b337..ad4306c9b29 100644 --- a/browser/components/asrouter/tests/unit/ASRouter.test.js +++ b/browser/components/asrouter/tests/unit/ASRouter.test.js @@ -276,15 +276,6 @@ describe("ASRouter", () => { active: true, branch: { slug: "experiment-branch-slug" }, }), - getExperiment: sandbox.stub().returns({ - branch: { - slug: "unit-slug", - feature: { - featureId: "foo", - value: { id: "test-message" }, - }, - }, - }), getAllBranches: sandbox.stub().resolves([]), ready: sandbox.stub().resolves(), }, @@ -2482,8 +2473,6 @@ describe("ASRouter", () => { featureIds: ["infobar"], }; - global.ExperimentAPI.getExperiment.returns(null); - const result = await MessageLoaderUtils.loadMessagesForProvider(args); assert.lengthOf(result.messages, 0); diff --git a/browser/components/asrouter/tests/unit/unit-entry.js b/browser/components/asrouter/tests/unit/unit-entry.js index a68e505ae37..ed845dd4435 100644 --- a/browser/components/asrouter/tests/unit/unit-entry.js +++ b/browser/components/asrouter/tests/unit/unit-entry.js @@ -516,7 +516,6 @@ const TEST_GLOBAL = { }, FX_MONITOR_OAUTH_CLIENT_ID: "fake_client_id", ExperimentAPI: { - getExperiment() {}, getExperimentMetaData() {}, getRolloutMetaData() {}, }, diff --git a/browser/components/attribution/metrics.yaml b/browser/components/attribution/metrics.yaml new file mode 100644 index 00000000000..13eb8d5edc9 --- /dev/null +++ b/browser/components/attribution/metrics.yaml @@ -0,0 +1,102 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Adding a new metric? We have docs for that! +# https://firefox-source-docs.mozilla.org/toolkit/components/glean/user/new_definitions_file.html + +--- +$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 +$tags: + - 'Toolkit :: Telemetry' + +glean.attribution: + ext: + type: object + lifetime: user + # Permit long description lines + # yamllint disable + description: | + Extended attribution information. + Mapped to client_info.attribution.ext in datasets. + * `experiment`: name/id of the enrolled funnel experiment + * `variation`: name/id of the variation cohort used in the enrolled funnel experiment + * `ua`: identifier derived from the user agent downloading the installer + e.g. chrome, Google Chrome 123 + * `dltoken`: Unique token created at Firefox download time. + e.g. c18f86a3-f228-4d98-91bb-f90135c0aa9c + * `msstoresignedin`: only present if the installation was done through the Microsoft Store, + and was able to retrieve the "campaign ID" it was first installed with. + This value is "true" if the user was signed into the Microsoft Store + when they first installed, and false otherwise. + * `dlsource`: identifier that indicate where installations of Firefox originate + # yamllint enable + bugs: + - https://bugzilla.mozilla.org/1955429 + data_reviews: + - https://bugzilla.mozilla.org/1955429 + notification_emails: + - chutten@mozilla.com + send_in_pings: + - metrics + - baseline + - events + expires: never + no_lint: + - BASELINE_PING + structure: + type: object + properties: + experiment: + type: string + variation: + type: string + ua: + type: string + dltoken: + type: string + msstoresignedin: + type: boolean + dlsource: + type: string + +glean.distribution: + ext: + type: object + lifetime: user + description: | + Extended distribution information. + Mapped to client_info.distribution.ext in datasets. + * `distributionVersion`: pref `distribution.version`, `null` on failure + * `partnerId`: pref `mozilla.partner.id`, `null` on failure + * `distributor`: pref `app.distributor`, `null` on failure + * `distributorChannel`: pref `app.distributor.channel`, `null` on failure + * `partnerNames`: list from prefs `app.partner.=` + bugs: + - https://bugzilla.mozilla.org/1955429 + data_reviews: + - https://bugzilla.mozilla.org/1955429 + notification_emails: + - chutten@mozilla.com + send_in_pings: + - metrics + - baseline + - events + expires: never + no_lint: + - BASELINE_PING + structure: + type: object + properties: + distributionVersion: + type: string + partnerId: + type: string + distributor: + type: string + distributorChannel: + type: string + partnerNames: + type: array + items: + type: string diff --git a/browser/components/contextualidentity/test/browser/browser.toml b/browser/components/contextualidentity/test/browser/browser.toml index e2c85b8378d..280e6a4dcc3 100644 --- a/browser/components/contextualidentity/test/browser/browser.toml +++ b/browser/components/contextualidentity/test/browser/browser.toml @@ -48,6 +48,7 @@ tags = "bleedover" skip-if = [ "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1775706 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1775706 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775706 ] ["browser_originattrs_reopenin.js"] diff --git a/browser/components/customizableui/test/browser.toml b/browser/components/customizableui/test/browser.toml index cd8ad41a75d..3639b5b526a 100644 --- a/browser/components/customizableui/test/browser.toml +++ b/browser/components/customizableui/test/browser.toml @@ -59,6 +59,9 @@ skip-if = ["os == 'linux' && os_version == '18.04' && processor == 'x86_64' && r ["browser_877447_skip_missing_ids.js"] ["browser_878452_drag_to_panel.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1961559 +] ["browser_884402_customize_from_overflow.js"] tags = "overflowable-toolbar" @@ -92,6 +95,7 @@ skip-if = ["os == 'linux'"] ["browser_918049_skipintoolbarset_dnd.js"] ["browser_923857_customize_mode_event_wrapping_during_reset.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt && socketprocess_networking"] # Bug 1961545 ["browser_927717_customize_drag_empty_toolbar.js"] @@ -160,6 +164,7 @@ tags = "overflowable-toolbar" ["browser_963639_customizing_attribute_non_customizable_toolbar.js"] ["browser_968565_insert_before_hidden_items.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1961547 ["browser_969427_recreate_destroyed_widget_after_reset.js"] @@ -373,5 +378,9 @@ skip-if = [ ["browser_vertical_tabs_customize_navbar.js"] ["browser_widget_animation.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1961548 ["browser_widget_recreate_events.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1961546 +] diff --git a/browser/components/enterprisepolicies/Policies.sys.mjs b/browser/components/enterprisepolicies/Policies.sys.mjs index 32b2f62180e..c3b2827ad09 100644 --- a/browser/components/enterprisepolicies/Policies.sys.mjs +++ b/browser/components/enterprisepolicies/Policies.sys.mjs @@ -2566,6 +2566,21 @@ export var Policies = { }, }, + SkipTermsOfUse: { + onBeforeAddons(manager, param) { + if (param) { + setAndLockPref( + "datareporting.policy.dataSubmissionPolicyAcceptedVersion", + 999 + ); + setAndLockPref( + "datareporting.policy.dataSubmissionPolicyNotifiedTime", + Date.now().toString() + ); + } + }, + }, + SSLVersionMax: { onBeforeAddons(manager, param) { let tlsVersion; @@ -2670,18 +2685,6 @@ export var Policies = { param.Locked ); } - if (param.SkipTermsOfUse) { - PoliciesUtils.setDefaultPref( - "datareporting.policy.dataSubmissionPolicyAcceptedVersion", - 999, - param.Locked - ); - PoliciesUtils.setDefaultPref( - "datareporting.policy.dataSubmissionPolicyNotifiedTime", - Date.now().toString(), - param.Locked - ); - } if ("MoreFromMozilla" in param) { PoliciesUtils.setDefaultPref( "browser.preferences.moreFromMozilla", diff --git a/browser/components/enterprisepolicies/schemas/policies-schema.json b/browser/components/enterprisepolicies/schemas/policies-schema.json index d01451d78b6..1de3e655d25 100644 --- a/browser/components/enterprisepolicies/schemas/policies-schema.json +++ b/browser/components/enterprisepolicies/schemas/policies-schema.json @@ -1498,6 +1498,10 @@ "type": "boolean" }, + "SkipTermsOfUse": { + "type": "boolean" + }, + "SSLVersionMax": { "type": "string", "enum": ["tls1", "tls1.1", "tls1.2", "tls1.3"] @@ -1550,9 +1554,6 @@ "SkipOnboarding": { "type": "boolean" }, - "SkipTermsOfUse": { - "type": "boolean" - }, "MoreFromMozilla": { "type": "boolean" }, diff --git a/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js b/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js index ddb7114adff..c109a130f28 100644 --- a/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js +++ b/browser/components/enterprisepolicies/tests/browser/browser_policy_bookmarks.js @@ -220,12 +220,9 @@ add_task(async function test_initial_bookmarks() { add_task(async function checkFavicon() { let bookmark1url = CURRENT_POLICY.policies.Bookmarks[0].URL; - let result = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage( - Services.io.newURI(bookmark1url), - (uri, _, data) => resolve({ uri, data }) - ); - }); + let result = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(bookmark1url) + ); is( result.uri.spec, @@ -235,7 +232,7 @@ add_task(async function checkFavicon() { // data is an array of octets, which will be a bit hard to compare against // FAVICON_DATA, which is base64 encoded. Checking the expected length should // be good indication that this is working properly. - is(result.data.length, 464, "Favicon data has the correct length"); + is(result.rawData.length, 464, "Favicon data has the correct length"); let faviconsExpiredNotification = TestUtils.topicObserved( "places-favicons-expired" @@ -247,15 +244,11 @@ add_task(async function checkFavicon() { add_task(async function checkNetworkFavicon() { let bookmarkURL = CURRENT_POLICY.policies.Bookmarks[1].URL; - let result = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage( - Services.io.newURI(bookmarkURL), - (uri, _, data) => resolve({ uri, data }) - ); - }); + let result = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(bookmarkURL) + ); - is(result.uri, null, "Favicon should not be loaded"); - is(result.data.length, 0, "Favicon data should be empty"); + is(result, null, "Favicon should not be loaded"); }); add_task(async function test_remove_Bookmark_2() { diff --git a/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js b/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js index 480d3b47404..42af361b329 100644 --- a/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js +++ b/browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js @@ -29,9 +29,7 @@ add_task(async function test_skip_terms_of_use_timestamp_set() { const startTime = Date.now(); await setupPolicyEngineWithJson({ policies: { - UserMessaging: { - SkipTermsOfUse: true, - }, + SkipTermsOfUse: true, }, }); const endTime = Date.now(); diff --git a/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js b/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js index 280207d7407..afdf3a89705 100644 --- a/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js +++ b/browser/components/enterprisepolicies/tests/xpcshell/test_simple_pref_policies.js @@ -691,34 +691,6 @@ const POLICIES_TESTS = [ }, }, - { - policies: { - UserMessaging: { - SkipTermsOfUse: false, - Locked: false, - }, - }, - unlockedPrefs: { - "datareporting.policy.dataSubmissionPolicyAcceptedVersion": 0, - "datareporting.policy.dataSubmissionPolicyNotifiedTime": "0", - }, - }, - - { - policies: { - UserMessaging: { - SkipTermsOfUse: true, - Locked: true, - }, - }, - lockedPrefs: { - "datareporting.policy.dataSubmissionPolicyAcceptedVersion": 999, - // "datareporting.policy.dataSubmissionPolicyNotifiedTime" is a string of - // the timestamp at which the policy was set, this is tested in - // browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js - }, - }, - { policies: { UserMessaging: { @@ -1199,6 +1171,19 @@ const POLICIES_TESTS = [ "dom.security.https_only_mode": true, }, }, + + // POLICY: SkipTermsOfUse + { + policies: { + SkipTermsOfUse: true, + }, + lockedPrefs: { + "datareporting.policy.dataSubmissionPolicyAcceptedVersion": 999, + // "datareporting.policy.dataSubmissionPolicyNotifiedTime" is a string of + // the timestamp at which the policy was set, this is tested in + // browser/components/enterprisepolicies/tests/browser/browser_policy_usermessaging.js + }, + }, ]; add_task(async function test_policy_simple_prefs() { diff --git a/browser/components/extensions/test/browser/browser.toml b/browser/components/extensions/test/browser/browser.toml index 3ad746835d0..a36f38c8f7f 100644 --- a/browser/components/extensions/test/browser/browser.toml +++ b/browser/components/extensions/test/browser/browser.toml @@ -114,6 +114,7 @@ https_first_disabled = true ["browser_ext_browsingData_history.js"] ["browser_ext_canOpenModalPicker.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1949651 ["browser_ext_chrome_settings_overrides_home.js"] @@ -279,6 +280,7 @@ https_first_disabled = true ["browser_ext_menus_refresh.js"] ["browser_ext_menus_replace_menu.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1775561 ["browser_ext_menus_replace_menu_context.js"] https_first_disabled = true @@ -319,6 +321,7 @@ skip-if = [ "os == 'linux' && os_version == '18.04' && !debug && verify", "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && !debug && verify", "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && !debug && verify", + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775565 ] ["browser_ext_optionsPage_activity.js"] @@ -335,6 +338,7 @@ skip-if = [ https_first_disabled = true ["browser_ext_originControls.js"] +# skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug TBD ["browser_ext_originControls_internals.js"] diff --git a/browser/components/genai/LinkPreview.sys.mjs b/browser/components/genai/LinkPreview.sys.mjs index 722af5f2e39..aa657794e46 100644 --- a/browser/components/genai/LinkPreview.sys.mjs +++ b/browser/components/genai/LinkPreview.sys.mjs @@ -209,9 +209,11 @@ export const LinkPreview = { // language or restricted. if ( pageData.article.textContent && - pageData.article.language && + pageData.article.detectedLanguage && (!lazy.allowedLanguages || - lazy.allowedLanguages.split(",").includes(pageData.article.language)) + lazy.allowedLanguages + .split(",") + .includes(pageData.article.detectedLanguage)) ) { this.generateKeyPoints(ogCard); } diff --git a/browser/components/genai/LinkPreviewChild.sys.mjs b/browser/components/genai/LinkPreviewChild.sys.mjs index b1ac6ef59c5..1e0b840c69b 100644 --- a/browser/components/genai/LinkPreviewChild.sys.mjs +++ b/browser/components/genai/LinkPreviewChild.sys.mjs @@ -283,7 +283,7 @@ export class LinkPreviewChild extends JSWindowActorChild { title, byline, content, - language, + detectedLanguage, length, siteName, excerpt, @@ -307,7 +307,7 @@ export class LinkPreviewChild extends JSWindowActorChild { title, byline, textContent, - language, + detectedLanguage, length, siteName, excerpt, diff --git a/browser/components/genai/content/link-preview-card.css b/browser/components/genai/content/link-preview-card.css index 129d80f9bd8..d2056972306 100644 --- a/browser/components/genai/content/link-preview-card.css +++ b/browser/components/genai/content/link-preview-card.css @@ -51,12 +51,25 @@ .ai-content { padding: var(--og-padding); - > h3 { + h3 { + align-items: center; + display: flex; font-size: var(--og-main-font-size); font-weight: var(--font-weight-bold); + gap: var(--space-xs); margin: 0; } + img.icon { + -moz-context-properties: fill; + fill: currentColor; + height: var(--icon-size-default); + margin-inline-start: var(--space-xlarge); + pointer-events: none; + width: var(--icon-size-default); + } + + > ul { font-size: var(--og-main-font-size); line-height: 1.15; /* Design requires 18px line-height */ @@ -72,8 +85,25 @@ } } + .visit-link-container { + align-items: center; + display: flex; + justify-content: flex-end; + margin-top: var(--space-xlarge); + + .visit-link { + align-items: center; + display: flex; + gap: var(--space-xs); + font-size: var(--og-main-font-size); + font-weight: var(--font-weight-bold); + } + } + > hr { border-color: var(--border-color-card); + margin-top: var(--space-xlarge); + margin-bottom: var(--space-xlarge); } > p { diff --git a/browser/components/genai/content/link-preview-card.mjs b/browser/components/genai/content/link-preview-card.mjs index 3dab540d53f..0feda7bc0a6 100644 --- a/browser/components/genai/content/link-preview-card.mjs +++ b/browser/components/genai/content/link-preview-card.mjs @@ -55,7 +55,9 @@ class LinkPreviewCard extends MozLitElement { handleLink(event) { event.preventDefault(); - const url = event.target.href; + const anchor = event.target.closest("a"); + const url = anchor.href; + const win = this.ownerGlobal; const params = { triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal( @@ -98,7 +100,8 @@ class LinkPreviewCard extends MozLitElement { render() { const articleData = this.pageData?.article || {}; const pageUrl = this.pageData?.url || "about:blank"; - const siteName = articleData.siteName || ""; + const siteName = + articleData.siteName || this.pageData?.urlComponents?.domain || ""; const { title, description, imageUrl } = this.pageData.meta; @@ -163,7 +166,15 @@ class LinkPreviewCard extends MozLitElement { ${this.generating || this.keyPoints.length ? html`
-

Key points

+

+ Key points + +

    ${ /* All populated content items */ @@ -193,6 +204,22 @@ class LinkPreviewCard extends MozLitElement { : [] }
+ ${this.progress >= 0 ? html`

@@ -212,15 +239,6 @@ class LinkPreviewCard extends MozLitElement { Share feedback

-

- - Visit original page - -

` : ""} diff --git a/browser/components/migration/tests/unit/head_migration.js b/browser/components/migration/tests/unit/head_migration.js index 9b056e66701..dbe62ee6405 100644 --- a/browser/components/migration/tests/unit/head_migration.js +++ b/browser/components/migration/tests/unit/head_migration.js @@ -88,22 +88,6 @@ async function promiseMigration( return Promise.all(promises); } -/** - * Function that returns a favicon url for a given page url - * - * @param {string} uri - * The Bookmark URI - * @returns {string} faviconURI - * The Favicon URI - */ -async function getFaviconForPageURI(uri) { - let faviconURI = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage(uri, favURI => { - resolve(favURI); - }); - }); - return faviconURI; -} /** * Takes an array of page URIs and checks that the favicon was imported for each page URI @@ -112,8 +96,8 @@ async function getFaviconForPageURI(uri) { */ async function assertFavicons(pageURIs) { for (let uri of pageURIs) { - let faviconURI = await getFaviconForPageURI(uri); - Assert.ok(faviconURI, `Got favicon for ${uri.spec}`); + let favicon = await PlacesUtils.favicons.getFaviconForPage(uri); + Assert.ok(favicon, `Got favicon for ${favicon.uri.spec}`); } } @@ -128,17 +112,12 @@ async function assertFavicons(pageURIs) { * Expected mime type of the favicon. */ async function assertFavicon(pageURI, expectedImageData, expectedMimeType) { - let result = await new Promise(resolve => { - PlacesUtils.favicons.getFaviconDataForPage( - Services.io.newURI(pageURI), - (faviconURI, dataLen, imageData, mimeType) => { - resolve({ faviconURI, dataLen, imageData, mimeType }); - } - ); - }); + let result = await PlacesUtils.favicons.getFaviconForPage( + Services.io.newURI(pageURI) + ); Assert.ok(!!result, `Got favicon for ${pageURI}`); Assert.equal( - result.imageData.join(","), + result.rawData.join(","), expectedImageData.join(","), "Image data is correct" ); diff --git a/browser/components/moz.build b/browser/components/moz.build index daac97c74ed..890a4b50e28 100644 --- a/browser/components/moz.build +++ b/browser/components/moz.build @@ -36,7 +36,6 @@ DIRS += [ "contentanalysis", "contextualidentity", "customizableui", - "doh", "downloads", "enterprisepolicies", "extensions", diff --git a/browser/components/places/tests/browser/browser.toml b/browser/components/places/tests/browser/browser.toml index 1592c4a6e42..0c35d32f597 100644 --- a/browser/components/places/tests/browser/browser.toml +++ b/browser/components/places/tests/browser/browser.toml @@ -89,6 +89,7 @@ support-files = ["bookmarklet_windowOpen_dummy.html"] ["browser_bookmarksProperties.js"] ["browser_bookmarks_change_title.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt"] # Bug 1961550 ["browser_bookmarks_change_url.js"] diff --git a/browser/components/places/tests/unit/test_browserGlue_distribution.js b/browser/components/places/tests/unit/test_browserGlue_distribution.js index 8beb942c26f..0ee2e4579d9 100644 --- a/browser/components/places/tests/unit/test_browserGlue_distribution.js +++ b/browser/components/places/tests/unit/test_browserGlue_distribution.js @@ -89,17 +89,8 @@ add_task(async function () { Assert.equal(menuItem.title, "Menu Link After"); // Check no favicon exists for this bookmark - await Assert.rejects( - waitForResolvedPromise( - () => { - return PlacesUtils.promiseFaviconData(menuItem.url.href); - }, - "Favicon not found", - 10 - ), - /Favicon\snot\sfound/, - "Favicon not found" - ); + let favicon = await PlacesUtils.favicons.getFaviconForPage(menuItem.url.URI); + Assert.equal(favicon, null, "Favicon should not be found"); // Check the custom bookmarks exist on toolbar. let toolbarItem = await PlacesUtils.bookmarks.fetch({ @@ -109,21 +100,12 @@ add_task(async function () { Assert.equal(toolbarItem.title, "Toolbar Link Before"); // Check the custom favicon exist for this bookmark - let faviconItem = await waitForResolvedPromise( - () => { - return PlacesUtils.promiseFaviconData(toolbarItem.url.href); - }, - "Favicon not found", - 10 - ); - Assert.equal(faviconItem.uri.spec, "https://example.org/favicon.png"); - Assert.greater(faviconItem.dataLen, 0); - Assert.equal(faviconItem.mimeType, "image/png"); - - let base64Icon = - "data:image/png;base64," + - base64EncodeString(String.fromCharCode.apply(String, faviconItem.data)); - Assert.equal(base64Icon, SMALLPNG_DATA_URI.spec); + favicon = await PlacesUtils.favicons.getFaviconForPage(toolbarItem.url.URI); + Assert.ok(favicon, "Favicon should be found"); + Assert.equal(favicon.uri.spec, "https://example.org/favicon.png"); + Assert.greater(favicon.rawData.length, 0); + Assert.equal(favicon.mimeType, "image/png"); + Assert.equal(favicon.dataURI.spec, SMALLPNG_DATA_URI.spec); toolbarItem = await PlacesUtils.bookmarks.fetch({ parentGuid: PlacesUtils.bookmarks.toolbarGuid, diff --git a/browser/components/pocket/test/browser.toml b/browser/components/pocket/test/browser.toml index 0fc4533e2d3..4c478bf14c5 100644 --- a/browser/components/pocket/test/browser.toml +++ b/browser/components/pocket/test/browser.toml @@ -13,6 +13,7 @@ support-files = [ ["browser_pocket_panel.js"] skip-if = [ "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1781272 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1781272 ] ["browser_pocket_panel_closemenu.js"] diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js index 0c810679331..ceea471c9d9 100644 --- a/browser/components/preferences/privacy.js +++ b/browser/components/preferences/privacy.js @@ -77,7 +77,7 @@ XPCOMUtils.defineLazyPreferenceGetter( ); ChromeUtils.defineESModuleGetters(this, { - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", Sanitizer: "resource:///modules/Sanitizer.sys.mjs", SelectableProfileService: "resource:///modules/profiles/SelectableProfileService.sys.mjs", diff --git a/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js b/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js index 1498541fbd1..8d20a4eaf0c 100644 --- a/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js +++ b/browser/components/preferences/tests/browser_privacy_dnsoverhttps.js @@ -11,14 +11,17 @@ const { EnterprisePolicyTesting, PoliciesPrefTracker } = ); ChromeUtils.defineESModuleGetters(this, { - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", - DoHController: "resource:///modules/DoHController.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", + DoHController: "resource://gre/modules/DoHController.sys.mjs", DoHTestUtils: "resource://testing-common/DoHTestUtils.sys.mjs", }); const { MockRegistrar } = ChromeUtils.importESModule( "resource://testing-common/MockRegistrar.sys.mjs" ); +const gDNSOverride = Cc[ + "@mozilla.org/network/native-dns-override;1" +].getService(Ci.nsINativeDNSResolverOverride); const TRR_MODE_PREF = "network.trr.mode"; const TRR_URI_PREF = "network.trr.uri"; @@ -40,9 +43,7 @@ const defaultPrefValues = Object.freeze({ // is in progress, before we've actually disabled TRR, and would cause a crash // due to connecting to a non-local IP. // To prevent that we override the IP to a local address. -Cc["@mozilla.org/network/native-dns-override;1"] - .getService(Ci.nsINativeDNSResolverOverride) - .addIPOverride("mozilla.cloudflare-dns.com", "127.0.0.1"); +gDNSOverride.addIPOverride("mozilla.cloudflare-dns.com", "127.0.0.1"); async function clearEvents() { Services.telemetry.clearEvents(); @@ -67,6 +68,17 @@ async function getEvent(filter1, filter2) { return event; } +// Mock parental controls service in order to enable it +let parentalControlsService = { + parentalControlsEnabled: true, + QueryInterface: ChromeUtils.generateQI(["nsIParentalControlsService"]), +}; +let mockParentalControlsServiceCid = undefined; + +async function setMockParentalControlEnabled(aEnabled) { + parentalControlsService.parentalControlsEnabled = aEnabled; +} + async function resetPrefs() { await DoHTestUtils.resetRemoteSettingsConfig(); await DoHController._uninit(); @@ -86,14 +98,30 @@ Services.prefs.setStringPref("network.trr.confirmationNS", "skip"); registerCleanupFunction(async () => { await resetPrefs(); Services.prefs.clearUserPref("network.trr.confirmationNS"); + + if (mockParentalControlsServiceCid != undefined) { + MockRegistrar.unregister(mockParentalControlsServiceCid); + mockParentalControlsServiceCid = undefined; + Services.dns.reloadParentalControlEnabled(); + } }); add_setup(async function setup() { + mockParentalControlsServiceCid = MockRegistrar.register( + "@mozilla.org/parental-controls-service;1", + parentalControlsService + ); + Services.dns.reloadParentalControlEnabled(); + await SpecialPowers.pushPrefEnv({ set: [["toolkit.telemetry.testing.overrideProductsCheck", true]], }); await DoHTestUtils.resetRemoteSettingsConfig(); + + gDNSOverride.addIPOverride("use-application-dns.net.", "4.1.1.1"); + + setMockParentalControlEnabled(false); }); function waitForPrefObserver(name) { @@ -110,27 +138,6 @@ function waitForPrefObserver(name) { }); } -// Mock parental controls service in order to enable it -let parentalControlsService = { - parentalControlsEnabled: true, - QueryInterface: ChromeUtils.generateQI(["nsIParentalControlsService"]), -}; -let mockParentalControlsServiceCid = undefined; - -async function setMockParentalControlEnabled(aEnabled) { - if (mockParentalControlsServiceCid != undefined) { - MockRegistrar.unregister(mockParentalControlsServiceCid); - mockParentalControlsServiceCid = undefined; - } - if (aEnabled) { - mockParentalControlsServiceCid = MockRegistrar.register( - "@mozilla.org/parental-controls-service;1", - parentalControlsService - ); - } - Services.dns.reloadParentalControlEnabled(); -} - add_task(async function testParentalControls() { async function withConfiguration(configuration, fn) { info("testParentalControls"); @@ -505,6 +512,10 @@ async function testWithProperties(props, startTime) { is(modeValue, props.expectedModeValue, "mode pref has expected value"); } + if (props.hasOwnProperty(ROLLOUT_ENABLED_PREF)) { + Services.prefs.clearUserPref(ROLLOUT_ENABLED_PREF); + } + gBrowser.removeCurrentTab(); info(Date.now() - startTime + ": testWithProperties: fin"); } @@ -846,7 +857,8 @@ add_task(async function testRemoteSettingsEnable() { let status = doc.getElementById("dohStatus"); await TestUtils.waitForCondition( - () => document.l10n.getAttributes(status).args.status == "Active" + () => document.l10n.getAttributes(status).args.status == "Active", + "Waiting for remote settings to be processed" ); is( document.l10n.getAttributes(status).args.status, @@ -863,7 +875,8 @@ add_task(async function testRemoteSettingsEnable() { await TestUtils.waitForCondition( () => document.l10n.getAttributes(provider).args.name == - DoHConfigController.currentConfig.providerList[0].UIName + DoHConfigController.currentConfig.providerList[0].UIName, + "waiting for correct UI name" ); is( document.l10n.getAttributes(provider).args.name, @@ -876,14 +889,16 @@ add_task(async function testRemoteSettingsEnable() { let win = doc.ownerGlobal; EventUtils.synthesizeMouseAtCenter(option, {}, win); - await TestUtils.waitForCondition(() => - Services.prefs.prefHasUserValue("doh-rollout.disable-heuristics") + await TestUtils.waitForCondition( + () => Services.prefs.prefHasUserValue("doh-rollout.disable-heuristics"), + "Waiting for disable-heuristics" ); is(provider.hidden, false); await TestUtils.waitForCondition( () => document.l10n.getAttributes(provider).args.name == - DoHConfigController.currentConfig.providerList[0].UIName + DoHConfigController.currentConfig.providerList[0].UIName, + "waiting for correct UI name" ); is( document.l10n.getAttributes(provider).args.name, @@ -899,7 +914,10 @@ add_task(async function testRemoteSettingsEnable() { option.scrollIntoView(); win = doc.ownerGlobal; EventUtils.synthesizeMouseAtCenter(option, {}, win); - await TestUtils.waitForCondition(() => status.innerHTML == "Status: Off"); + await TestUtils.waitForCondition( + () => status.innerHTML == "Status: Off", + "Waiting for Status OFF" + ); is( Services.prefs.getIntPref("network.trr.mode"), Ci.nsIDNSService.MODE_TRROFF @@ -907,6 +925,16 @@ add_task(async function testRemoteSettingsEnable() { is(provider.hidden, true, "Expecting provider to be hidden when DoH is off"); gBrowser.removeCurrentTab(); + + await DoHTestUtils.loadRemoteSettingsConfig({ + providers: "", + rolloutEnabled: false, + steeringEnabled: false, + steeringProviders: "", + autoDefaultEnabled: false, + autoDefaultProviders: "", + id: "global", + }); }); add_task(async function testEnterprisePolicy() { @@ -931,6 +959,8 @@ add_task(async function testEnterprisePolicy() { }); gBrowser.removeCurrentTab(); + // Set an empty policy before stopping the policy tracker + await EnterprisePolicyTesting.setupPolicyEngineWithJson({}); EnterprisePolicyTesting.resetRunOnceState(); PoliciesPrefTracker.stop(); } diff --git a/browser/components/profiles/tests/browser/browser.toml b/browser/components/profiles/tests/browser/browser.toml index 51e66750050..e22ff85355a 100644 --- a/browser/components/profiles/tests/browser/browser.toml +++ b/browser/components/profiles/tests/browser/browser.toml @@ -34,6 +34,7 @@ head = "../unit/head.js head.js" ["browser_notify_changes.js"] run-if = ["os != 'linux'"] # Linux clients cannot remote themselves. +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt && !socketprocess_networking"] # Bug 1929273 ["browser_preferences.js"] fail-if = ["a11y_checks"] # Bug 1955503 @@ -42,12 +43,13 @@ fail-if = ["a11y_checks"] # Bug 1955503 ["browser_test_last_tab.js"] skip-if = [ - "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1950795 - "os == 'win' && os_version == '11.26100' && debug", # Bug 1950795 - "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1950795 - "os == 'mac' && os_version == '10.15' && processor == 'x86_64'", # Bug 1950795 "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && socketprocess_networking", # Bug 1950795 "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && swgl", # Bug 1950795 + "os == 'mac' && os_version == '10.15' && processor == 'x86_64'", # Bug 1950795 + "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1950795 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1950795 + "os == 'win' && os_version == '11.26100' && debug", # Bug 1950795 + "os == 'win' && os_version == '11.26100' && processor == 'x86_64' && asan", # Bug 1950795 ] ["browser_test_nimbus_feature.js"] @@ -58,6 +60,7 @@ skip-if = [ skip-if = [ "os == 'win' && os_version == '11.26100' && opt", # Bug 1948374 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1948374 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1948374 "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1948374 "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt", # Bug 1948374 ] diff --git a/browser/components/search/BrowserSearchTelemetry.sys.mjs b/browser/components/search/BrowserSearchTelemetry.sys.mjs index 91dbd046289..a966b6eb473 100644 --- a/browser/components/search/BrowserSearchTelemetry.sys.mjs +++ b/browser/components/search/BrowserSearchTelemetry.sys.mjs @@ -55,7 +55,7 @@ class BrowserSearchTelemetryHandler { * Determines if we should record a search for this browser instance. * Private Browsing mode is normally skipped. * - * @param {browser} browser + * @param {XULBrowserElement} browser * The browser where the search was loaded. * @returns {boolean} * True if the search should be recorded, false otherwise. @@ -127,7 +127,7 @@ class BrowserSearchTelemetryHandler { * Telemetry records only search counts per engine and action origin, but * nothing pertaining to the search contents themselves. * - * @param {browser} browser + * @param {XULBrowserElement} browser * The browser where the search originated. * @param {nsISearchEngine} engine * The engine handling the search. @@ -232,11 +232,27 @@ class BrowserSearchTelemetryHandler { } } + /** + * Records visits to a search engine's search form. + * + * @param {nsISearchEngine} engine + * The engine whose search form is being visited. + * @param {string} source + * Where the search form was opened from. + * This can be "urlbar" or "searchbar". + */ + recordSearchForm(engine, source) { + Glean.sap.searchFormCounts.record({ + source, + provider_id: engine.isAppProvided ? engine.id : "other", + }); + } + /** * This function handles the "urlbar", "urlbar-oneoff", "searchbar" and * "searchbar-oneoff" sources. * - * @param {browser} browser + * @param {XULBrowserElement} browser * The browser where the search originated. * @param {nsISearchEngine} engine * The engine handling the search. diff --git a/browser/components/search/content/searchbar.js b/browser/components/search/content/searchbar.js index 2ba9571364d..5c2fda929cd 100644 --- a/browser/components/search/content/searchbar.js +++ b/browser/components/search/content/searchbar.js @@ -388,13 +388,6 @@ this.telemetrySelectedIndex = -1; - lazy.BrowserSearchTelemetry.recordSearch( - gBrowser.selectedBrowser, - engine, - "searchbar", - details - ); - // Record when the user uses the search bar Services.prefs.setStringPref( "browser.search.widget.lastUsed", @@ -413,6 +406,28 @@ params[key] = aParams[key]; } } + + if (aWhere == "tab") { + gBrowser.tabContainer.addEventListener( + "TabOpen", + event => + lazy.BrowserSearchTelemetry.recordSearch( + event.target.linkedBrowser, + engine, + "searchbar", + details + ), + { once: true } + ); + } else { + lazy.BrowserSearchTelemetry.recordSearch( + gBrowser.selectedBrowser, + engine, + "searchbar", + details + ); + } + openTrustedLinkIn(submission.uri.spec, aWhere, params); } @@ -504,6 +519,7 @@ this._needBrowserFocusAtEnterKeyUp = true; } + lazy.BrowserSearchTelemetry.recordSearchForm(engine, "searchbar"); openTrustedLinkIn(searchForm, where, params); } diff --git a/browser/components/search/metrics.yaml b/browser/components/search/metrics.yaml index 38244ac9596..5b73bed8d9d 100644 --- a/browser/components/search/metrics.yaml +++ b/browser/components/search/metrics.yaml @@ -217,6 +217,34 @@ sap: expires: never telemetry_mirror: h#SEARCH_COUNTS + search_form_counts: + type: event + description: > + Records how often users visit the homepages of search engines (also + known as SearchForm) using a SAP. It only counts how many visits were + initiated, not how many homepages were loaded successfully. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1915252 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1915252 + data_sensitivity: + - interaction + notification_emails: + - fx-search-telemetry@mozilla.com + expires: never + extra_keys: + source: + description: > + The search access point from which the user initiated the search. + Possible values are `searchbar` and `urlbar`. + type: string + provider_id: + description: > + The identifier of the search engine provider that is being used for the + search. Note this may be different to the identifier of the provider in + SERP reports. For user installed engines, this will be the string `other`. + type: string + serp: impression: type: event diff --git a/browser/components/search/test/browser/telemetry/browser.toml b/browser/components/search/test/browser/telemetry/browser.toml index 3b908349894..624d405cd72 100644 --- a/browser/components/search/test/browser/telemetry/browser.toml +++ b/browser/components/search/test/browser/telemetry/browser.toml @@ -184,6 +184,8 @@ support-files = [ "telemetrySearchSuggestions.xml", ] +["browser_search_telemetry_searchform.js"] + ["browser_search_telemetry_shopping.js"] support-files = ["searchTelemetryAd_shopping.html"] diff --git a/browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js b/browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js new file mode 100644 index 00000000000..02cac2662c9 --- /dev/null +++ b/browser/components/search/test/browser/telemetry/browser_search_telemetry_searchform.js @@ -0,0 +1,164 @@ +/* Any copyright is dedicated to the Public Domain. + https://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const CONFIG = [ + { + identifier: "defaultEngine", + }, + { + identifier: "second_engine", + base: { + name: "Second Engine", + urls: { + search_form: { + base: "https://www.example.com/searchform", + }, + }, + }, + }, +]; +const TEST_ENGINE_BASENAME = "testEngine.xml"; +const TEST_ENGINE_NAME = "Foo"; + +function findOneOff(engineName) { + let oneOffButtons = document.getElementById("PopupSearchAutoComplete") + .oneOffButtons.buttons; + let oneOffChildren = [...oneOffButtons.children]; + let oneOffButton = oneOffChildren.find( + node => node.engine?.name == engineName + ); + Assert.notEqual( + oneOffButton, + undefined, + `One-off for ${engineName} should exist` + ); + return oneOffButton; +} + +async function openSearchbarPopup(searchBarValue) { + let searchBar = document.getElementById("searchbar"); + + searchBar.focus(); + searchBar.value = searchBarValue; + if (searchBar.textbox.popupOpen) { + info("searchPanel is already open"); + return; + } + let searchPopup = document.getElementById("PopupSearchAutoComplete"); + let shownPromise = BrowserTestUtils.waitForEvent(searchPopup, "popupshown"); + + let searchIcon = searchBar.querySelector(".searchbar-search-button"); + let oneOffInstance = searchPopup.oneOffButtons; + let builtPromise = BrowserTestUtils.waitForEvent(oneOffInstance, "rebuild"); + + info("Opening search panel"); + EventUtils.synthesizeMouseAtCenter(searchIcon, {}); + await Promise.all([shownPromise, builtPromise]); +} + +add_setup(async function () { + await SearchTestUtils.updateRemoteSettingsConfig(CONFIG); + await SearchTestUtils.installOpenSearchEngine({ + url: getRootDirectory(gTestPath) + "../" + TEST_ENGINE_BASENAME, + }); + await gCUITestUtils.addSearchBar(); + + registerCleanupFunction(async () => { + gCUITestUtils.removeSearchBar(); + resetTelemetry(); + }); +}); + +add_task(async function test_appProvidedSearchbar() { + await openSearchbarPopup(""); + let oneOff = findOneOff("Second Engine"); + EventUtils.synthesizeMouseAtCenter(oneOff, { shiftKey: true }); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded."); + Assert.equal(events[0].extra.source, "searchbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "second_engine", "Id is correct"); + resetTelemetry(); +}); + +add_task(async function test_extensionSearchbar() { + await openSearchbarPopup(""); + let oneOff = findOneOff(TEST_ENGINE_NAME); + EventUtils.synthesizeMouseAtCenter(oneOff, { shiftKey: true }); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded"); + Assert.equal(events[0].extra.source, "searchbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "other", "Id is correct"); + resetTelemetry(); +}); + +add_task(async function test_actualSearchSearchbar() { + // Enter something in the searchbar to start an actual search. + await openSearchbarPopup("foo"); + let oneOff = findOneOff("Second Engine"); + EventUtils.synthesizeMouseAtCenter(oneOff, { shiftKey: true }); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + // Since we used the one off button to search (not to open the search form), + // no event should be recorded in `sap.searchFormCounts`. + Assert.equal(events, null, "No search form event is recorded for searches"); + resetTelemetry(); +}); + +add_task(async function test_appProvidedUrlbar() { + let popup = await UrlbarTestUtils.openSearchModeSwitcher(window); + info("Choose Second Engine in the unified search button popup."); + let item = popup.querySelector('menuitem[label="Second Engine"]'); + let popupHidden = UrlbarTestUtils.searchModeSwitcherPopupClosed(window); + EventUtils.synthesizeMouseAtCenter(item, { shiftKey: true }); + await popupHidden; + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded"); + Assert.equal(events[0].extra.source, "urlbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "second_engine", "Id is correct"); + resetTelemetry(); +}); + +add_task(async function test_extensionUrlbar() { + let popup = await UrlbarTestUtils.openSearchModeSwitcher(window); + info("Choose extension engine in the unified search button popup."); + let item = popup.querySelector(`menuitem[label="${TEST_ENGINE_NAME}"]`); + let popupHidden = UrlbarTestUtils.searchModeSwitcherPopupClosed(window); + EventUtils.synthesizeMouseAtCenter(item, { shiftKey: true }); + await popupHidden; + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + Assert.equal(events.length, 1, "Event was recorded"); + Assert.equal(events[0].extra.source, "urlbar", "Source is correct"); + Assert.equal(events[0].extra.provider_id, "other"); + resetTelemetry(); +}); + +add_task(async function test_actualSearchUrlbar() { + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "foo", + }); + let popup = await UrlbarTestUtils.openSearchModeSwitcher(window); + info("Shift-click Second Engine in the unified search button popup."); + let item = popup.querySelector('menuitem[label="Second Engine"]'); + let popupHidden = UrlbarTestUtils.searchModeSwitcherPopupClosed(window); + EventUtils.synthesizeMouseAtCenter(item, { shiftKey: true }); + await popupHidden; + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + let events = Glean.sap.searchFormCounts.testGetValue(); + // Since we used the unified search button to search (not to open the search + // form), no event should be recorded in `sap.searchFormCounts`. + Assert.equal(events, null, "No search form event was recorded"); + resetTelemetry(); +}); diff --git a/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js b/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js index 4295d2019c4..33ea4446fc0 100644 --- a/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js +++ b/browser/components/search/test/browser/telemetry/browser_search_telemetry_sources.js @@ -37,7 +37,7 @@ const TEST_PROVIDER_INFO = [ /** * Returns the index of the first search suggestion in the urlbar results. * - * @returns {number} An index, or -1 if there are no search suggestions. + * @returns {Promise} An index, or -1 if there are no search suggestions. */ async function getFirstSuggestionIndex() { const matchCount = UrlbarTestUtils.getResultCount(window); @@ -80,6 +80,7 @@ add_setup(async function () { suggest_url: "https://example.org/browser/browser/components/search/test/browser/searchSuggestionEngine.sjs", suggest_url_get_params: "query={searchTerms}", + name: "Example", }, { setAsDefault: true } ); @@ -203,6 +204,77 @@ add_task(async function test_source_urlbar() { ); }); +add_task(async function test_source_urlbar_newtab() { + let tab; + await track_ad_click( + "urlbar", + "urlbar", + async () => { + // Load a page because alt doesn't open new tabs on about:newtab. + BrowserTestUtils.startLoadingURIString( + gBrowser.selectedBrowser, + "https://example.com" + ); + await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); + + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "searchSuggestion", + }); + let idx = await getFirstSuggestionIndex(); + Assert.greaterOrEqual(idx, 0, "there should be a first suggestion"); + while (idx--) { + EventUtils.sendKey("down"); + } + + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser); + EventUtils.synthesizeKey("VK_RETURN", { altKey: true }); + tab = await newTabPromise; + return tab; + }, + async () => { + BrowserTestUtils.removeTab(tab); + } + ); +}); + +add_task(async function test_source_urlbar_oneoffs_newtab() { + // Enable legacy one off buttons. + await SpecialPowers.pushPrefEnv({ + set: [["browser.urlbar.scotchBonnet.enableOverride", false]], + }); + let tab; + await track_ad_click( + "urlbar", + "urlbar", + async () => { + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "searchSuggestion", + }); + + let oneOffs = + UrlbarTestUtils.getOneOffSearchButtons(window).getSelectableButtons( + true + ); + + let engines = await Services.search.getEngines(); + let index = engines.findIndex(e => e.name == "Example"); + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser); + EventUtils.synthesizeMouseAtCenter(oneOffs[index], { + accelKey: true, + shiftKey: true, + }); + tab = await newTabPromise; + return tab; + }, + async () => { + BrowserTestUtils.removeTab(tab); + } + ); + await SpecialPowers.popPrefEnv(); +}); + add_task(async function test_source_urlbar_handoff() { let tab; await track_ad_click( @@ -324,6 +396,38 @@ add_task(async function test_source_searchbar() { ); }); +add_task(async function test_source_searchbar_newtab() { + let tab; + await track_ad_click( + "searchbar", + "searchbar", + async () => { + let sb = document.getElementById("searchbar"); + // Write the search query in the searchbar. + sb.focus(); + sb.value = "searchSuggestion"; + sb.textbox.controller.startSearch("searchSuggestion"); + // Wait for the popup to show. + await BrowserTestUtils.waitForEvent(sb.textbox.popup, "popupshown"); + // And then for the search to complete. + await BrowserTestUtils.waitForCondition( + () => + sb.textbox.controller.searchStatus >= + Ci.nsIAutoCompleteController.STATUS_COMPLETE_NO_MATCH, + "The search in the searchbar must complete." + ); + + let newTabPromise = BrowserTestUtils.waitForNewTab(gBrowser); + EventUtils.synthesizeKey("VK_RETURN", { altKey: true }); + tab = await newTabPromise; + return tab; + }, + async () => { + BrowserTestUtils.removeTab(tab); + } + ); +}); + add_task(async function test_source_system() { let tab; await track_ad_click( diff --git a/browser/components/sessionstore/test/browser.toml b/browser/components/sessionstore/test/browser.toml index b64dcad541e..a40f1a6d099 100644 --- a/browser/components/sessionstore/test/browser.toml +++ b/browser/components/sessionstore/test/browser.toml @@ -247,8 +247,8 @@ skip-if = ["true"] # Bug 1646894 ["browser_restoreLastClosedTabOrWindowOrSession.js"] skip-if = [ "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1838996 - "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && asan", # Bug 1838996 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1838996 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1838996 ] ["browser_restoreTabContainer.js"] diff --git a/browser/components/sessionstore/test/browser_oldformat.toml b/browser/components/sessionstore/test/browser_oldformat.toml index 147ab7be751..48d97885529 100644 --- a/browser/components/sessionstore/test/browser_oldformat.toml +++ b/browser/components/sessionstore/test/browser_oldformat.toml @@ -204,6 +204,7 @@ https_first_disabled = true ["browser_590268.js"] ["browser_590563.js"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64'"] ["browser_595601-restore_hidden.js"] diff --git a/browser/components/shell/nsGNOMEShellSearchProvider.cpp b/browser/components/shell/nsGNOMEShellSearchProvider.cpp index 64d3d888ce8..1b721ecaa55 100644 --- a/browser/components/shell/nsGNOMEShellSearchProvider.cpp +++ b/browser/components/shell/nsGNOMEShellSearchProvider.cpp @@ -8,7 +8,6 @@ #include "nsGNOMEShellSearchProvider.h" #include "nsToolkitCompsCID.h" -#include "nsIFaviconService.h" #include "base/message_loop.h" // for MessageLoop #include "base/task.h" // for NewRunnableMethod, etc #include "mozilla/gfx/2D.h" @@ -24,6 +23,7 @@ #include "nsIOpenTabsProvider.h" #include "imgIContainer.h" #include "imgITools.h" +#include "mozilla/places/nsFaviconService.h" using namespace mozilla; using namespace mozilla::gfx; @@ -62,27 +62,6 @@ static const char* introspect_template = "\n" "\n"; -class AsyncFaviconDataReady final : public nsIFaviconDataCallback { - public: - NS_DECL_ISUPPORTS - NS_DECL_NSIFAVICONDATACALLBACK - - AsyncFaviconDataReady(RefPtr aSearchResult, - int aIconIndex, int aTimeStamp) - : mSearchResult(std::move(aSearchResult)), - mIconIndex(aIconIndex), - mTimeStamp(aTimeStamp) {} - - private: - ~AsyncFaviconDataReady() {} - - RefPtr mSearchResult; - int mIconIndex; - int mTimeStamp; -}; - -NS_IMPL_ISUPPORTS(AsyncFaviconDataReady, nsIFaviconDataCallback) - // Inspired by SurfaceToPackedBGRA static UniquePtr SurfaceToPackedRGBA(DataSourceSurface* aSurface) { IntSize size = aSurface->GetSize(); @@ -116,22 +95,35 @@ static UniquePtr SurfaceToPackedRGBA(DataSourceSurface* aSurface) { return imageBuffer; } -NS_IMETHODIMP -AsyncFaviconDataReady::OnComplete(nsIURI* aFaviconURI, uint32_t aDataLen, - const uint8_t* aData, - const nsACString& aMimeType, - uint16_t aWidth) { +static nsresult UpdateHistoryIcon( + const places::FaviconPromise::ResolveOrRejectValue& aPromiseResult, + const RefPtr& aSearchResult, + int aIconIndex, int aTimeStamp) { // This is a callback from some previous search so we don't want it - if (mTimeStamp != mSearchResult->GetTimeStamp() || !aData || !aDataLen) { + if (aTimeStamp != aSearchResult->GetTimeStamp()) { return NS_ERROR_FAILURE; } + nsCOMPtr favicon = + aPromiseResult.IsResolve() ? aPromiseResult.ResolveValue() : nullptr; + if (!favicon) { + return NS_ERROR_FAILURE; + } + + // Get favicon content. + nsTArray rawData; + nsresult rv = favicon->GetRawData(rawData); + NS_ENSURE_SUCCESS(rv, rv); + nsAutoCString mimeType; + rv = favicon->GetMimeType(mimeType); + NS_ENSURE_SUCCESS(rv, rv); + // Decode the image from the format it was returned to us in (probably PNG) nsCOMPtr container; nsCOMPtr imgtool = do_CreateInstance("@mozilla.org/image/tools;1"); - nsresult rv = imgtool->DecodeImageFromBuffer( - reinterpret_cast(aData), aDataLen, aMimeType, - getter_AddRefs(container)); + rv = imgtool->DecodeImageFromBuffer( + reinterpret_cast(rawData.Elements()), rawData.Length(), + mimeType, getter_AddRefs(container)); NS_ENSURE_SUCCESS(rv, rv); RefPtr surface = container->GetFrame( @@ -149,9 +141,9 @@ AsyncFaviconDataReady::OnComplete(nsIURI* aFaviconURI, uint32_t aDataLen, return NS_ERROR_OUT_OF_MEMORY; } - mSearchResult->SetHistoryIcon(mTimeStamp, std::move(data), + aSearchResult->SetHistoryIcon(aTimeStamp, std::move(data), surface->GetSize().width, - surface->GetSize().height, mIconIndex); + surface->GetSize().height, aIconIndex); return NS_OK; } @@ -432,8 +424,7 @@ void nsGNOMEShellHistorySearchResult::HandleSearchResultReply() { nsresult rv = mHistResultContainer->GetChildCount(&childCount); if (NS_SUCCEEDED(rv) && childCount > 0) { // Obtain the favicon service and get the favicon for the specified page - nsCOMPtr favIconSvc( - do_GetService("@mozilla.org/browser/favicon-service;1")); + auto* favIconSvc = nsFaviconService::GetFaviconService(); nsCOMPtr ios(do_GetService(NS_IOSERVICE_CONTRACTID)); if (childCount > MAX_SEARCH_RESULTS_NUM) { @@ -453,11 +444,15 @@ void nsGNOMEShellHistorySearchResult::HandleSearchResultReply() { nsAutoCString uri; child->GetUri(uri); + RefPtr self = this; nsCOMPtr iconIri; ios->NewURI(uri, nullptr, nullptr, getter_AddRefs(iconIri)); - nsCOMPtr callback = - new AsyncFaviconDataReady(this, i, mTimeStamp); - favIconSvc->GetFaviconDataForPage(iconIri, callback, 0); + favIconSvc->AsyncGetFaviconForPage(iconIri)->Then( + GetMainThreadSerialEventTarget(), __func__, + [self, iconIndex = i, timeStamp = mTimeStamp]( + const places::FaviconPromise::ResolveOrRejectValue& aResult) { + UpdateHistoryIcon(aResult, self, iconIndex, timeStamp); + }); bool isOpen = false; for (const auto& openuri : mOpenTabs) { diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js index face3b90047..41a9bfd4e59 100644 --- a/browser/components/sidebar/browser-sidebar.js +++ b/browser/components/sidebar/browser-sidebar.js @@ -1081,13 +1081,12 @@ var SidebarController = { let fromRects = this._getRects(animatingElements); - // We need to wait for rAF for lit to re-render, and us to get the final - // width. This is a bit unfortunate but alas... - let toRects = await new Promise(resolve => { - requestAnimationFrame(() => { - resolve(this._getRects(animatingElements)); - }); + // We need to wait for lit to re-render, and us to get the final width. + // This is a bit unfortunate but alas... + await new Promise(resolve => { + queueMicrotask(() => resolve(this.sidebarMain.updateComplete)); }); + let toRects = this._getRects(animatingElements); const options = { duration: document.documentElement.hasAttribute("sidebar-expand-on-hover") diff --git a/browser/components/sidebar/tests/browser/browser_glean_sidebar.js b/browser/components/sidebar/tests/browser/browser_glean_sidebar.js index cbb8a30d28c..83384f34d1b 100644 --- a/browser/components/sidebar/tests/browser/browser_glean_sidebar.js +++ b/browser/components/sidebar/tests/browser/browser_glean_sidebar.js @@ -256,7 +256,8 @@ add_task(async function test_contextual_manager_toggle() { await testSidebarToggle("viewCPMSidebar", gleanEvent); await testCustomizeToggle( "viewCPMSidebar", - Glean.contextualManager.passwordsEnabled + Glean.contextualManager.passwordsEnabled, + false // Remove this in bug 1957425 ); await SpecialPowers.popPrefEnv(); await SidebarController.waitUntilStable(); diff --git a/browser/components/topsites/TopSites.sys.mjs b/browser/components/topsites/TopSites.sys.mjs index d3aa680b9fa..f0319a69ea1 100644 --- a/browser/components/topsites/TopSites.sys.mjs +++ b/browser/components/topsites/TopSites.sys.mjs @@ -1199,18 +1199,16 @@ export class FaviconProvider { * @param {nsIURI} uri * Page to check for favicon data * @returns {object} - * A promise of an object (possibly null) containing the data + * Favicon info object. If there is no data in DB, return null. */ - getFaviconInfo(uri) { - return new Promise(resolve => - lazy.PlacesUtils.favicons.getFaviconDataForPage( - uri, - // Package up the icon data in an object if we have it; otherwise null - (iconUri, faviconLength, favicon, mimeType, faviconSize) => - resolve(iconUri ? { iconUri, faviconSize } : null), - lazy.NewTabUtils.activityStreamProvider.THUMB_FAVICON_SIZE - ) + async getFaviconInfo(uri) { + let favicon = await lazy.PlacesUtils.favicons.getFaviconForPage( + uri, + lazy.NewTabUtils.activityStreamProvider.THUMB_FAVICON_SIZE ); + return favicon + ? { iconUri: favicon.uri, faviconSize: favicon.width } + : null; } /** diff --git a/browser/components/topsites/test/unit/test_FaviconProvider.js b/browser/components/topsites/test/unit/test_FaviconProvider.js index b3881a1ced0..2d12dc60fa2 100644 --- a/browser/components/topsites/test/unit/test_FaviconProvider.js +++ b/browser/components/topsites/test/unit/test_FaviconProvider.js @@ -110,9 +110,9 @@ add_task(async function test_fetchIcon_with_valid_favicon() { await feed.fetchIcon(TEST_PAGE_URL.spec); info("Check the database"); - const result = await PlacesUtils.promiseFaviconData(TEST_PAGE_URL); + const result = await PlacesUtils.favicons.getFaviconForPage(TEST_PAGE_URL); Assert.equal(result.mimeType, "image/svg+xml"); - Assert.equal(result.size, 65535); + Assert.equal(result.width, 65535); info("Clean up"); await PlacesTestUtils.clearFavicons(); @@ -141,14 +141,13 @@ add_task(async function test_fetchIcon_with_invalid_favicon() { await feed.fetchIcon(TEST_PAGE_URL.spec); info("Check the database"); - const result = await PlacesUtils.promiseFaviconData(TEST_PAGE_URL); + const result = await PlacesUtils.favicons.getFaviconForPage(TEST_PAGE_URL); // eslint-disable-next-line no-use-before-define const expectedFaviconData = readFileData(TEST_FAVICON_FILE); Assert.equal(result.uri.spec, `${TEST_FAVICON_URL.spec}#tippytop`); - Assert.equal(result.dataLen, expectedFaviconData.length); - Assert.deepEqual(result.data, expectedFaviconData); + Assert.deepEqual(result.rawData, expectedFaviconData); Assert.equal(result.mimeType, "image/png"); - Assert.equal(result.size, 16); + Assert.equal(result.width, 16); info("Clean up"); await PlacesTestUtils.clearFavicons(); @@ -186,15 +185,16 @@ add_task(async function test_fetchIconFromRedirects_with_valid_favicon() { info("Check the database"); await TestUtils.waitForCondition(async () => { - const result = await PlacesUtils.promiseFaviconData(destination); + const result = await PlacesUtils.favicons.getFaviconForPage(destination); return !!result; }); - const sourceResult = await PlacesUtils.promiseFaviconData(TEST_PAGE_URL); - const destinationResult = await PlacesUtils.promiseFaviconData(destination); - Assert.equal(destinationResult.dataLen, sourceResult.dataLen); - Assert.deepEqual(destinationResult.data, sourceResult.data); + const sourceResult = + await PlacesUtils.favicons.getFaviconForPage(TEST_PAGE_URL); + const destinationResult = + await PlacesUtils.favicons.getFaviconForPage(destination); + Assert.deepEqual(destinationResult.rawData, sourceResult.rawData); Assert.equal(destinationResult.mimeType, sourceResult.mimeType); - Assert.equal(destinationResult.size, sourceResult.size); + Assert.equal(destinationResult.width, sourceResult.width); info("Clean up"); await PlacesTestUtils.clearFavicons(); @@ -264,9 +264,7 @@ add_task(async function test_fetchIcon_withNetworkFetch() { // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox - .stub() - .callsArgWith(1, null, 0, null, null, 0), + getFaviconForPage: sandbox.stub().returns(Promise.resolve(null)), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; @@ -298,9 +296,10 @@ add_task(async function test_fetchIcon_withInvalidDataInDb() { const sandbox = sinon.createSandbox(); // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox + // Invalid since no width. + getFaviconForPage: sandbox .stub() - .callsArgWith(1, { spec: FAKE_SMALLPNG_DATA_URI }, 0, null, null, 0), + .returns(Promise.resolve({ iconUri: { spec: FAKE_SMALLPNG_DATA_URI } })), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; @@ -335,16 +334,12 @@ add_task(async function test_fetchIcon_withValidDataInDb() { const sandbox = sinon.createSandbox(); // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox - .stub() - .callsArgWith( - 1, - { spec: FAKE_SMALLPNG_DATA_URI }, - 100, - ["dummy icon data"], - "image/png", - 16 - ), + getFaviconForPage: sandbox.stub().returns( + Promise.resolve({ + iconUri: { spec: FAKE_SMALLPNG_DATA_URI }, + width: 100, + }) + ), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; @@ -370,9 +365,7 @@ add_task(async function test_fetchIcon_withNoTippyTopData() { let feed = new FaviconProvider(); // Set up mocks PlacesUtils.favicons = { - getFaviconDataForPage: sandbox - .stub() - .callsArgWith(1, null, 0, null, null, 0), + getFaviconForPage: sandbox.stub().returns(Promise.resolve(null)), setFaviconForPage: sandbox.spy(), copyFavicons: sandbox.spy(), }; diff --git a/browser/components/urlbar/MerinoClient.sys.mjs b/browser/components/urlbar/MerinoClient.sys.mjs index 81d5694f4cb..bc9d34926ac 100644 --- a/browser/components/urlbar/MerinoClient.sys.mjs +++ b/browser/components/urlbar/MerinoClient.sys.mjs @@ -315,10 +315,22 @@ export class MerinoClient { this.#timeoutTimer = null; } + if (!response?.ok) { + // `recordResponse()` was already called above, no need to call it here. + return []; + } + + if (response.status == 204) { + // No content. We check for this because `response.json()` (below) throws + // in this case, and since we log the error it can spam the console. + recordResponse?.("no_suggestion"); + return []; + } + // Get the response body as an object. let body; try { - body = await response?.json(); + body = await response.json(); } catch (error) { this.logger.error("Error getting response as JSON", error); } diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs index 1137fc12043..38bc3ef48cb 100644 --- a/browser/components/urlbar/UrlbarInput.sys.mjs +++ b/browser/components/urlbar/UrlbarInput.sys.mjs @@ -720,14 +720,14 @@ export class UrlbarInput { * Where we expect the result to be opened. * @property {object} openParams * The parameters related to where the result will be opened. - * @property {Node} engine + * @property {nsISearchEngine} engine * The selected one-off's engine. */ /** * Handles an event which would cause a URL or text to be opened. * - * @param {object} [options] + * @param {object} options * Options for the navigation. * @param {Event} [options.event] * The event triggering the open. @@ -819,7 +819,21 @@ export class UrlbarInput { oneOffParams.engine, searchString ); - this._recordSearch(oneOffParams.engine, event); + if (oneOffParams.openWhere == "tab") { + this.window.gBrowser.tabContainer.addEventListener( + "TabOpen", + tabEvent => + this._recordSearch( + oneOffParams.engine, + event, + {}, + tabEvent.target.linkedBrowser + ), + { once: true } + ); + } else { + this._recordSearch(oneOffParams.engine, event); + } lazy.UrlbarUtils.addToFormHistory( this, @@ -1288,7 +1302,24 @@ export class UrlbarInput { alias: result.payload.keyword, }; const engine = Services.search.getEngineByName(result.payload.engine); - this._recordSearch(engine, event, actionDetails); + + if (where == "tab") { + // The TabOpen event is fired synchronously so tabEvent.target + // is guaranteed to be our new search tab. + this.window.gBrowser.tabContainer.addEventListener( + "TabOpen", + tabEvent => + this._recordSearch( + engine, + event, + actionDetails, + tabEvent.target.linkedBrowser + ), + { once: true } + ); + } else { + this._recordSearch(engine, event, actionDetails); + } if (!result.payload.inPrivateWindow) { lazy.UrlbarUtils.addToFormHistory( @@ -1836,8 +1867,10 @@ export class UrlbarInput { null, "search-mode-switcher" ).uri.spec; + // TODO: record SAP telemetry, see Bug 1961789. } else { url = searchEngine.searchForm; + lazy.BrowserSearchTelemetry.recordSearchForm(searchEngine, "urlbar"); } this._lastSearchString = ""; @@ -2953,18 +2986,26 @@ export class UrlbarInput { * The engine to generate the query for. * @param {Event} event * The event that triggered this query. - * @param {object} searchActionDetails + * @param {object} [searchActionDetails] * The details associated with this search query. - * @param {boolean} searchActionDetails.isSuggestion + * @param {boolean} [searchActionDetails.isSuggestion] * True if this query was initiated from a suggestion from the search engine. - * @param {boolean} searchActionDetails.alias + * @param {boolean} [searchActionDetails.alias] * True if this query was initiated via a search alias. - * @param {boolean} searchActionDetails.isFormHistory + * @param {boolean} [searchActionDetails.isFormHistory] * True if this query was initiated from a form history result. - * @param {string} searchActionDetails.url + * @param {string} [searchActionDetails.url] * The url this query was triggered with. + * @param {XULBrowserElement} [browser] + * The browser where the search is being opened. + * Defaults to the window's selected browser. */ - _recordSearch(engine, event, searchActionDetails = {}) { + _recordSearch( + engine, + event, + searchActionDetails = {}, + browser = this.window.gBrowser.selectedBrowser + ) { const isOneOff = this.view.oneOffSearchButtons.eventTargetIsAOneOff(event); const searchSource = this.getSearchSource(event); @@ -2984,7 +3025,7 @@ export class UrlbarInput { // Sending a trigger to ASRouter when a search happens lazy.ASRouter.sendTriggerMessage({ - browser: this.window.gBrowser.selectedBrowser, + browser, id: "onSearch", context: { isSuggestion: searchActionDetails.isSuggestion || false, @@ -2993,16 +3034,11 @@ export class UrlbarInput { }, }); - lazy.BrowserSearchTelemetry.recordSearch( - this.window.gBrowser.selectedBrowser, - engine, - searchSource, - { - ...searchActionDetails, - isOneOff, - newtabSessionId: this._handoffSession, - } - ); + lazy.BrowserSearchTelemetry.recordSearch(browser, engine, searchSource, { + ...searchActionDetails, + isOneOff, + newtabSessionId: this._handoffSession, + }); } /** diff --git a/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs b/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs index 840f5c2d5f7..60ffb3a6e6a 100644 --- a/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderInputHistory.sys.mjs @@ -23,16 +23,14 @@ ChromeUtils.defineESModuleGetters(lazy, { UrlbarResult: "resource:///modules/UrlbarResult.sys.mjs", }); -// Constants to support an alternative frecency algorithm. -const PAGES_USE_ALT_FRECENCY = Services.prefs.getBoolPref( - "places.frecency.pages.alternative.featureGate", - false -); -const PAGES_FRECENCY_FIELD = PAGES_USE_ALT_FRECENCY - ? "alt_frecency" - : "frecency"; - -const SQL_ADAPTIVE_QUERY = `/* do not warn (bug 487789) */ +ChromeUtils.defineLazyGetter(lazy, "SQL_ADAPTIVE_QUERY", () => { + // Constants to support an alternative frecency algorithm. + const PAGES_USE_ALT_FRECENCY = + lazy.PlacesUtils.history.isAlternativeFrecencyEnabled; + const PAGES_FRECENCY_FIELD = PAGES_USE_ALT_FRECENCY + ? "alt_frecency" + : "frecency"; + return `/* do not warn (bug 487789) */ SELECT h.url, h.title, EXISTS(SELECT 1 FROM moz_bookmarks WHERE fk = h.id) AS bookmarked, @@ -66,6 +64,7 @@ const SQL_ADAPTIVE_QUERY = `/* do not warn (bug 487789) */ NULL) ORDER BY rank DESC, ${PAGES_FRECENCY_FIELD} DESC LIMIT :maxResults`; +}); /** * Class used to create the provider. @@ -245,7 +244,7 @@ class ProviderInputHistory extends UrlbarProvider { */ _getAdaptiveQuery(queryContext) { return [ - SQL_ADAPTIVE_QUERY, + lazy.SQL_ADAPTIVE_QUERY, { parent: lazy.PlacesUtils.tagsFolderId, search_string: queryContext.lowerCaseSearchString, diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs index b1481a11ef3..899e808c5f8 100644 --- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs @@ -36,15 +36,6 @@ const QUERYINDEX_FRECENCY = 10; const QUERYINDEX_USERCONTEXTID = 11; const QUERYINDEX_LASTVIST = 12; -// Constants to support an alternative frecency algorithm. -const PAGES_USE_ALT_FRECENCY = Services.prefs.getBoolPref( - "places.frecency.pages.alternative.featureGate", - false -); -const PAGES_FRECENCY_FIELD = PAGES_USE_ALT_FRECENCY - ? "alt_frecency" - : "frecency"; - // This SQL query fragment provides the following: // - whether the entry is bookmarked (QUERYINDEX_BOOKMARKED) // - the bookmark title, if it is a bookmark (QUERYINDEX_BOOKMARKTITLE) @@ -65,14 +56,14 @@ const SQL_BOOKMARK_TAGS_FRAGMENT = `EXISTS(SELECT 1 FROM moz_bookmarks WHERE fk // condition once, and avoid evaluating "btitle" and "tags" when it is false. function defaultQuery(conditions = "") { let query = `SELECT :query_type, h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT}, - h.visit_count, h.typed, h.id, t.open_count, ${PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date + h.visit_count, h.typed, h.id, t.open_count, ${lazy.PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date FROM moz_places h LEFT JOIN moz_openpages_temp t ON t.url = h.url AND (t.userContextId = :userContextId OR (t.userContextId <> -1 AND :userContextId IS NULL)) WHERE ( (:switchTabsEnabled AND t.open_count > 0) OR - ${PAGES_FRECENCY_FIELD} <> 0 + ${lazy.PAGES_FRECENCY_FIELD} <> 0 ) AND CASE WHEN bookmarked THEN @@ -89,7 +80,7 @@ function defaultQuery(conditions = "") { :matchBehavior, :searchBehavior, NULL) END ${conditions ? "AND" : ""} ${conditions} - ORDER BY ${PAGES_FRECENCY_FIELD} DESC, h.id DESC + ORDER BY ${lazy.PAGES_FRECENCY_FIELD} DESC, h.id DESC LIMIT :maxResults`; return query; } @@ -128,6 +119,13 @@ ChromeUtils.defineESModuleGetters(lazy, { UrlbarTokenizer: "resource:///modules/UrlbarTokenizer.sys.mjs", }); +// Constants to support an alternative frecency algorithm. +ChromeUtils.defineLazyGetter(lazy, "PAGES_FRECENCY_FIELD", () => { + return lazy.PlacesUtils.history.isAlternativeFrecencyEnabled + ? "alt_frecency" + : "frecency"; +}); + function setTimeout(callback, ms) { let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); timer.initWithCallback(callback, ms, timer.TYPE_ONE_SHOT); diff --git a/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js b/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js index 9d0ff581367..35fac269fe9 100644 --- a/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js +++ b/browser/components/urlbar/tests/quicksuggest/unit/test_merinoClient.js @@ -251,6 +251,20 @@ async function doFetchAndGetCalls(client, fetchArgs) { return callsByProvider; } +// Checks a 204 "No content" response. +add_task(async function noContent() { + MerinoTestUtils.server.response = { status: 204 }; + await fetchAndCheckSuggestions({ expected: [] }); + + Assert.equal( + gClient.lastFetchStatus, + "no_suggestion", + "The request should have been recorded as no_suggestion" + ); + + MerinoTestUtils.server.reset(); +}); + // Checks a response that's valid but also has some unexpected properties. add_task(async function unexpectedResponseProperties() { MerinoTestUtils.server.response.body.unexpectedString = "some value"; diff --git a/browser/config/mozconfigs/linux32/devedition b/browser/config/mozconfigs/linux32/devedition index 0eaa4a5dab8..c4f33b9cd37 100644 --- a/browser/config/mozconfigs/linux32/devedition +++ b/browser/config/mozconfigs/linux32/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/linux32/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/linux32/nightly-fuzzing-asan b/browser/config/mozconfigs/linux32/nightly-fuzzing-asan index cf39c2659fd..d1be24536df 100644 --- a/browser/config/mozconfigs/linux32/nightly-fuzzing-asan +++ b/browser/config/mozconfigs/linux32/nightly-fuzzing-asan @@ -3,7 +3,7 @@ ac_add_options --enable-debug-symbols=-gline-tables-only # Add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/add-on-devel b/browser/config/mozconfigs/linux64/add-on-devel index 1c66f102c11..50c4cd07057 100644 --- a/browser/config/mozconfigs/linux64/add-on-devel +++ b/browser/config/mozconfigs/linux64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/linux64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/linux64/debug-searchfox-clang b/browser/config/mozconfigs/linux64/debug-searchfox-clang index 127c23f514c..20bea865e45 100644 --- a/browser/config/mozconfigs/linux64/debug-searchfox-clang +++ b/browser/config/mozconfigs/linux64/debug-searchfox-clang @@ -1,5 +1,5 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_CHECK=0 . "$topsrcdir/build/unix/mozconfig.unix" diff --git a/browser/config/mozconfigs/linux64/debug-static-analysis-clang b/browser/config/mozconfigs/linux64/debug-static-analysis-clang index 18912a5a7f1..91d29f17092 100644 --- a/browser/config/mozconfigs/linux64/debug-static-analysis-clang +++ b/browser/config/mozconfigs/linux64/debug-static-analysis-clang @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . "$topsrcdir/build/mozconfig.common" diff --git a/browser/config/mozconfigs/linux64/devedition b/browser/config/mozconfigs/linux64/devedition index 533fe3dfb6a..97bba5d7b6e 100644 --- a/browser/config/mozconfigs/linux64/devedition +++ b/browser/config/mozconfigs/linux64/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/linux64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan index c5b47a670ad..19807e2d313 100644 --- a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan +++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan @@ -1,7 +1,7 @@ ac_add_options --enable-debug-symbols=-gline-tables-only #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt index 4813f17390d..c10d75391d0 100644 --- a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt +++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-noopt @@ -1,7 +1,7 @@ ac_add_options --disable-optimize #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx index 558d47aa749..851fc877aa5 100644 --- a/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx +++ b/browser/config/mozconfigs/linux64/nightly-fuzzing-asan-nyx @@ -4,7 +4,7 @@ ac_add_options --enable-debug-symbols=-gline-tables-only #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= # ASan specific options on Linux ac_add_options --enable-valgrind diff --git a/browser/config/mozconfigs/linux64/non-unified b/browser/config/mozconfigs/linux64/non-unified index ff8387d5891..7f2bd197a39 100644 --- a/browser/config/mozconfigs/linux64/non-unified +++ b/browser/config/mozconfigs/linux64/non-unified @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/browser/config/mozconfigs/linux64/nightly diff --git a/browser/config/mozconfigs/linux64/valgrind b/browser/config/mozconfigs/linux64/valgrind index 8062ddd52b3..ffaeab65d7d 100644 --- a/browser/config/mozconfigs/linux64/valgrind +++ b/browser/config/mozconfigs/linux64/valgrind @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_CHECK=0 . $topsrcdir/browser/config/mozconfigs/linux64/nightly diff --git a/browser/config/mozconfigs/macosx64-aarch64/add-on-devel b/browser/config/mozconfigs/macosx64-aarch64/add-on-devel index 1515fa2caa4..44b19f2de12 100644 --- a/browser/config/mozconfigs/macosx64-aarch64/add-on-devel +++ b/browser/config/mozconfigs/macosx64-aarch64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/macosx64-aarch64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug b/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug index 77416fb9161..5a95a8e6c3e 100644 --- a/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug +++ b/browser/config/mozconfigs/macosx64-aarch64/cross-noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/macosx64/debug" diff --git a/browser/config/mozconfigs/macosx64-aarch64/devedition b/browser/config/mozconfigs/macosx64-aarch64/devedition index 70f6e16eb31..f9e0159864e 100644 --- a/browser/config/mozconfigs/macosx64-aarch64/devedition +++ b/browser/config/mozconfigs/macosx64-aarch64/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/macosx64-aarch64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --enable-instruments diff --git a/browser/config/mozconfigs/macosx64/add-on-devel b/browser/config/mozconfigs/macosx64/add-on-devel index fe062cb5bbe..add26e5713f 100644 --- a/browser/config/mozconfigs/macosx64/add-on-devel +++ b/browser/config/mozconfigs/macosx64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/macosx64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/macosx64/cross-noopt-debug b/browser/config/mozconfigs/macosx64/cross-noopt-debug index a2ba5c04bfd..87461dfd2eb 100644 --- a/browser/config/mozconfigs/macosx64/cross-noopt-debug +++ b/browser/config/mozconfigs/macosx64/cross-noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/macosx64/debug" diff --git a/browser/config/mozconfigs/macosx64/debug-searchfox b/browser/config/mozconfigs/macosx64/debug-searchfox index 22d0b7151e1..4d8d47fe726 100644 --- a/browser/config/mozconfigs/macosx64/debug-searchfox +++ b/browser/config/mozconfigs/macosx64/debug-searchfox @@ -1,5 +1,5 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_CHECK=0 . $topsrcdir/build/macosx/mozconfig.common diff --git a/browser/config/mozconfigs/macosx64/debug-static-analysis b/browser/config/mozconfigs/macosx64/debug-static-analysis index d376ec8353a..b9241faffa1 100644 --- a/browser/config/mozconfigs/macosx64/debug-static-analysis +++ b/browser/config/mozconfigs/macosx64/debug-static-analysis @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/build/macosx/mozconfig.common diff --git a/browser/config/mozconfigs/macosx64/devedition b/browser/config/mozconfigs/macosx64/devedition index 0e107db32ad..dc9b924068b 100644 --- a/browser/config/mozconfigs/macosx64/devedition +++ b/browser/config/mozconfigs/macosx64/devedition @@ -1,7 +1,7 @@ . "$topsrcdir/browser/config/mozconfigs/macosx64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --enable-instruments diff --git a/browser/config/mozconfigs/macosx64/non-unified b/browser/config/mozconfigs/macosx64/non-unified index e92d8812075..bc0bb0c9225 100644 --- a/browser/config/mozconfigs/macosx64/non-unified +++ b/browser/config/mozconfigs/macosx64/non-unified @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/browser/config/mozconfigs/macosx64/nightly diff --git a/browser/config/mozconfigs/macosx64/opt-static-analysis b/browser/config/mozconfigs/macosx64/opt-static-analysis index c5f6c3bca03..20bc7b6bf4b 100644 --- a/browser/config/mozconfigs/macosx64/opt-static-analysis +++ b/browser/config/mozconfigs/macosx64/opt-static-analysis @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/build/macosx/mozconfig.common diff --git a/browser/config/mozconfigs/win32/add-on-devel b/browser/config/mozconfigs/win32/add-on-devel index a9a2d4b7d13..0491100a2df 100644 --- a/browser/config/mozconfigs/win32/add-on-devel +++ b/browser/config/mozconfigs/win32/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/win32/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/win32/debug-static-analysis b/browser/config/mozconfigs/win32/debug-static-analysis index b04d58720fe..ad046f27e26 100644 --- a/browser/config/mozconfigs/win32/debug-static-analysis +++ b/browser/config/mozconfigs/win32/debug-static-analysis @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . "$topsrcdir/build/mozconfig.win-common" . "$topsrcdir/browser/config/mozconfigs/common" diff --git a/browser/config/mozconfigs/win32/devedition b/browser/config/mozconfigs/win32/devedition index b0304f330fa..fef90cab0ed 100644 --- a/browser/config/mozconfigs/win32/devedition +++ b/browser/config/mozconfigs/win32/devedition @@ -3,7 +3,7 @@ . "$topsrcdir/browser/config/mozconfigs/win32/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/win32/mingwclang b/browser/config/mozconfigs/win32/mingwclang index e7bca6b405c..befca5d114f 100644 --- a/browser/config/mozconfigs/win32/mingwclang +++ b/browser/config/mozconfigs/win32/mingwclang @@ -36,15 +36,15 @@ ac_add_options --disable-default-browser-agent # Relies on toast notifications w ac_add_options --disable-notification-server # Toast notifications don't build on mingw. # Find our toolchain -export HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" -export HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" -export CC="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang" -export CXX="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang++" -export CXXFLAGS="-fms-extensions" -export CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CFLAGS="$CFLAGS -include _mingw.h" -export CXXFLAGS="$CXXFLAGS -include _mingw.h" +HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" +HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" +CC="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang" +CXX="$MOZ_FETCHES_DIR/clang/bin/i686-w64-mingw32-clang++" +CXXFLAGS="-fms-extensions" +CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CFLAGS="$CFLAGS -include _mingw.h" +CXXFLAGS="$CXXFLAGS -include _mingw.h" # We want to make sure we use binutils and other binaries in the tooltool # package. diff --git a/browser/config/mozconfigs/win32/noopt-debug b/browser/config/mozconfigs/win32/noopt-debug index b0a1977ebdd..d66c1393543 100644 --- a/browser/config/mozconfigs/win32/noopt-debug +++ b/browser/config/mozconfigs/win32/noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/win32/debug" diff --git a/browser/config/mozconfigs/win64-aarch64/devedition b/browser/config/mozconfigs/win64-aarch64/devedition index 38b2f80d58a..277a6fc7ce8 100644 --- a/browser/config/mozconfigs/win64-aarch64/devedition +++ b/browser/config/mozconfigs/win64-aarch64/devedition @@ -3,7 +3,7 @@ . "$topsrcdir/browser/config/mozconfigs/win64-aarch64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/win64/add-on-devel b/browser/config/mozconfigs/win64/add-on-devel index e46810f4c08..aa42d54743f 100644 --- a/browser/config/mozconfigs/win64/add-on-devel +++ b/browser/config/mozconfigs/win64/add-on-devel @@ -1,7 +1,7 @@ . $topsrcdir/browser/config/mozconfigs/win64/nightly #add-on signing is checked but not enforced -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/unofficial ac_add_options --enable-update-channel=default diff --git a/browser/config/mozconfigs/win64/debug-searchfox b/browser/config/mozconfigs/win64/debug-searchfox index a97c74787e2..f36e4142250 100644 --- a/browser/config/mozconfigs/win64/debug-searchfox +++ b/browser/config/mozconfigs/win64/debug-searchfox @@ -1,5 +1,5 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 -export MOZ_AUTOMATION_CHECK=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_CHECK=0 . "$topsrcdir/build/mozconfig.win-common" . "$topsrcdir/browser/config/mozconfigs/common" diff --git a/browser/config/mozconfigs/win64/devedition b/browser/config/mozconfigs/win64/devedition index 21426d9a916..6bbec8c3ba7 100644 --- a/browser/config/mozconfigs/win64/devedition +++ b/browser/config/mozconfigs/win64/devedition @@ -3,7 +3,7 @@ . "$topsrcdir/browser/config/mozconfigs/win64/common-opt" # Add-on signing is not required for DevEdition -unset MOZ_REQUIRE_SIGNING +MOZ_REQUIRE_SIGNING= ac_add_options --with-branding=browser/branding/aurora diff --git a/browser/config/mozconfigs/win64/mingwclang b/browser/config/mozconfigs/win64/mingwclang index 1c38378e31e..a99f6f5be0d 100644 --- a/browser/config/mozconfigs/win64/mingwclang +++ b/browser/config/mozconfigs/win64/mingwclang @@ -36,15 +36,15 @@ ac_add_options --disable-default-browser-agent # Relies on toast notifications w ac_add_options --disable-notification-server # Toast notifications don't build on mingw. # Find our toolchain -export HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" -export HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" -export CC="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang" -export CXX="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang++" -export CXXFLAGS="-fms-extensions" -export CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" -export CFLAGS="$CFLAGS -include _mingw.h" -export CXXFLAGS="$CXXFLAGS -include _mingw.h" +HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" +HOST_CXX="$MOZ_FETCHES_DIR/clang/bin/clang++" +CC="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang" +CXX="$MOZ_FETCHES_DIR/clang/bin/x86_64-w64-mingw32-clang++" +CXXFLAGS="-fms-extensions" +CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}" +CFLAGS="$CFLAGS -include _mingw.h" +CXXFLAGS="$CXXFLAGS -include _mingw.h" # We want to make sure we use binutils and other binaries in the tooltool # package. diff --git a/browser/config/mozconfigs/win64/non-unified b/browser/config/mozconfigs/win64/non-unified index 920b9ee14ea..f229bcafead 100644 --- a/browser/config/mozconfigs/win64/non-unified +++ b/browser/config/mozconfigs/win64/non-unified @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 . $topsrcdir/browser/config/mozconfigs/win64/nightly diff --git a/browser/config/mozconfigs/win64/noopt-debug b/browser/config/mozconfigs/win64/noopt-debug index 3a27c1fb3c5..a11b25d687d 100644 --- a/browser/config/mozconfigs/win64/noopt-debug +++ b/browser/config/mozconfigs/win64/noopt-debug @@ -1,4 +1,4 @@ -export MOZ_AUTOMATION_BUILD_SYMBOLS=0 +MOZ_AUTOMATION_BUILD_SYMBOLS=0 # Developers often build with these options for a better debugging experience. . "$topsrcdir/browser/config/mozconfigs/win64/debug" diff --git a/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js b/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js index c8d748c10d9..d64784efb0a 100644 --- a/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js +++ b/browser/extensions/formautofill/test/browser/browser_dynamic_form_autocompletion.js @@ -335,3 +335,174 @@ add_task( ); } ); + +/** + * Test that a select field is not filled on form change if the previously matching option is not present anymore. + */ +add_task( + async function select_field_cleared_on_form_change_when_no_matching_value_in_updated_select_options() { + const stateValueAfterFormChange = await BrowserTestUtils.withNewTab( + ADDRESS_FORM_URL, + async browser => { + const selectorToTriggerAutocompletion = "#organization"; + const elementValueToVerifyAutofill = TEST_ADDRESS_1.organization; + + // Setting up an address-level1 element + for (const opt of nonMatchingProvinces) { + const option = content.document.createElement("option"); + option.value = opt.value; + option.textContent = opt.text; + stateSelect.appendChild(option); + } + }); + + info("Waiting for filling on form change"); + await filledOnFormChangePromise; + + return await SpecialPowers.spawn(browser, [], async () => { + const stateSelect = content.document.getElementById("address-level1"); + + info("Checking that select element lost highlighting"); + await ContentTaskUtils.waitForCondition( + () => !stateSelect.matches(":autofill"), + `Checking #${stateSelect.id} is not highlighted` + ); + + return stateSelect.value; + }); + } + ); + Assert.equal( + stateValueAfterFormChange, + "", + "State field without matching option is cleared after form change" + ); + } +); + +/** + * Test that a previously unfilled select field is filled on form change if a matching option is present in the changed select options. + */ +add_task( + async function not_autofilled_select_field_filled_on_form_change_when_matching_value_in_updated_select_options() { + const stateValueAfterFormChange = await BrowserTestUtils.withNewTab( + ADDRESS_FORM_URL, + async browser => { + const selectorToTriggerAutocompletion = "#organization"; + const elementValueToVerifyAutofill = TEST_ADDRESS_1.organization; + + // Setting up an address-level1 ` -); -// This fourth page asserts responses with line breaks -const FETCH_CONTENT_4 = addBaseHtmlElements(` +const TEST_PAGES = { + // This page asserts we can redirect to another URL, even if JS happen to be executed + redirect: addBaseHtmlElements( + `Fetch 1` + ), + + // #1 This page asserts that JS is disabled + js: addBaseHtmlElements( + `Fetch 2` + ), + + // #2 This page asserts that links and forms are disabled + forms: addBaseHtmlElements( + `Fetch 3link --
` + ), + + // #3 This page asserts responses with line breaks work + lineBreak: addBaseHtmlElements(` link1 link2 -`); -// This fifth page asserts that we apply inline styles -const FETCH_CONTENT_5 = addBaseHtmlElements(` -

Hello World

-`); + `), + + // #4 This page asserts that we apply inline styles + styles: addBaseHtmlElements(`

Hello World

`), + + // #5 This page asserts that (multiple) Content-Security-Policy headers are applied + csp: addBaseHtmlElements(` + + + + + `), +}; // Use fetch in order to prevent actually running this code in the test page -const TEST_HTML = addBaseHtmlElements(`
HTML
`); +const TEST_HTML = addBaseHtmlElements( + `
HTML
` +); const TEST_URL = BASE_URL + "doc-html-preview.html"; httpServer.registerPathHandler( @@ -59,26 +71,21 @@ httpServer.registerPathHandler( response.write(TEST_HTML); } ); -httpServer.registerPathHandler("/fetch-1.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_1); -}); -httpServer.registerPathHandler("/fetch-2.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_2); -}); -httpServer.registerPathHandler("/fetch-3.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_3); -}); -httpServer.registerPathHandler("/fetch-4.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_4); -}); -httpServer.registerPathHandler("/fetch-5.html", (request, response) => { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.write(FETCH_CONTENT_5); -}); + +for (const [name, content] of Object.entries(TEST_PAGES)) { + httpServer.registerPathHandler(`/fetch-${name}.html`, (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + + if (name === "csp") { + // Duplicate un-merged headers + response.setHeaderNoCheck("Content-Security-Policy", "img-src 'none'"); + response.setHeaderNoCheck("Content-Security-Policy", "base-uri 'self'"); + } + + response.write(content); + }); +} + httpServer.registerPathHandler("/redirect.html", (request, response) => { response.setStatusLine(request.httpVersion, 200, "OK"); response.write("Redirected!"); @@ -97,26 +104,33 @@ add_task(async function () { store.dispatch(Actions.batchEnable(false)); - const onNetworkEvent = waitForNetworkEvents(monitor, 3); + const onNetworkEvent = waitForNetworkEvents( + monitor, + 1 + Object.keys(TEST_PAGES).length + ); await reloadBrowser(); await onNetworkEvent; // The new lines are stripped when using outerHTML to retrieve HTML content of the preview iframe - await selectIndexAndWaitForHtmlView(0, TEST_HTML); - await selectIndexAndWaitForHtmlView(1, FETCH_CONTENT_1); - await selectIndexAndWaitForHtmlView(2, FETCH_CONTENT_2); - await selectIndexAndWaitForHtmlView(3, FETCH_CONTENT_3); - await selectIndexAndWaitForHtmlView(4, FETCH_CONTENT_4); - await selectIndexAndWaitForHtmlView(5, FETCH_CONTENT_5); + await selectIndexAndWaitForHtmlView(0, "initial-page", TEST_HTML); + let index = 1; + for (const [name, content] of Object.entries(TEST_PAGES)) { + await selectIndexAndWaitForHtmlView(index, name, content); + index++; + } await teardown(monitor); - async function selectIndexAndWaitForHtmlView(index, expectedHtmlPreview) { - info(`Select the request #${index}`); + async function selectIndexAndWaitForHtmlView( + index_, + name, + expectedHtmlPreview + ) { + info(`Select the request "${name}" #${index_}`); const onResponseContent = monitor.panelWin.api.once( TEST_EVENTS.RECEIVED_RESPONSE_CONTENT ); - store.dispatch(Actions.selectRequestByIndex(index)); + store.dispatch(Actions.selectRequestByIndex(index_)); document.querySelector("#response-tab").click(); @@ -148,7 +162,7 @@ add_task(async function () { } ); - if (expectedHtmlPreview == FETCH_CONTENT_5) { + if (name === "style") { await SpecialPowers.spawn(browser.browsingContext, [], async function () { const p = content.document.querySelector("p"); const computed = content.window.getComputedStyle(p); @@ -160,8 +174,23 @@ add_task(async function () { }); } + if (name == "csp") { + await SpecialPowers.spawn(browser.browsingContext, [], async function () { + is( + content.document.querySelector("img").complete, + false, + "img was blocked" + ); + is( + content.document.querySelector("iframe").src, + "/foo.html", + "URL of iframe was not changed by " + ); + }); + } + // Only assert copy to clipboard on the first test page - if (expectedHtmlPreview == TEST_HTML) { + if (name == "initial-page") { await waitForClipboardPromise(async function () { await SpecialPowers.spawn( browser.browsingContext, diff --git a/devtools/client/performance-new/@types/gecko.d.ts b/devtools/client/performance-new/@types/gecko.d.ts index 7d4a3d8544c..86795044c1e 100644 --- a/devtools/client/performance-new/@types/gecko.d.ts +++ b/devtools/client/performance-new/@types/gecko.d.ts @@ -232,19 +232,21 @@ declare namespace MockedExports { interface FaviconData { uri: nsIURI; - dataLen: number; - data: number[]; + rawData: number[]; mimeType: string; - size: number; + width: number; } const PlaceUtilsSYSMJS: { PlacesUtils: { - promiseFaviconData: ( - pageUrl: string | URL | nsIURI, - preferredWidth?: number - ) => Promise; - // TS-TODO: Add the rest. + favicons: { + getFaviconForPage: ( + pageUrl: nsIURI, + preferredWidth?: number + ) => Promise; + // TS-TODO: Add the rest. + }, + toURI: (uri: string | URL | nsIURI) => nsIURI; }; }; diff --git a/devtools/client/performance-new/shared/background.sys.mjs b/devtools/client/performance-new/shared/background.sys.mjs index 0f53908a51b..e3ac68f3681 100644 --- a/devtools/client/performance-new/shared/background.sys.mjs +++ b/devtools/client/performance-new/shared/background.sys.mjs @@ -460,17 +460,18 @@ async function getPageFavicons(pageUrls) { } // Get the data of favicons and return them. - const { promiseFaviconData } = lazy.PlacesUtils(); + const { favicons, toURI } = lazy.PlacesUtils(); const promises = pageUrls.map(pageUrl => - promiseFaviconData(pageUrl, /* preferredWidth = */ 32) + favicons + .getFaviconForPage(toURI(pageUrl), /* preferredWidth = */ 32) .then(favicon => { // Check if data is found in the database and return it if so. - if (favicon.dataLen > 0 && favicon.data) { + if (favicon.rawData.length) { return { // PlacesUtils returns a number array for the data. Converting it to // the Uint8Array here to send it to the tab more efficiently. - data: new Uint8Array(favicon.data).buffer, + data: new Uint8Array(favicon.rawData).buffer, mimeType: favicon.mimeType, }; } diff --git a/devtools/client/shared/curl.js b/devtools/client/shared/curl.js index cd8af64f86a..5f30c411583 100644 --- a/devtools/client/shared/curl.js +++ b/devtools/client/shared/curl.js @@ -58,17 +58,11 @@ const Curl = { generateCommand(data, platform) { const utils = CurlUtils; - let command = ["curl"]; + let commandParts = []; // Make sure to use the following helpers to sanitize arguments before execution. - const addParam = value => { - const safe = /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value); - command.push(safe); - }; - - const addPostData = value => { - const safe = /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value); - postData.push(safe); + const escapeStringifNeeded = value => { + return /^[a-zA-Z-]+$/.test(value) ? value : escapeString(value); }; const ignoredHeaders = new Set(); @@ -77,17 +71,17 @@ const Curl = { // The cURL command is expected to run on the same platform that Firefox runs // (it may be different from the inspected page platform). const escapeString = - currentPlatform == "WINNT" + currentPlatform === "WINNT" ? utils.escapeStringWin : utils.escapeStringPosix; // Add URL. - addParam(data.url); + commandParts.push(escapeString(data.url)); // Disable globbing if the URL contains brackets. // cURL also globs braces but they are already percent-encoded. if (data.url.includes("[") || data.url.includes("]")) { - addParam("--globoff"); + commandParts.push("--globoff"); } let postDataText = null; @@ -104,13 +98,13 @@ const Curl = { // which composed using \n only, not \r\n, may be not parsable for // peers which split parts of multipart payload using \r\n. postDataText = data.postDataText; - addPostData("--data-binary"); + postData.push("--data-binary"); const boundary = utils.getMultipartBoundary(data); const text = utils.removeBinaryDataFromMultipartText( postDataText, boundary ); - addPostData(text); + postData.push(escapeStringifNeeded(text)); ignoredHeaders.add("content-length"); } else if ( data.postDataText && @@ -119,8 +113,10 @@ const Curl = { ) { // When no postData exists, --data-raw should not be set postDataText = data.postDataText; - addPostData("--data-raw"); - addPostData(utils.writePostDataTextParams(postDataText)); + postData.push( + "--data-raw " + + escapeStringifNeeded(`${utils.writePostDataTextParams(postDataText)}`) + ); ignoredHeaders.add("content-length"); } // curl generates the host header itself based on the given URL @@ -128,20 +124,19 @@ const Curl = { // Add --compressed if the response is compressed if (utils.isContentEncodedResponse(data)) { - addParam("--compressed"); + commandParts.push("--compressed"); } // Add -I (HEAD) // For servers that supports HEAD. // This will fetch the header of a document only. if (data.method === "HEAD") { - addParam("-I"); + commandParts.push("-I"); } else if (data.method !== "GET") { // Add method. // For HEAD and GET requests this is not necessary. GET is the // default, -I implies HEAD. - addParam("-X"); - addParam(data.method); + commandParts.push("-X " + escapeStringifNeeded(`${data.method}`)); } // Add request headers. @@ -155,14 +150,26 @@ const Curl = { if (ignoredHeaders.has(header.name.toLowerCase())) { continue; } - addParam("-H"); - addParam(header.name + ": " + header.value); + commandParts.push( + "-H " + escapeStringifNeeded(`${header.name}: ${header.value}`) + ); } // Add post data. - command = command.concat(postData); + commandParts = commandParts.concat(postData); - return command.join(" "); + // Format with line breaks if the command has more than 2 parts + // e.g + // Command with 2 parts - curl https://foo.com + // Commands with more than 2 parts - + // curl https://foo.com + // -X POST + // -H "Accept : */*" + // -H "accept-language: en-US" + const joinStr = currentPlatform === "WINNT" ? " ^\n " : " \\\n "; + return ( + "curl " + commandParts.join(commandParts.length >= 3 ? joinStr : " ") + ); }, }; @@ -444,18 +451,16 @@ const CurlUtils = { same escape characters, they can interact with each other in horrible ways, the order of operations is critical. */ - const encapsChars = '"'; + const encapsChars = '^"'; return ( encapsChars + str - // Replace \ with \\ first because it is an escape character for certain // conditions in both parsers. .replace(/\\/g, "\\\\") - // Replace double quote chars with two double quotes (not by escaping with \") because it is - // recognized by both cmd.exe and MS Crt arguments parser. - .replace(/"/g, '""') + // Escape double quotes with double slashes. + .replace(/"/g, '\\"') // Escape ` and $ so commands do not get executed e.g $(calc.exe) or `\$(calc.exe) .replace(/[`$]/g, "\\$&") @@ -473,15 +478,10 @@ const CurlUtils = { // by the previous replace. .replace(/%(?=[a-zA-Z0-9_])/g, "%^") - // We replace \r and \r\n with \n, this allows to consistently escape all new - // lines in the next replace - .replace(/\r\n?/g, "\n") - // Lastly we replace new lines with ^ and TWO new lines because the first // new line is there to enact the escape command the second is the character // to escape (in this case new line). - // The extra " enables escaping new lines with ^ within quotes in cmd.exe. - .replace(/\n/g, '"^\r\n\r\n"') + + .replace(/\r?\n/g, "^\n\n") + encapsChars ); }, diff --git a/devtools/client/shared/test/xpcshell/test_curl.js b/devtools/client/shared/test/xpcshell/test_curl.js index a2a6c3412ee..7b1f0f93348 100644 --- a/devtools/client/shared/test/xpcshell/test_curl.js +++ b/devtools/client/shared/test/xpcshell/test_curl.js @@ -231,9 +231,10 @@ add_task(async function () { // Check binary data const dataBinaryPos = cmd.indexOf("--data-binary"); - const dataBinaryParam = `--data-binary ${isWin() ? "" : "$"}${escapeNewline( + const dataBinaryParam = `--data-binary ${isWin() ? "^\n " : "\\\n $"}${escapeNewline( quote(request.postDataText) )}`; + Assert.notStrictEqual( dataBinaryPos, -1, @@ -340,13 +341,15 @@ function isWin() { return Services.appinfo.OS === "WINNT"; } -const QUOTE = isWin() ? '"' : "'"; +const QUOTE = isWin() ? '^"' : "'"; // Quote a string, escape the quotes inside the string function quote(str) { let escaped; if (isWin()) { - escaped = str.replace(new RegExp(QUOTE, "g"), `${QUOTE}${QUOTE}`); + escaped = str + .replace(new RegExp(QUOTE, "g"), `${QUOTE}${QUOTE}`) + .replace(/"/g, '\\"'); } else { escaped = str.replace(new RegExp(QUOTE, "g"), `\\${QUOTE}`); } @@ -355,8 +358,10 @@ function quote(str) { function escapeNewline(txt) { if (isWin()) { - // Add `"` to close quote, then escape newline outside of quote, then start new quote - return txt.replace(/[\r\n]{1,2}/g, '"^$&$&"'); + // Replace new lines with ^ and TWO new lines because the first + // new line is there to enact the escape command the second is the character + // to escape (in this case new line). + return txt.replace(/\r?\n/g, "^\n\n"); } return txt.replace(/\r/g, "\\r").replace(/\n/g, "\\n"); } @@ -392,6 +397,6 @@ function parseCurl(curlCmd) { // This monster regexp parses the command line into an array of arguments, // recognizing quoted args with matching quotes and escaped quotes inside: // [ "curl 'url'", "--standalone-arg", "-arg-with-quoted-string 'value\'s'" ] - const matchRe = /[-A-Za-z1-9]+(?: \$?([\"'])(?:\\\1|.)*?\1)?/g; + const matchRe = /[-A-Za-z1-9]+(?: ([\^\\"']+)(?:\\\1|.)*?\1)?/g; return curlCmd.match(matchRe); } diff --git a/devtools/client/shared/thread-utils.js b/devtools/client/shared/thread-utils.js index 7f3aa4a8ac5..59698e10b04 100644 --- a/devtools/client/shared/thread-utils.js +++ b/devtools/client/shared/thread-utils.js @@ -15,6 +15,7 @@ const asyncStore = asyncStoreHelper("debugger", { xhrBreakpoints: ["xhr-breakpoints", []], eventListenerBreakpoints: ["event-listener-breakpoints", undefined], blackboxedRanges: ["blackboxedRanges", {}], + directoryRoots: ["directory-roots", {}], }); exports.asyncStore = asyncStore; diff --git a/devtools/server/actors/descriptors/tab.js b/devtools/server/actors/descriptors/tab.js index b7954d13099..9d9d18c28d3 100644 --- a/devtools/server/actors/descriptors/tab.js +++ b/devtools/server/actors/descriptors/tab.js @@ -221,10 +221,10 @@ class TabDescriptorActor extends Actor { } try { - const { data } = await lazy.PlacesUtils.promiseFaviconData( - this._getUrl() + const favicon = await lazy.PlacesUtils.favicons.getFaviconForPage( + lazy.PlacesUtils.toURI(this._getUrl()) ); - return data; + return favicon.rawData; } catch (e) { // Favicon unavailable for this url. return null; diff --git a/devtools/server/actors/page-style.js b/devtools/server/actors/page-style.js index f22454483d3..5dd24062eb9 100644 --- a/devtools/server/actors/page-style.js +++ b/devtools/server/actors/page-style.js @@ -421,7 +421,8 @@ class PageStyleActor extends Actor { const opts = { previewText: options.previewText, previewFontSize: options.previewFontSize, - fontStyle: weight + " " + style, + fontStyle: style, + fontWeight: weight, fillStyle: options.previewFillStyle, }; const { dataURL, size } = getFontPreviewData( diff --git a/devtools/server/actors/utils/style-utils.js b/devtools/server/actors/utils/style-utils.js index 9d33353600c..8488ccd155f 100644 --- a/devtools/server/actors/utils/style-utils.js +++ b/devtools/server/actors/utils/style-utils.js @@ -8,6 +8,7 @@ const XHTML_NS = "http://www.w3.org/1999/xhtml"; const FONT_PREVIEW_TEXT = "Abc"; const FONT_PREVIEW_FONT_SIZE = 40; const FONT_PREVIEW_FILLSTYLE = "black"; +const FONT_PREVIEW_FONT_FALLBACK = "serif"; // Offset (in px) to avoid cutting off text edges of italic fonts. const FONT_PREVIEW_OFFSET = 4; // Factor used to resize the canvas in order to get better text quality. @@ -36,6 +37,7 @@ function getFontPreviewData(font, doc, options) { const previewFontSize = options.previewFontSize || FONT_PREVIEW_FONT_SIZE; const fillStyle = options.fillStyle || FONT_PREVIEW_FILLSTYLE; const fontStyle = options.fontStyle || ""; + const fontWeight = options.fontWeight || ""; const canvas = doc.createElementNS(XHTML_NS, "canvas"); const ctx = canvas.getContext("2d"); @@ -59,7 +61,24 @@ function getFontPreviewData(font, doc, options) { } fontParts.push(f); } - const fontValue = `${fontStyle} ${previewFontSize}px ${fontParts.join(", ")}, serif`; + // Add a fallback value + fontParts.push(FONT_PREVIEW_FONT_FALLBACK); + + // Apply individual font properties to the canvas element so we can easily compute the + // canvas context font + // First, we need to start with a default shorthand to make it work + canvas.style.font = `${FONT_PREVIEW_FONT_SIZE}px ${FONT_PREVIEW_FONT_FALLBACK}`; + // Then we can set the different properties + canvas.style.fontFamily = fontParts.join(", "); + canvas.style.fontSize = `${previewFontSize}px`; + if (fontWeight) { + canvas.style.fontWeight = fontWeight; + } + if (fontStyle) { + canvas.style.fontStyle = fontStyle; + } + + const fontValue = canvas.style.font; // Get the correct preview text measurements and set the canvas dimensions ctx.font = fontValue; diff --git a/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js b/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js index e05b8cf5310..6b70a96acc6 100644 --- a/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js +++ b/devtools/server/tests/browser/browser_style_utils_getFontPreviewData.js @@ -176,5 +176,23 @@ add_task(async function () { `40px "Menlo Bold", "Fira Code", "Mono Lisa", monospace, serif`, "Expected font style was used in the canvas" ); + + // Check font-weight value + is( + getFontPreviewData(`monospace`, content.document, { fontWeight: "200" }) + .ctx.font, + `200 40px monospace, serif`, + "Expected font style was used in the canvas" + ); + + // Check font-style value + is( + getFontPreviewData(`monospace`, content.document, { + fontWeight: "200", + fontStyle: "italic", + }).ctx.font, + `italic 200 40px monospace, serif`, + "Expected font style was used in the canvas" + ); }); }); diff --git a/devtools/shared/compatibility/dataset/css-properties.json b/devtools/shared/compatibility/dataset/css-properties.json index eb8b638458c..4d24704dba7 100644 --- a/devtools/shared/compatibility/dataset/css-properties.json +++ b/devtools/shared/compatibility/dataset/css-properties.json @@ -1 +1 @@ -{"-moz-float-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-force-broken-image-icon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-image-region":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"111","added":1,"removed":112}],"firefox_android":[{"version_last":"111","added":4,"removed":112}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-orient","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-moz-user-focus":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"121","added":1,"removed":122}],"firefox_android":[{"version_last":"121","added":4,"removed":122}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-user-input":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"none":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-webkit-app-region":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-webkit-border-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-border-horizontal-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-border-vertical-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-box-reflect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-axis":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":17,"removed":35}],"chrome_android":[{"version_last":"34","added":18,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-column-break-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-inside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-progression":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":22,"removed":35}],"chrome_android":[{"version_last":"34","added":25,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-cursor-visibility":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-hyphenate-limit-after":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-before":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-lines":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":16,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-align":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-box-contain":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"46","added":12,"removed":47}],"chrome_android":[{"version_last":"46","added":18,"removed":47}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-line-grid":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":17,"removed":34}],"chrome_android":[{"version_last":"33","added":18,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-snap":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-locale":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-logical-height":{"_aliasOf":"block-size"},"-webkit-logical-width":{"_aliasOf":"inline-size"},"-webkit-margin-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-margin-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-mask-box-image":{"_aliasOf":"mask-border"},"-webkit-mask-composite":{"_aliasOf":"mask-composite"},"-webkit-mask-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-repeat-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-repeat-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-source-type":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-max-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-max-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-nbsp-mode":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"27","added":1,"removed":28}],"chrome_android":[{"version_last":"27","added":18,"removed":28}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-rtl-ordering":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-tap-highlight-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":4}]}}},"-webkit-text-combine":{"_aliasOf":"text-combine-upright"},"-webkit-text-decorations-in-effect":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"13","added":4,"removed":13.1}],"safari_ios":[{"version_last":"13","added":3.2,"removed":13.4}]}}},"-webkit-text-fill-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-fill-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-security":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-security","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":114}],"firefox_android":[{"added":114}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]}}},"-webkit-text-stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-zoom":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]}}},"-webkit-touch-callout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":2}]}}},"-webkit-transform-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-z":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-user-drag":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"accent-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/accent-color","spec_url":"https://drafts.csswg.org/css-ui/#widget-accent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":15.4}],"safari_ios":[{"partial_implementation":true,"added":15.4}]},"tags":["web-features:accent-color"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:accent-color"]}}},"align-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"block_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-justify-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:align-content-block"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/41344054","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/41344054","added":false}],"edge":[{"impl_url":"https://crbug.com/41344054","added":false}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":11}],"safari_ios":[{"partial_implementation":true,"added":11}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.6}],"safari_ios":[{"added":15.6}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-grid/#grid-align"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-multicol/#the-multi-column-model"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:multi-column"]}},"_aliasOf":"align-content"},"align-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-items","spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"_aliasOf":"align-items"},"align-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-self","spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"partial_implementation":true,"version_last":"35","added":21,"removed":36}],"chrome_android":[{"added":36},{"partial_implementation":true,"version_last":"35","added":25,"removed":36}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"_aliasOf":"align-self","-ms-grid_context":{"_aliasOf":"grid_context"}},"alignment-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/alignment-baseline","spec_url":["https://drafts.csswg.org/css-inline/#alignment-baseline-property","https://svgwg.org/svg2-draft/text.html#AlignmentBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]},"alphabetic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:alignment-baseline"]}},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"central":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"ideographic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"mathematical":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"middle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}}},"all":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/all","spec_url":"https://drafts.csswg.org/css-cascade/#all-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":27}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:all"]}},"alt":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}],"safari_ios":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}]}},"_aliasOf":"alt"},"anchor-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/anchor-name","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-name-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"anchor-scope":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#propdef-anchor-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"animation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation","spec_url":"https://drafts.csswg.org/css-animations/#animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"animation-timeline_included":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":115}],"chrome_android":[{"partial_implementation":true,"added":115}],"edge":[{"partial_implementation":true,"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-driven-animations"]}},"_aliasOf":"animation"},"animation-composition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-composition","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-composition","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:animation-composition"]}},"animation-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-delay","spec_url":"https://drafts.csswg.org/css-animations/#animation-delay","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"_aliasOf":"animation-delay"},"animation-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-direction","spec_url":"https://drafts.csswg.org/css-animations/#animation-direction","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"alternate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"alternate-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-direction"},"animation-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration","spec_url":"https://drafts.csswg.org/css-animations/#animation-duration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:animations-css"]},"auto":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration#Values","spec_url":"https://drafts.csswg.org/css-animations-2/#valdef-animation-duration-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-duration"},"animation-fill-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode","spec_url":"https://drafts.csswg.org/css-animations/#animation-fill-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4}]},"tags":["web-features:animations-css"]},"backwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-backwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"forwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-forwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-fill-mode"},"animation-iteration-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count","spec_url":"https://drafts.csswg.org/css-animations/#animation-iteration-count","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"infinite":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-iteration-count-infinite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-iteration-count"},"animation-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-name","spec_url":"https://drafts.csswg.org/css-animations/#animation-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-name"},"animation-play-state":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-play-state","spec_url":"https://drafts.csswg.org/css-animations/#animation-play-state","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:animations-css"]},"paused":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-paused","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"running":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-running","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-play-state"},"animation-range":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"animation-range-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-end","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-end-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-range-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-start","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-start-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-timeline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"scroll":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/scroll","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/view","spec_url":"https://drafts.csswg.org/scroll-animations/#view-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function","spec_url":["https://drafts.csswg.org/css-animations/#animation-timing-function","https://drafts.csswg.org/css-easing/#linear-easing-function-parsin"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-timing-function"},"appearance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/appearance","spec_url":"https://drafts.csswg.org/css-ui/#appearance-switching","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":12}],"firefox":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":1}]},"tags":["web-features:appearance"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":80}],"firefox_android":[{"added":80}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:appearance"]}},"base":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-base","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"base-select","added":134}],"chrome_android":[{"alternative_name":"base-select","added":134}],"edge":[{"alternative_name":"base-select","added":134}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:appearance"]},"_aliasOf":"base"},"button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"checkbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-checkbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"listbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-listbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist-button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":80},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":80},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"meter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-meter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":54},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":54},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":3}]},"tags":["web-features:appearance"]}},"progress-bar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-progress-bar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"radio":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-radio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"searchfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-searchfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textarea":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textarea","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"_aliasOf":"appearance","base-select":{"_aliasOf":"base"}},"aspect-ratio":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio","spec_url":"https://drafts.csswg.org/css-sizing-4/#aspect-ratio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-aspect-ratio-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]}}},"backdrop-filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter","spec_url":"https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":17,"removed":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":18},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":18},{"prefix":"-webkit-","added":9}]},"tags":["web-features:backdrop-filter"]},"_aliasOf":"backdrop-filter"},"backface-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backface-visibility","spec_url":"https://drafts.csswg.org/css-transforms-2/#backface-visibility-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":5}]},"tags":["web-features:transforms3d"]},"_aliasOf":"backface-visibility"},"background":{"SVG_image_as_background":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3.1}],"safari_ios":[{"added":1}]},"tags":["web-features:svg"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]},"background-clip":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-clip"]}},"background-origin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-origin"]}},"background-size":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":18}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-size"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]}}},"background-attachment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-attachment","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-attachment","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":2}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":14,"removed":15.4},{"version_last":"13.1","added":3.1,"removed":14}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":5,"removed":15.4}]},"tags":["web-features:background-attachment"]}},"local":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-local","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":25}],"firefox_android":[{"added":25}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.1","added":5,"removed":13}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.2","added":4.2,"removed":13}]},"tags":["web-features:background-attachment"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}}},"background-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#background-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":35}],"chrome_android":[{"added":35}],"edge":[{"added":79}],"firefox":[{"added":30}],"firefox_android":[{"added":30}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-blend-mode"]}},"background-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-clip","spec_url":["https://drafts.csswg.org/css-backgrounds/#background-clip","https://drafts.csswg.org/css-backgrounds-4/#background-clip"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-clip"]},"border-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-border-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:background-clip-border-area"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-clip"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"partial_implementation":true,"added":3}],"chrome_android":[{"added":120},{"partial_implementation":true,"added":18}],"edge":[{"added":120},{"partial_implementation":true,"added":79},{"version_last":"18","added":15,"removed":79},{"partial_implementation":true,"version_last":"14","added":12,"removed":15}],"firefox":[{"partial_implementation":true,"added":49}],"firefox_android":[{"partial_implementation":true,"added":49}],"ie":[{"added":false}],"safari":[{"added":14},{"partial_implementation":true,"added":4}],"safari_ios":[{"added":14},{"partial_implementation":true,"added":3.2}]},"tags":["web-features:background-clip-text"]}},"_aliasOf":"background-clip"},"background-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-color"]}},"background-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]},"element":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/element","spec_url":"https://drafts.csswg.org/css-images-4/#element-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","added":4}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:element"]},"_aliasOf":"element"},"gradients":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:gradients"]}},"image-rect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-rect","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"firefox_android":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"_aliasOf":"image-rect"},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"svg_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}},"-moz-element":{"_aliasOf":"element"},"-moz-image-rect":{"_aliasOf":"image-rect"},"-webkit-image-set":{"_aliasOf":"image-set"}},"background-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-origin","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":3},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":1},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-origin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-origin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"_aliasOf":"background-origin"},"background-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:background-position"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:background-position"]}}},"background-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-x","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-y","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-repeat":{"2-value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4}]},"tags":["web-features:background-repeat"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"no-repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-no-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}}},"background-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-size","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"3.6","added":3.6,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-size"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-size"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"_aliasOf":"background-size"},"baseline-shift":{"__compat":{"spec_url":["https://drafts.csswg.org/css-inline/#baseline-shift-property","https://svgwg.org/svg2-draft/text.html#BaselineShiftProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:baseline-shift"]}}},"baseline-source":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#baseline-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}}},"block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/block-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-height","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-height","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-height","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-height","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-height","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"block-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border","spec_url":"https://drafts.csswg.org/css-backgrounds/#propdef-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-left-radius"},"border-bottom-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-right-radius"},"border-bottom-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-collapse","spec_url":"https://drafts.csswg.org/css2/#propdef-border-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1.2}],"safari_ios":[{"added":3}]},"tags":["web-features:table"]},"collapse":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}},"separate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}}},"border-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-color","spec_url":["https://drafts.csswg.org/css-logical/#logical-shorthand-keyword","https://drafts.csswg.org/css-backgrounds/#border-color"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-end-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-end-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16},{"prefix":"-webkit-","added":7}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":15},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":15},{"prefix":"-moz-","added":4}],"ie":[{"added":11}],"safari":[{"added":6},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:border-image"]},"fill":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"gradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":7}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":29}],"firefox_android":[{"added":29}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:border-image"]}},"optional_border_image_slice":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"_aliasOf":"border-image"},"border-image-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-outset","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":50}],"firefox_android":[{"added":50}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}}},"border-image-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-slice","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"_aliasOf":"border-image-slice"},"border-image-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-source","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}}},"border-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-color"},"border-inline-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-style"},"border-inline-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-width","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-width","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-width"},"border-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-color"},"border-inline-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-style"},"border-inline-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-radius":{"4_values_for_4_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-moz-","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_borders":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-radius"},"border-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-spacing","spec_url":"https://drafts.csswg.org/css2/#separated-borders","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"border-start-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-start-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}}},"border-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-left-radius"},"border-top-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-right-radius"},"border-top-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:borders"]}},"bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/bottom","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"box-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-align","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-align"},"box-decoration-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break","spec_url":"https://drafts.csswg.org/css-break/#break-decoration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":25}],"edge":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"prefix":"-webkit-","added":7}],"safari_ios":[{"partial_implementation":true,"prefix":"-webkit-","added":7}]},"tags":["web-features:box-decoration-break"]},"clone":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-clone","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"slice":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"_aliasOf":"box-decoration-break"},"box-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-direction","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-direction"},"box-flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex"},"box-flex-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex-group"},"box-lines":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-lines","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-lines"},"box-ordinal-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-ordinal-group"},"box-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-orient","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-orient"},"box-pack":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-pack","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-pack"},"box-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-shadow","spec_url":"https://drafts.csswg.org/css-backgrounds/#box-shadow","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"12","added":3.5,"removed":13}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-shadow"]},"inset":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"multiple_shadows":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:box-shadow"]}},"spread_radius":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"_aliasOf":"box-shadow"},"box-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-sizing","spec_url":"https://drafts.csswg.org/css-sizing/#box-sizing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":8}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-sizing"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"_aliasOf":"box-sizing"},"break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-after","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}}},"break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-before","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}}},"break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-inside","spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}}},"caption-side":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caption-side","spec_url":["https://drafts.csswg.org/css2/#propdef-caption-side","https://drafts.csswg.org/css-logical/#caption-side"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]},"bottom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}},"bottom-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":13.1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":13.4,"removed":17}]}}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":13.1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":13.4,"removed":17}]}}},"top":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:table"]}},"top-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"writing-mode_relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":42}],"firefox_android":[{"added":42}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}}},"caret-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caret-color","spec_url":"https://drafts.csswg.org/css-ui/#caret-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:caret-color"]}},"clear":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clear","spec_url":["https://drafts.csswg.org/css2/#propdef-clear","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip","spec_url":"https://drafts.fxtf.org/css-masking/#clip-property","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:clip"]},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip"]}}},"clip-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-path","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":23}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"partial_implementation":true,"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:clip-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#typedef-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":54}],"firefox_android":[{"added":54}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:clip-path-animatable"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1},{"prefix":"-webkit-","added":10}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":10}]},"tags":["web-features:clip-path"]},"_aliasOf":"path"},"stroke-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"_aliasOf":"clip-path","-webkit-path":{"_aliasOf":"path"}},"clip-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-rule","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}}},"color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color","spec_url":["https://drafts.csswg.org/css-color/#the-color-property","https://svgwg.org/svg2-draft/painting.html#ColorProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:color"]}},"color-adjust":{"_aliasOf":"print-color-adjust"},"color-interpolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation","spec_url":"https://svgwg.org/svg2-draft/painting.html#ColorInterpolationProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"linearGradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":123}],"firefox_android":[{"added":123}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"sRGB":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"color-interpolation-filters":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation-filters","spec_url":"https://drafts.fxtf.org/filter-effects/#ColorInterpolationFiltersProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]}},"linearRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-linearrgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}},"sRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-srgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}}},"color-scheme":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-scheme","spec_url":"https://drafts.csswg.org/css-color-adjust/#color-scheme-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]},"dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"normal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}}},"column-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-count","spec_url":"https://drafts.csswg.org/css-multicol/#cc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":4,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-count-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-count"},"column-fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-fill","spec_url":"https://drafts.csswg.org/css-multicol/#cf","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":17,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":17,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:column-fill"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"_aliasOf":"column-fill"},"column-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-gap","spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-column-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-column-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-column-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":10},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":10},{"prefix":"-webkit-","added":3}]},"tags":["web-features:multi-column"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:multi-column"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12}],"safari_ios":[{"added":12}]},"tags":["web-features:multi-column"]}},"_aliasOf":"multicol_context"},"grid-column-gap":{"_aliasOf":"grid_context"},"-webkit-multicol_context":{"_aliasOf":"multicol_context"},"-moz-multicol_context":{"_aliasOf":"multicol_context"}},"column-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule","spec_url":"https://drafts.csswg.org/css-multicol/#column-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule"},"column-rule-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-color","spec_url":"https://drafts.csswg.org/css-multicol/#crc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-color"},"column-rule-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-style","spec_url":"https://drafts.csswg.org/css-multicol/#crs","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-style"},"column-rule-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-width","spec_url":"https://drafts.csswg.org/css-multicol/#crw","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-width"},"column-span":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-span","spec_url":"https://drafts.csswg.org/css-multicol/#column-span","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":5}]},"tags":["web-features:column-span"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"_aliasOf":"column-span"},"column-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-width","spec_url":["https://drafts.csswg.org/css-sizing/#column-sizing","https://drafts.csswg.org/css-multicol/#cw"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":50},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-width"},"columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/columns","spec_url":"https://drafts.csswg.org/css-multicol/#columns","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":9,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":22}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:multi-column"]},"_aliasOf":"columns"},"contain":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain","spec_url":"https://drafts.csswg.org/css-contain/#contain-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#inline-size","spec_url":"https://drafts.csswg.org/css-contain-2/#valdef-contain-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":101}],"firefox_android":[{"added":101}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:contain-inline-size"]}},"layout":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-layout"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"paint":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-paint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-paint"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-size"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#style","spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-style"]}}},"contain-intrinsic-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-block-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-block-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-height","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-inline-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"auto_none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"container":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"container-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-name","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"container-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-type","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"scroll-state":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-scroll-state","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:container-scroll-state-queries"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content","spec_url":"https://drafts.csswg.org/css-content/#content-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]},"alt_text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":128}],"firefox_android":[{"added":128}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:alt-text-generated-content"]}},"element_replacement":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:content"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":113}],"firefox_android":[{"partial_implementation":true,"added":113}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:content"]}},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"none_applies_to_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.element-content-none.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:content"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"url":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/url_value","spec_url":"https://drafts.csswg.org/css-values/#urls","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"-webkit-image-set":{"_aliasOf":"image-set"}},"content-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content-visibility","spec_url":"https://drafts.csswg.org/css-contain/#content-visibility","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}],"safari_ios":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}]},"tags":["web-features:content-visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}}},"counter-increment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-increment","spec_url":"https://drafts.csswg.org/css-lists/#increment-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}}},"counter-reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-reset","spec_url":"https://drafts.csswg.org/css-lists/#counter-reset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":28}],"chrome_android":[{"partial_implementation":true,"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"partial_implementation":true,"added":9}],"safari_ios":[{"partial_implementation":true,"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-reset-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}},"reset_does_not_affect_siblings":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":82}],"firefox_android":[{"added":82}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counters"]}},"reversed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#css-counter-reversed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counter-reset-reversed"]}}},"counter-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-set","spec_url":"https://drafts.csswg.org/css-lists/#propdef-counter-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}}},"cursor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cursor","spec_url":"https://drafts.csswg.org/css-ui/#cursor","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]},"alias":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-alias","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"all-scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-all-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"cell":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-cell","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"col-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-col-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"context-menu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-context-menu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"copy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-copy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"crosshair":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-crosshair","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"default":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-default","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"e-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-e-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ew-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ew-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"grab":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":27},{"prefix":"-moz-","added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grab"},"grabbing":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-grabbing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grabbing"},"help":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-help","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"move":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-move","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"n-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-n-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ne-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ne-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nesw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nesw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"no-drop":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-no-drop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":95}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"not-allowed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-not-allowed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ns-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ns-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nwse-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nwse-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"pointer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-pointer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"progress":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-progress","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"row-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-row-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"s-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-s-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"se-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-se-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"sw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-sw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url_positioning_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"vertical-text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-vertical-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"w-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-w-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"wait":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-wait","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"zoom-in":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-in","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-in"},"zoom-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-out","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-out"},"-webkit-grab":{"_aliasOf":"grab"},"-moz-grab":{"_aliasOf":"grab"},"-webkit-grabbing":{"_aliasOf":"grabbing"},"-webkit-zoom-in":{"_aliasOf":"zoom-in"},"-moz-zoom-in":{"_aliasOf":"zoom-in"},"-webkit-zoom-out":{"_aliasOf":"zoom-out"},"-moz-zoom-out":{"_aliasOf":"zoom-out"}},"custom-property":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/--*","spec_url":"https://drafts.csswg.org/css-variables/#defining-variables","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":15}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:custom-properties"]}},"cx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"cy":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cy","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"d":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/d","spec_url":"https://svgwg.org/svg2-draft/paths.html#TheDProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/direction","spec_url":["https://drafts.csswg.org/css-writing-modes/#direction","https://svgwg.org/svg2-draft/text.html#DirectionProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"ltr":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-ltr","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"rtl":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-rtl","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"vertical_slider_direction":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124}],"chrome_android":[{"added":124}],"edge":[{"added":124}],"firefox":[{"partial_implementation":true,"added":120}],"firefox_android":[{"partial_implementation":true,"added":120}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":16.5}],"safari_ios":[{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}}},"display":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display","spec_url":["https://drafts.csswg.org/css-display/#the-display-properties","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":37}],"firefox_android":[{"added":37}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:display-contents"]},"contents_unusual":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-contents"]}},"focusable_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40866683","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40866683","added":false}],"edge":[{"impl_url":"https://crbug.com/40866683","added":false}],"firefox":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"firefox_android":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/255149","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/255149","added":false}]},"tags":["web-features:display-contents"]}}},"flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"partial_implementation":true,"added":11},{"alternative_name":"-ms-flexbox","partial_implementation":true,"added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex"},"flow-root":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58}],"chrome_android":[{"added":58}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:display-flow-root"]}},"grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid"},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8},{"partial_implementation":true,"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-inline-flexbox","added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"inline-flex"},"inline-grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"inline-grid"},"inline-table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"list-item":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display-listitem","spec_url":"https://drafts.csswg.org/css-display/#typedef-display-listitem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-list-item"]},"legend-support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-list-item"]}}},"math":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"multi-keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:two-value-display"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"option_is_hidden":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display"]}}},"ruby":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:display-table"]}},"table-cell":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-footer-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-header-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flexbox":{"_aliasOf":"flex"},"-ms-grid":{"_aliasOf":"grid"},"-webkit-inline-flex":{"_aliasOf":"inline-flex"},"-ms-inline-flexbox":{"_aliasOf":"inline-flex"},"-ms-inline-grid":{"_aliasOf":"inline-grid"}},"dominant-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/dominant-baseline","spec_url":["https://drafts.csswg.org/css-inline/#dominant-baseline-property","https://svgwg.org/svg2-draft/text.html#DominantBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]},"alphabetic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-alphabetic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"central":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-central","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"mathematical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-mathematical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:dominant-baseline"]}}},"dynamic-range-limit":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#the-dynamic-range-limit-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"constrained-high":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-constrained-high","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"high":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-high","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"standard":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-standard","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"empty-cells":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/empty-cells","spec_url":"https://drafts.csswg.org/css2/#empty-cells","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"field-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/field-sizing","spec_url":"https://drafts.csswg.org/css-ui/#field-sizing","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-fixed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}}},"fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"fill-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity-svg"]}},"fill-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-rule","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/filter","spec_url":"https://drafts.fxtf.org/filter-effects/#FilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53},{"prefix":"-webkit-","added":18}],"chrome_android":[{"added":53}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":35},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":35},{"prefix":"-webkit-","added":49}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":6}]},"tags":["web-features:filter"]},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/246106","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/246106","added":false}]},"tags":["web-features:svg-filters"]}},"_aliasOf":"filter"},"flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex"},"flex-basis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-basis","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-basis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":22},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":22},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":22}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"auto"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":94},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"fit-content"},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"min-content"},"_aliasOf":"flex-basis","-webkit-auto":{"_aliasOf":"auto"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"flex-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-direction","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-direction-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"column-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-direction"},"flex-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-flow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-flow"},"flex-grow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-grow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-grow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-flex-positive","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"less_than_zero_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-grow"},"flex-shrink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-shrink","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-shrink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-shrink"},"flex-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-wrap","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"partial_implementation":true,"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-wrap"},"float":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/float","spec_url":["https://drafts.csswg.org/css2/#propdef-float","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"flood-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-color","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"flood-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-opacity","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"font":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font","spec_url":"https://drafts.csswg.org/css-fonts/#font-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]},"caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"font-width_keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]}},"icon":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"menu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"message-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"small-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"status-bar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}}},"font-family":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family","spec_url":["https://drafts.csswg.org/css-fonts/#generic-font-families","https://drafts.csswg.org/css-fonts/#font-family-prop"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-family"]},"math":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#math","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-family-math"]}},"system-ui":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#system-ui","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":92},{"alternative_name":"-apple-system","added":43}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"-apple-system","added":9}],"safari_ios":[{"added":11},{"alternative_name":"-apple-system","added":9}]},"tags":["web-features:font-family-system"]},"_aliasOf":"system-ui"},"ui-monospace":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-monospace","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-rounded":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-rounded","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-sans-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-sans-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"-apple-system":{"_aliasOf":"system-ui"}},"font-feature-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":15}],"firefox":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"firefox_android":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"ie":[{"added":10}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]}},"_aliasOf":"font-feature-settings"},"font-kerning":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-kerning","spec_url":"https://drafts.csswg.org/css-fonts/#font-kerning-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"chrome_android":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":6}]},"tags":["web-features:font-kerning"]},"_aliasOf":"font-kerning"},"font-language-override":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-language-override","spec_url":"https://drafts.csswg.org/css-fonts/#font-language-override-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":34},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-language-override"]},"_aliasOf":"font-language-override"},"font-optical-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing","spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-auto-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}}},"font-palette":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette","spec_url":"https://drafts.csswg.org/css-fonts/#font-palette-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]},"animation_computed":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}},"dark":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-dark","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"light":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-light","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"palette-mix_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette/palette-mix","spec_url":"https://drafts.csswg.org/css-fonts/#typedef-font-palette-palette-mix","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}}},"font-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size","spec_url":"https://drafts.csswg.org/css-fonts/#font-size-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-size"]},"math":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"rem_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":42}],"edge":[{"added":12}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-size"]}},"xxx-large":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size"]}}},"font-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust","spec_url":"https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3},{"partial_implementation":true,"version_last":"2","added":1,"removed":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]}},"two-values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}}},"font-smooth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-smooth","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"alternative_name":"-webkit-font-smoothing","added":5}],"chrome_android":[{"alternative_name":"-webkit-font-smoothing","added":18}],"edge":[{"alternative_name":"-webkit-font-smoothing","added":79}],"firefox":[{"alternative_name":"-moz-osx-font-smoothing","added":25}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-font-smoothing","added":4}],"safari_ios":[{"alternative_name":"-webkit-font-smoothing","added":3.2}]}},"_aliasOf":"font-smooth"},"font-stretch":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-stretch","spec_url":"https://drafts.csswg.org/css-fonts/#font-stretch-prop","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":9}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]},"percentage":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":18}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-stretch"]}}},"font-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-style-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]},"italic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-italic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"oblique-angle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-oblique-angle--90deg-90deg","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-style"]}}},"font-synthesis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-synthesis"]},"position":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis"]}},"small-caps":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"weight":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}}},"font-synthesis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-position","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}}},"font-synthesis-small-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-small-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}}},"font-synthesis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}}},"font-synthesis-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-weight","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}}},"font-variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant","spec_url":["https://drafts.csswg.org/css-fonts/#font-variant-prop","https://svgwg.org/svg2-draft/text.html#FontVariantProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]},"css_fonts_shorthand":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-size-adjust-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-variant"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:font-variant"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}}},"font-variant-alternates":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]},"annotation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#annotation()","spec_url":"https://drafts.csswg.org/css-fonts/#annotation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"character_variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#character-variant()","spec_url":"https://drafts.csswg.org/css-fonts/#character-variant","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-alternates"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-alternates"]}},"ornaments":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#ornaments()","spec_url":"https://drafts.csswg.org/css-fonts/#ornaments","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"styleset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#styleset()","spec_url":"https://drafts.csswg.org/css-fonts/#styleset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"stylistic":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#stylistic()","spec_url":"https://drafts.csswg.org/css-fonts/#stylistic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"swash":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#swash()","spec_url":"https://drafts.csswg.org/css-fonts/#swash","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}}},"font-variant-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-caps-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]},"all-petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"all-small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"titling-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-titling-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"unicase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-unicase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}}},"font-variant-east-asian":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis04":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis04","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis78":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis78","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis83":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis83","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis90":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis90","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"proportional-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-proportional-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"ruby":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-ruby","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"simplified":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-simplified","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"traditional":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-traditional","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}}},"font-variant-emoji":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-emoji","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-emoji-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"flags":[{"name":"layout.css.font-variant-emoji.enabled","type":"preference","value_to_set":"true"}],"added":108}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}],"safari_ios":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}]},"tags":["web-features:font-variant-emoji"]},"emoji":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-emoji","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-text","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"unicode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-unicode","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}}},"font-variant-ligatures":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34},{"prefix":"-webkit-","added":31}],"chrome_android":[{"added":34},{"prefix":"-webkit-","added":31}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:font-variant-ligatures"]},"common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-common-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"_aliasOf":"font-variant-ligatures"},"font-variant-numeric":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]},"diagonal-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-diagonal-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"lining-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-lining-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"oldstyle-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-oldstyle-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"ordinal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-ordinal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"proportional-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-proportional-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"slashed-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-slashed-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"stacked-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-stacked-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"tabular-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-tabular-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}}},"font-variant-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-position"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-position"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-variant-position"]}}},"font-variation-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-variation-settings-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-variation-settings"]}},"font-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-weight-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]},"bold":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bold","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"bolder":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bolder","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"lighter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"number":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-weight"]}}},"font-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#propdef-font-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]},"condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}}},"forced-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#forced-color-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79},{"alternative_name":"-ms-high-contrast-adjust","added":12}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"alternative_name":"-ms-high-contrast-adjust","added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"preserve-parent-color":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-preserve-parent-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":106}],"chrome_android":[{"added":106}],"edge":[{"added":106}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"_aliasOf":"forced-color-adjust"},"gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gap","spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-gap","added":10.3}]},"tags":["web-features:grid"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:grid"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:multi-column"]}},"grid-gap":{"_aliasOf":"grid_context"}},"glyph-orientation-vertical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes-4/#glyph-orientation","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:glyph-orientation-vertical"]}},"grid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid","spec_url":"https://drafts.csswg.org/css-grid/#grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-area","spec_url":"https://drafts.csswg.org/css-grid/#propdef-grid-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-auto-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-columns"},"grid-auto-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow","spec_url":"https://drafts.csswg.org/css-grid/#grid-auto-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"dense":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-dense","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-auto-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-rows"},"grid-column":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-template":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template","spec_url":"https://drafts.csswg.org/css-grid/#explicit-grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-areas":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas","spec_url":"https://drafts.csswg.org/css-grid/#grid-template-areas-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-areas-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-columns"},"grid-template-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Masonry_layout","spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-rows"},"hanging-punctuation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation","spec_url":"https://drafts.csswg.org/css-text/#hanging-punctuation-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":10}],"safari_ios":[{"partial_implementation":true,"added":10}]},"tags":["web-features:hanging-punctuation"]},"allow-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-allow-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:hanging-punctuation"]}}},"height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/height","spec_url":["https://drafts.csswg.org/css-sizing/#preferred-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"hyphenate-character":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-character","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-character","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":106},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":106},{"prefix":"-webkit-","added":18}],"edge":[{"added":106},{"prefix":"-webkit-","added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":5}]},"tags":["web-features:hyphenate-character"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-character-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphenate-character"]}},"_aliasOf":"hyphenate-character"},"hyphenate-limit-chars":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-limit-chars","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-chars","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-limit-chars-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]}}},"hyphens":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphens","spec_url":"https://drafts.csswg.org/css-text/#hyphens-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":13}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":43},{"prefix":"-moz-","added":6}],"firefox_android":[{"added":43},{"prefix":"-moz-","added":6}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:hyphens"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88},{"partial_implementation":true,"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":88},{"partial_implementation":true,"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":4.2}]},"tags":["web-features:hyphens"]}},"language_afrikaans":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_albanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_armenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_assamese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_basque":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_belarusian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bengali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bosnian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bulgarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_catalan":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_croatian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_cyrillic_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_czech":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_danish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_dutch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_english":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":12}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":10}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_esperanto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_estonian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_mul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_und":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_finnish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_french":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_galician":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_georgian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_reformed_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_german_swiss_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_traditional_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_gujarati":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hindi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hungarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_icelandic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_interlingua":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_irish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_italian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_kannada":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_kurmanji":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latvian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_lithuanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_malayalam":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_marathi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_modern_greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_norwegian_nn":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_norwegian_no":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_old_slavonic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_oriya":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_polish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_portuguese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_punjabi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_russian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_slovak":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_slovenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_spanish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_swedish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_tamil":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_telugu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_turkish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_turkmen":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ukrainian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_upper_sorbian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_welsh":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"_aliasOf":"hyphens"},"image-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-orientation","spec_url":"https://drafts.csswg.org/css-images/#the-image-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]},"from-image":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-from-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}}},"image-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-rendering","spec_url":["https://drafts.csswg.org/css-images/#the-image-rendering","https://svgwg.org/svg2-draft/painting.html#ImageRendering"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]}},"crisp-edges":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-crisp-edges","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-optimize-contrast","added":13}],"chrome_android":[{"alternative_name":"-webkit-optimize-contrast","added":18}],"edge":[{"alternative_name":"-webkit-optimize-contrast","added":79}],"firefox":[{"added":65},{"prefix":"-moz-","added":3.6}],"firefox_android":[{"added":65},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}],"safari_ios":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}]},"tags":["web-features:crisp-edges"]},"_aliasOf":"crisp-edges"},"optimizeQuality":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"optimizeSpeed":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"pixelated":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-pixelated","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:image-rendering"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-smooth","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:smooth"]}},"-webkit-optimize-contrast":{"_aliasOf":"crisp-edges"},"-moz-crisp-edges":{"_aliasOf":"crisp-edges"}},"ime-mode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#input-method-editor","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ime-mode"]},"_aliasOf":"ime-mode"},"initial-letter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/initial-letter","spec_url":"https://drafts.csswg.org/css-inline/#sizing-drop-initials","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"impl_url":"https://bugzil.la/1223880","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1223880","added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":9}],"safari_ios":[{"prefix":"-webkit-","added":9}]},"tags":["web-features:initial-letter"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-initial-letter-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:initial-letter"]}},"_aliasOf":"initial-letter"},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inline-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-width","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-width","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-width","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-width","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-width","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset","https://drafts.csswg.org/css-position/#propdef-inset"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}}},"inset-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block","https://drafts.csswg.org/css-position/#propdef-inset-block"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block"},"inset-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-end","https://drafts.csswg.org/css-position/#propdef-inset-block-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-end"},"inset-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-start","https://drafts.csswg.org/css-position/#propdef-inset-block-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-start"},"inset-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline","https://drafts.csswg.org/css-position/#propdef-inset-inline"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline"},"inset-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-end","https://drafts.csswg.org/css-position/#propdef-inset-inline-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-end"},"inset-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-start","https://drafts.csswg.org/css-position/#propdef-inset-inline-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-start"},"interactivity":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#propdef-interactivity","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inert":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-inert","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"interpolate-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/interpolate-size","spec_url":"https://drafts.csswg.org/css-values-5/#interpolate-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]},"allow-keywords":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-allow-keywords","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}},"numeric-only":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-numeric-only","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}}},"isolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/isolation","spec_url":"https://drafts.fxtf.org/compositing/#isolation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:isolation"]}},"justify-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"left_right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"_aliasOf":"justify-content"},"justify-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-items","spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"justify-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-self","spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"-ms-grid_context":{"_aliasOf":"grid_context"}},"left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/left","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"letter-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/letter-spacing","spec_url":["https://drafts.csswg.org/css-text/#letter-spacing-property","https://svgwg.org/svg2-draft/text.html#LetterSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-letter-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"lighting-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/lighting-color","spec_url":"https://drafts.fxtf.org/filter-effects/#LightingColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"line-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-break","spec_url":"https://drafts.csswg.org/css-text/#line-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":58},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":11},{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":1}]},"tags":["web-features:line-break"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:line-break"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:line-break"]}},"loose":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-loose","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:line-break"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"_aliasOf":"line-break"},"line-clamp":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-clamp","spec_url":"https://drafts.csswg.org/css-overflow-4/#propdef-line-clamp","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":6}],"chrome_android":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":17}],"firefox":[{"prefix":"-webkit-","added":68}],"firefox_android":[{"prefix":"-webkit-","added":68}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:line-clamp"]},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:line-clamp"]}},"_aliasOf":"line-clamp"},"line-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height","spec_url":"https://drafts.csswg.org/css-inline/#line-height-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-line-height-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]}}},"line-height-step":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height-step","spec_url":"https://drafts.csswg.org/css-rhythm/#line-height-step","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"chrome_android":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"edge":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:rhythmic-sizing"]}},"list-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style","spec_url":"https://drafts.csswg.org/css-lists/#list-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}}},"list-style-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-image","spec_url":"https://drafts.csswg.org/css-lists/#image-markers","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-position","spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"inside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-position-inside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"outside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-type","spec_url":["https://drafts.csswg.org/css-lists/#text-markers","https://drafts.csswg.org/css-counter-styles/#extending-css2"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"afar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"arabic-indic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-arabic-indic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"arabic-indic"},"armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"asterisks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"bengali":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-bengali","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"bengali"},"binary":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"cambodian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cambodian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"cjk-decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"cjk-earthly-branch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-earthly-branch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-earthly-branch"},"cjk-heavenly-stem":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-heavenly-stem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-heavenly-stem"},"cjk-ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"decimal-leading-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal-leading-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"devanagari":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-devanagari","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"devanagari"},"disc":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"disclosure-closed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-closed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"disclosure-open":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-open","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"ethiopic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame"},"ethiopic-halehame-aa-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-aa-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-am":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame-am"},"ethiopic-halehame-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-om-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-sid-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-so-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-er"},"ethiopic-halehame-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-et"},"ethiopic-halehame-tig":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-ethiopic-numeric","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"ethiopic-numeric"},"footnotes":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"georgian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#georgian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"gujarati":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gujarati","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gujarati"},"gurmukhi":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gurmukhi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gurmukhi"},"hangul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul"},"hangul-consonant":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul-consonant"},"hebrew":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hebrew","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"japanese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-formal"},"japanese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-informal"},"kannada":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-kannada","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"kannada"},"katakana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"katakana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"khmer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-khmer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"khmer"},"korean-hangul-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hangul-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"lao":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lao","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"lao"},"lower-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lower-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"lower-greek":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-greek","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"malayalam":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-malayalam","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"malayalam"},"mongolian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-mongolian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"myanmar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-myanmar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"myanmar"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"octal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"oriya":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-oriya","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"oriya"},"oromo":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"persian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-persian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"persian"},"sidama":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"simp-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-formal"},"simp-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-informal"},"somali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"square":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:list-style"]}},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}},"tamil":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tamil","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"tamil"},"telugu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-telugu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"telugu"},"thai":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-thai","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"thai"},"tibetan":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tibetan","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"tigre":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"trad-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-formal"},"trad-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-informal"},"upper-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-upper-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"upper-greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":1,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]}}},"upper-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"urdu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":33}],"firefox_android":[{"prefix":"-moz-","added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"urdu"},"-moz-arabic-indic":{"_aliasOf":"arabic-indic"},"-moz-bengali":{"_aliasOf":"bengali"},"-moz-cjk-earthly-branch":{"_aliasOf":"cjk-earthly-branch"},"-moz-cjk-heavenly-stem":{"_aliasOf":"cjk-heavenly-stem"},"-moz-devanagari":{"_aliasOf":"devanagari"},"-moz-ethiopic-halehame":{"_aliasOf":"ethiopic-halehame"},"-moz-ethiopic-halehame-am":{"_aliasOf":"ethiopic-halehame-am"},"-moz-ethiopic-halehame-ti-er":{"_aliasOf":"ethiopic-halehame-ti-er"},"-moz-ethiopic-halehame-ti-et":{"_aliasOf":"ethiopic-halehame-ti-et"},"-moz-ethiopic-numeric":{"_aliasOf":"ethiopic-numeric"},"-moz-gujarati":{"_aliasOf":"gujarati"},"-moz-gurmukhi":{"_aliasOf":"gurmukhi"},"-moz-hangul":{"_aliasOf":"hangul"},"-moz-hangul-consonant":{"_aliasOf":"hangul-consonant"},"-moz-japanese-formal":{"_aliasOf":"japanese-formal"},"-moz-japanese-informal":{"_aliasOf":"japanese-informal"},"-moz-kannada":{"_aliasOf":"kannada"},"-moz-khmer":{"_aliasOf":"khmer"},"-moz-lao":{"_aliasOf":"lao"},"-moz-malayalam":{"_aliasOf":"malayalam"},"-moz-myanmar":{"_aliasOf":"myanmar"},"-moz-oriya":{"_aliasOf":"oriya"},"-moz-persian":{"_aliasOf":"persian"},"-moz-simp-chinese-formal":{"_aliasOf":"simp-chinese-formal"},"-moz-simp-chinese-informal":{"_aliasOf":"simp-chinese-informal"},"-moz-tamil":{"_aliasOf":"tamil"},"-moz-telugu":{"_aliasOf":"telugu"},"-moz-thai":{"_aliasOf":"thai"},"-moz-trad-chinese-formal":{"_aliasOf":"trad-chinese-formal"},"-moz-trad-chinese-informal":{"_aliasOf":"trad-chinese-informal"},"-moz-urdu":{"_aliasOf":"urdu"}},"margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin","spec_url":"https://drafts.csswg.org/css-box/#margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-bottom","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-end","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-end"},"margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-start","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-start"},"margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-left","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-right","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-top","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-trim","spec_url":"https://drafts.csswg.org/css-box-4/#margin-trim","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}}},"marker":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerShorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"marker-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-end","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerEndProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"marker-mid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-mid","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerMidProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"marker-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-start","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerStartProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"mask":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1},{"partial_implementation":true,"version_last":"119","added":1,"removed":120}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18},{"partial_implementation":true,"version_last":"119","added":18,"removed":120}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"version_last":"119","added":79,"removed":120},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":53},{"partial_implementation":true,"version_last":"52","added":2,"removed":53}],"firefox_android":[{"added":53},{"partial_implementation":true,"version_last":"52","added":4,"removed":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1},{"partial_implementation":true,"version_last":"15.3","added":3.1,"removed":15.4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2},{"partial_implementation":true,"version_last":"15.3","added":2,"removed":15.4}]},"tags":["web-features:masks"]},"_aliasOf":"mask"},"mask-border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border"},"mask-border-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-outset","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-outset","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-outset","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-outset"},"mask-border-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-repeat","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-repeat","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-repeat","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-repeat"},"mask-border-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-slice","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-slice","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-slice","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-slice"},"mask-border-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-source","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-source","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-source","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-source","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-source"},"mask-border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-width","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-width","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-width","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-width","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-width"},"mask-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-clip","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-clip"},"mask-composite":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-composite","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-composite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53},{"prefix":"-webkit-","added":53}],"firefox_android":[{"added":53},{"prefix":"-webkit-","added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"add":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-add","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"exclude":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-exclude","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"intersect":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-intersect","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"subtract":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-subtract","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-composite"},"mask-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-image","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":16,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"multiple_mask_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"svg_masks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-image"},"mask-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-mode","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"match-source":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-match-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}}},"mask-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-origin","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"border"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"content"},"fill-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"padding"},"stroke-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"view-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-origin","-webkit-border":{"_aliasOf":"border"},"-webkit-content":{"_aliasOf":"content"},"-webkit-padding":{"_aliasOf":"padding"}},"mask-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-position","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-position"},"mask-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-repeat"},"mask-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-size","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":4}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-size"},"mask-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-type","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}}},"math-depth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-depth","spec_url":"https://w3c.github.io/mathml-core/#the-math-script-level-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/202303","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/202303","added":false}]},"tags":["web-features:mathml"]}},"math-shift":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-shift","spec_url":"https://w3c.github.io/mathml-core/#the-math-shift","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"math-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-style","spec_url":"https://w3c.github.io/mathml-core/#the-math-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:mathml"]}},"max-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-height","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":18}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"max-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":10.3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"max-inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"min-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-height","spec_url":["https://drafts.csswg.org/css-sizing/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-width","spec_url":["https://drafts.csswg.org/css-sizing/#min-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"intrinsic":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"mix-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#mix-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:mix-blend-mode"]},"plus-darker":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-darker","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:mix-blend-mode"]}},"plus-lighter":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":100}],"chrome_android":[{"added":100}],"edge":[{"added":100}],"firefox":[{"added":99}],"firefox_android":[{"added":99}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:mix-blend-mode"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":false}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mix-blend-mode"]}}},"object-fit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-fit","spec_url":"https://drafts.csswg.org/css-images/#the-object-fit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"fill":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-fill","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"scale-down":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-scale-down","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"_aliasOf":"object-fit"},"object-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-position","spec_url":"https://drafts.csswg.org/css-images/#the-object-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-position"]},"_aliasOf":"object-position"},"object-view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#propdef-object-view-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#valdef-object-view-box-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]}}},"offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset","spec_url":"https://drafts.fxtf.org/motion/#offset-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion","added":46}],"edge":[{"added":79},{"alternative_name":"motion","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset"},"offset-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-anchor","spec_url":"https://drafts.fxtf.org/motion/#offset-anchor-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-distance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-distance","spec_url":"https://drafts.fxtf.org/motion/#offset-distance-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-distance","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-distance","added":46}],"edge":[{"added":79},{"alternative_name":"motion-distance","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset-distance"},"offset-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-path","spec_url":"https://drafts.fxtf.org/motion/#offset-path-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-path","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-path","added":46}],"edge":[{"added":79},{"alternative_name":"motion-path","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:motion-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"margin-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-margin-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"ray":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-ray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"url":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-url","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:motion-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-path"},"offset-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-position","spec_url":"https://drafts.fxtf.org/motion/#offset-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"normal":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-rotate","spec_url":"https://drafts.fxtf.org/motion/#offset-rotate-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"chrome_android":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"edge":[{"added":79},{"alternative_name":"offset-rotation","added":79},{"alternative_name":"motion-rotation","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"reverse":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-rotate"},"opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/opacity","spec_url":["https://drafts.csswg.org/css-color/#propdef-opacity","https://svgwg.org/svg2-draft/render.html#ObjectAndGroupOpacityProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1},{"prefix":"-moz-","version_last":"3","added":1,"removed":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":2},{"prefix":"-khtml-","version_last":"1.3","added":1.1,"removed":2}],"safari_ios":[{"added":1}]},"tags":["web-features:opacity"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity"]}},"_aliasOf":"opacity"},"order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/order","spec_url":"https://drafts.csswg.org/css-display/#order-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"order"},"orphans":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/orphans","spec_url":"https://drafts.csswg.org/css-break/#widows-orphans","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"outline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline","spec_url":"https://drafts.csswg.org/css-ui/#outline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94},{"partial_implementation":true,"version_last":"93","added":1,"removed":94}],"chrome_android":[{"added":94},{"partial_implementation":true,"version_last":"93","added":18,"removed":94}],"edge":[{"added":94},{"partial_implementation":true,"version_last":"93","added":12,"removed":94}],"firefox":[{"added":88},{"partial_implementation":true,"version_last":"87","added":1.5,"removed":88},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":88},{"partial_implementation":true,"version_last":"87","added":4,"removed":88}],"ie":[{"added":8}],"safari":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1.2,"removed":16.4}],"safari_ios":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1,"removed":16.4}]},"tags":["web-features:outline"]},"_aliasOf":"outline"},"outline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-color","spec_url":"https://drafts.csswg.org/css-ui/#outline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-color"},"outline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-offset","spec_url":"https://drafts.csswg.org/css-ui/#outline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-style","spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"_aliasOf":"outline-style"},"outline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-width","spec_url":"https://drafts.csswg.org/css-ui/#outline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-width"},"overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow","spec_url":["https://drafts.csswg.org/css-overflow/#propdef-overflow","https://svgwg.org/svg2-draft/render.html#OverflowAndClipProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":114}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":114}],"edge":[{"added":12}],"firefox":[{"added":1},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":12}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":12}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":1.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"multiple_keywords":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68}],"chrome_android":[{"added":68}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor","spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#exclusion-api","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}}},"overflow-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-block","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-clip-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":90}],"chrome_android":[{"partial_implementation":true,"added":90}],"edge":[{"partial_implementation":true,"added":90}],"firefox":[{"partial_implementation":true,"added":102}],"firefox_android":[{"partial_implementation":true,"added":102}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}}},"overflow-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-inline","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap","spec_url":"https://drafts.csswg.org/css-text/#overflow-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23},{"alternative_name":"word-wrap","added":1}],"chrome_android":[{"added":25},{"alternative_name":"word-wrap","added":18}],"edge":[{"added":18},{"alternative_name":"word-wrap","added":12}],"firefox":[{"added":49},{"alternative_name":"word-wrap","added":3.5}],"firefox_android":[{"added":49},{"alternative_name":"word-wrap","added":4}],"ie":[{"alternative_name":"word-wrap","added":5.5}],"safari":[{"added":7},{"alternative_name":"word-wrap","added":1}],"safari_ios":[{"added":7},{"alternative_name":"word-wrap","added":1}]},"tags":["web-features:overflow-wrap"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:overflow-wrap"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-break-word","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"_aliasOf":"overflow-wrap"},"overflow-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-x","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-x","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-y","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-y","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overlay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overlay","spec_url":"https://drafts.csswg.org/css-position-4/#overlay","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}}},"overscroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding","spec_url":"https://drafts.csswg.org/css-box/#padding-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-bottom","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-end","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-end"},"padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-start","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-start"},"padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-left","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-right","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-top","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"page":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page","spec_url":"https://drafts.csswg.org/css-page/#using-named-pages","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:page-selectors"]}},"page-break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-after","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-after","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-before","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-before","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-inside","spec_url":["https://drafts.csswg.org/css-page/#page-break-inside","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"paint-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/paint-order","spec_url":"https://svgwg.org/svg2-draft/painting.html#PaintOrderProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123},{"partial_implementation":true,"added":35}],"chrome_android":[{"added":123},{"partial_implementation":true,"added":35}],"edge":[{"added":123},{"partial_implementation":true,"added":79}],"firefox":[{"added":60}],"firefox_android":[{"added":60}],"ie":[{"added":false}],"safari":[{"added":11},{"partial_implementation":true,"added":8}],"safari_ios":[{"added":11},{"partial_implementation":true,"added":8}]},"tags":["web-features:paint-order"]}},"perspective":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective"},"perspective-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective-origin","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective-origin"},"place-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-content","spec_url":"https://drafts.csswg.org/css-align/#place-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-items","spec_url":"https://drafts.csswg.org/css-align/#place-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-self","spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}}},"pointer-events":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/pointer-events","spec_url":["https://drafts.csswg.org/css-ui/#pointer-events-control","https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]}}},"position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position","spec_url":"https://drafts.csswg.org/css-position/#position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:position"]},"absolute":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-absolute","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:absolute-positioning"]}},"absolutely_positioned_flex_children":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:fixed-positioning"]}},"position_sticky_table_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:sticky-positioning"]}},"relative":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-relative","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:relative-positioning"]}},"static":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-static","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:static-positioning"]}},"sticky":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-sticky","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":13},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":7}]},"tags":["web-features:sticky-positioning"]},"_aliasOf":"sticky"},"-webkit-sticky":{"_aliasOf":"sticky"}},"position-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-anchor","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":125}],"chrome_android":[{"partial_implementation":true,"added":125}],"edge":[{"partial_implementation":true,"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-area","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"chrome_android":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"edge":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-left","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-right","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-area"},"position-try":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-prop","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-try-fallbacks":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-fallbacks","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-fallbacks","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"flip-block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"version_last":"127","added":125,"removed":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-try-fallbacks"},"position-try-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-order","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"most-block-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-block-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-height":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-height","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-inline-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-visibility","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-visibility","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-always","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchors-visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-anchors-visible","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"no-overflow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-no-overflow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"print-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/print-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#propdef-print-color-adjust","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"prefix":"-webkit-","added":17}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":97},{"alternative_name":"color-adjust","added":48}],"firefox_android":[{"added":97},{"alternative_name":"color-adjust","added":48}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":6}]},"tags":["web-features:print-color-adjust"]},"economy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-economy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"exact":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-exact","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"_aliasOf":"print-color-adjust"},"quotes":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/quotes","spec_url":"https://drafts.csswg.org/css-content/#quotes","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:quotes"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]}}},"r":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/r","spec_url":"https://svgwg.org/svg2-draft/geometry.html#R","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"reading-flow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#reading-flow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"chrome_android":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"edge":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:reading-flow"]}},"resize":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/resize","spec_url":"https://drafts.csswg.org/css-ui/#resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"block_level_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}}},"right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/right","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rotate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}},"x_y_z_angle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"row-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/row-gap","spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-row-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-row-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-row-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"grid-row-gap":{"_aliasOf":"grid_context"}},"ruby-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-align","spec_url":"https://drafts.csswg.org/css-ruby/#ruby-align-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-around":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-around","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-between":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-between","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}}},"ruby-overhang":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#propdef-ruby-overhang","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}}},"ruby-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-position","spec_url":"https://drafts.csswg.org/css-ruby/#rubypos","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:ruby-position"]},"alternate":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40174517","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40174517","added":false}],"edge":[{"impl_url":"https://crbug.com/40174517","added":false}],"firefox":[{"added":88}],"firefox_android":[{"added":88}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ruby-position"]}},"inter-character":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":84}],"chrome_android":[{"partial_implementation":true,"added":84}],"edge":[{"partial_implementation":true,"added":84}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"_aliasOf":"ruby-position"},"rx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"ry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ry","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"scale":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scale","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"scroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior","spec_url":"https://drafts.csswg.org/css-overflow/#smooth-scrolling","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-smooth","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}}},"scroll-initial-target":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#propdef-scroll-initial-target","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]},"nearest":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-nearest","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}}},"scroll-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"firefox_android":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin"},"scroll-margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-bottom"},"scroll-margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-left"},"scroll-margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-right"},"scroll-margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-top"},"scroll-marker-group":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#scroll-marker-group-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"after":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-after","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"before":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-before","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"scroll-padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-padding","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-snap-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-stop":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-stop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-always","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":99},{"partial_implementation":true,"version_last":"98","added":68,"removed":99},{"version_last":"67","added":39,"removed":68}],"firefox_android":[{"added":68},{"version_last":"67","added":39,"removed":68}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:scroll-snap"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:scroll-snap"]}},"_aliasOf":"scroll-snap-type"},"scroll-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scroll-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-scroll-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"scroll-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scrollbar-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/231590","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/231590","added":false}]},"tags":["web-features:scrollbar-color"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-color-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scrollbar-color"]}}},"scrollbar-gutter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter","spec_url":"https://drafts.csswg.org/css-overflow/#scrollbar-gutter-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}}},"scrollbar-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"thin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-thin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}}},"shape-image-threshold":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold","spec_url":"https://drafts.csswg.org/css-shapes/#shape-image-threshold-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}}},"shape-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-margin","spec_url":"https://drafts.csswg.org/css-shapes/#shape-margin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"_aliasOf":"shape-margin"},"shape-outside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-outside","spec_url":"https://drafts.csswg.org/css-shapes/#shape-outside-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"circle":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#circle()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image","spec_url":"https://drafts.csswg.org/css-images/#image-values","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#inset()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#valdef-shape-outside-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape/path","spec_url":"https://drafts.csswg.org/css-shapes/#funcdef-basic-shape-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}},"polygon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#polygon()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}}},"shape-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#ShapeRendering","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"speak":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":80}],"chrome_android":[{"partial_implementation":true,"added":80}],"edge":[{"partial_implementation":true,"added":80}],"firefox":[{"impl_url":"https://bugzil.la/1748064","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748064","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:speak"]}},"speak-as":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/speak-as","spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak-as","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"impl_url":"https://bugzil.la/1748068","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748068","added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]},"digits":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-digits","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"literal-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-literal-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"no-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-no-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"spell-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-spell-out","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}}},"stop-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-color","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stop-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-opacity","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke","spec_url":"https://svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-color":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-dasharray":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dasharray","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dasharray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-dasharray-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"stroke-dashoffset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dashoffset","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dashoffset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-linecap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linecap","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linecap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"butt":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-butt","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"square":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"stroke-linejoin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linejoin","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linejoin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]},"bevel":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-bevel","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"miter":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-miter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"stroke-miterlimit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-miterlimit","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-miterlimit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"stroke-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity-svg"]}},"stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-width","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"tab-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/tab-size","spec_url":"https://drafts.csswg.org/css-text/#tab-size-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":91},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":91},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:tab-size"]},"length":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/length","spec_url":"https://drafts.csswg.org/css-values/#lengths","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:tab-size"]}},"_aliasOf":"tab-size"},"table-layout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/table-layout","spec_url":"https://drafts.csswg.org/css2/#width-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":14}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:table"]}},"text-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align","spec_url":["https://drafts.csswg.org/css-logical/#text-align","https://drafts.csswg.org/css-text/#text-align-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"center"},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"justify":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-justify","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"left"},"match-parent":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-match-parent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"prefix":"-webkit-","added":16}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-align"]},"_aliasOf":"match-parent"},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"right"},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"-webkit-center":{"_aliasOf":"center"},"-moz-center":{"_aliasOf":"center"},"-khtml-center":{"_aliasOf":"center"},"-webkit-left":{"_aliasOf":"left"},"-moz-left":{"_aliasOf":"left"},"-khtml-left":{"_aliasOf":"left"},"-webkit-match-parent":{"_aliasOf":"match-parent"},"-webkit-right":{"_aliasOf":"right"},"-moz-right":{"_aliasOf":"right"},"-khtml-right":{"_aliasOf":"right"}},"text-align-last":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align-last","spec_url":"https://drafts.csswg.org/css-text/#text-align-last-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":49},{"prefix":"-moz-","version_last":"52","added":12,"removed":53}],"firefox_android":[{"added":49},{"prefix":"-moz-","version_last":"52","added":14,"removed":53}],"ie":[{"partial_implementation":true,"added":5.5}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-last-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":12}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]}},"_aliasOf":"text-align-last"},"text-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-anchor","spec_url":"https://svgwg.org/svg2-draft/text.html#TextAnchorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"text-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#propdef-text-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-alpha","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-numeric","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"no-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-no-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}}},"text-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-edge","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-edge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-edge-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-trim","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-trim","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-combine-upright":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-combine-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":9}],"chrome_android":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":18}],"edge":[{"added":79},{"alternative_name":"-ms-text-combine-horizontal","version_last":"18","added":12,"removed":79}],"firefox":[{"added":48}],"firefox_android":[{"added":48}],"ie":[{"alternative_name":"-ms-text-combine-horizontal","added":11}],"safari":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5.1}],"safari_ios":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5}]},"tags":["web-features:text-combine-upright"]},"_aliasOf":"text-combine-upright"},"text-decoration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration","spec_url":["https://drafts.csswg.org/css-text-decor/#text-decoration-property","https://svgwg.org/svg2-draft/text.html#TextDecorationProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-decoration"]},"includes_color-and-style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":8}],"safari_ios":[{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"includes_color-and-style"},"includes_thickness":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"-webkit-includes_color-and-style":{"_aliasOf":"includes_color-and-style"}},"text-decoration-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"text-decoration-color"},"text-decoration-line":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-line-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"blink":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-blink","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration-line-blink"]}},"grammar-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-grammar-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"line-through":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-line-through","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"overline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-overline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"spelling-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-spelling-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"underline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-underline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-line"},"text-decoration-skip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skipping","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"version_last":"63","added":57,"removed":64}],"chrome_android":[{"version_last":"63","added":57,"removed":64}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-skip"},"text-decoration-skip-ink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skip-ink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40675832","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40675832","added":false}],"edge":[{"impl_url":"https://crbug.com/40675832","added":false}],"firefox":[{"added":75}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}}},"text-decoration-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"wavy":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-style"},"text-decoration-thickness":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-width-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"chrome_android":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"edge":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"percentage":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-decoration"]}}},"text-emphasis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis"},"text-emphasis-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis-color"},"text-emphasis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":132}],"firefox_android":[{"added":132}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-emphasis"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-position"},"text-emphasis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"dot":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-dot","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"double-circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-double-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"filled":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-filled","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"sesame":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-sesame","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"triangle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-triangle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-style"},"text-indent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-indent","spec_url":"https://drafts.csswg.org/css-text/#text-indent-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-indent"]},"each-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-each-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-each-line"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-hanging"]}}},"text-justify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-justify","spec_url":"https://drafts.csswg.org/css-text/#text-justify-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"chrome_android":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"edge":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/99945","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/99945","added":false}]},"tags":["web-features:text-justify"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"inter-character":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-character","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55},{"alternative_name":"distribute","added":55}],"firefox_android":[{"added":55},{"alternative_name":"distribute","added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]},"_aliasOf":"inter-character"},"inter-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-word","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"distribute":{"_aliasOf":"inter-character"}},"text-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-orientation","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":11}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":14},{"prefix":"-webkit-","added":5}]},"tags":["web-features:text-orientation"]},"mixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-mixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"sideways":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-sideways","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25},{"alternative_name":"sideways-right","added":83}],"chrome_android":[{"added":25},{"alternative_name":"sideways-right","added":83}],"edge":[{"added":79},{"alternative_name":"sideways-right","added":83}],"firefox":[{"added":44},{"alternative_name":"sideways-right","added":72}],"firefox_android":[{"added":44},{"alternative_name":"sideways-right","added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-orientation"]},"_aliasOf":"sideways"},"upright":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"_aliasOf":"text-orientation","sideways-right":{"_aliasOf":"sideways"}},"text-overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-overflow","spec_url":["https://drafts.csswg.org/css-overflow/#text-overflow","https://svgwg.org/svg2-draft/text.html#TextOverflowProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":6},{"prefix":"-ms-","added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"ellipsis":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-ellipsis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:custom-ellipses"]}},"two_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-overflow"]}},"_aliasOf":"text-overflow"},"text-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#TextRenderingProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"geometricPrecision":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}}},"text-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-shadow","spec_url":"https://drafts.csswg.org/css-text-decor/#text-shadow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-shadow"]}},"text-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust","spec_url":"https://drafts.csswg.org/css-size-adjust/#adjustment-control","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"prefix":"-webkit-","added":1}]},"tags":["web-features:text-size-adjust"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"percentages":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-percentage-0","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"_aliasOf":"text-size-adjust"},"text-spacing-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-spacing-trim","spec_url":"https://drafts.csswg.org/css-text-4/#text-spacing-trim-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-first","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-trim-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}}},"text-transform":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-transform","spec_url":"https://drafts.csswg.org/css-text-4/#text-transform","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]},"capitalize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-capitalize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"dutch_ij_digraph":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"full-size-kana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-size-kana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34}],"chrome_android":[{"added":34}],"edge":[{"added":79}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"lowercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-lowercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"lowercase_sigma":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:text-transform"]}},"math-auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-math-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-transform"]}},"uppercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-uppercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}}},"text-underline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset","spec_url":"https://drafts.csswg.org/css-text-decor-4/#underline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]}},"percentage":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-percentage","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-offset"]}}},"text-underline-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-underline-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":12}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":6}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":9}]},"tags":["web-features:text-underline-position"]},"from-font":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"_aliasOf":"text-underline-position"},"text-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]},"balance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#balance","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-balance"]}},"nowrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#nowrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-nowrap"]}},"pretty":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#pretty","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-pretty"]}},"stable":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#stable","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-stable"]}},"wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#wrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]}}},"text-wrap-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-mode","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]},"nowrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}},"wrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}}},"text-wrap-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-style","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"pretty":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-style"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}}},"timeline-scope":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/timeline-scope","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-timeline-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/top","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"touch-action":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/touch-action","spec_url":["https://compat.spec.whatwg.org/#touch-action","https://w3c.github.io/pointerevents/#the-touch-action-css-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"manipulation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"_aliasOf":"manipulation"},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"none"},"pan-down":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-up":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-x"},"pan-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-y"},"pinch-zoom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":85}],"firefox_android":[{"added":85}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pinch-zoom"},"_aliasOf":"touch-action","-ms-manipulation":{"_aliasOf":"manipulation"},"-ms-none":{"_aliasOf":"none"},"-ms-pan-x":{"_aliasOf":"pan-x"},"-ms-pan-y":{"_aliasOf":"pan-y"},"-ms-pinch-zoom":{"_aliasOf":"pinch-zoom"}},"transform":{"3d":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform","spec_url":["https://drafts.csswg.org/css-transforms-2/#transform-functions","https://drafts.csswg.org/css-transforms/#transform-property","https://svgwg.org/svg2-draft/coords.html#TransformProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-webkit-","added":11},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:transforms2d"]},"_aliasOf":"transform"},"transform-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-box","spec_url":"https://drafts.csswg.org/css-transforms/#transform-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:transform-box"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}}},"transform-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-origin","spec_url":"https://drafts.csswg.org/css-transforms/#transform-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":2}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:transforms2d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":17}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}},"three_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms2d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"_aliasOf":"transform-origin"},"transform-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-style","spec_url":"https://drafts.csswg.org/css-transforms-2/#transform-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"_aliasOf":"transform-style"},"transition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition","spec_url":"https://drafts.csswg.org/css-transitions/#transition-shorthand-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"preview","added":4,"removed":null}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4,"removed":false}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"gradients_can_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:transitions"]}},"transition-behavior":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"_aliasOf":"transition"},"transition-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-behavior","spec_url":"https://drafts.csswg.org/css-transitions-2/#transition-behavior-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"transition-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-delay","spec_url":"https://drafts.csswg.org/css-transitions/#transition-delay-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-delay"},"transition-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-duration","spec_url":"https://drafts.csswg.org/css-transitions/#transition-duration-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-duration"},"transition-property":{"IDENT_value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3}]},"tags":["web-features:transitions"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-property","spec_url":"https://drafts.csswg.org/css-transitions/#transition-property-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#valdef-transition-property-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#propdef-transition-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-property"},"transition-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function","spec_url":"https://drafts.csswg.org/css-transitions/#transition-timing-function-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-timing-function"},"translate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/translate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"unicode-bidi":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi","spec_url":"https://drafts.csswg.org/css-writing-modes/#unicode-bidi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"bidi-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-bidi-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"embed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-embed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"isolate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate"},"isolate-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate-override"},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"plaintext":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-plaintext","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"plaintext"},"-webkit-isolate":{"_aliasOf":"isolate"},"-moz-isolate":{"_aliasOf":"isolate"},"-moz-isolate-override":{"_aliasOf":"isolate-override"},"-webkit-isolate-override":{"_aliasOf":"isolate-override"},"-moz-plaintext":{"_aliasOf":"plaintext"},"-webkit-plaintext":{"_aliasOf":"plaintext"}},"user-modify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-modify","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":1,"removed":132}],"firefox_android":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":4,"removed":132}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":5}]}},"read-write-plaintext-only":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":5}]}}},"_aliasOf":"user-modify"},"user-select":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-select","spec_url":"https://drafts.csswg.org/css-ui/#content-selection","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":54},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":54},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":12},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":69},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":79},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":3}]},"tags":["web-features:user-select"]},"all":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53}],"chrome_android":[{"added":53}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:user-select"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":21},{"prefix":"-moz-","version_last":"64","added":1,"removed":65}],"firefox_android":[{"added":21},{"prefix":"-moz-","version_last":"64","added":4,"removed":65}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]},"_aliasOf":"none"},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"_aliasOf":"user-select","-moz-none":{"_aliasOf":"none"}},"vector-effect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vector-effect","spec_url":"https://svgwg.org/svg2-draft/coords.html#VectorEffectProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"vertical-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vertical-align","spec_url":"https://drafts.csswg.org/css-inline/#propdef-vertical-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}}},"view-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-inset","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-inset","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-view-timeline-inset-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-transition-class":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#view-transition-class-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1860854","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1860854","added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#valdef-view-transition-class-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]}}},"view-transition-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-transition-name","spec_url":"https://drafts.csswg.org/css-view-transitions/#view-transition-name-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"impl_url":"https://bugzil.la/1823896","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1823896","added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions/#valdef-view-transition-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]}}},"visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/visibility","spec_url":["https://drafts.csswg.org/css-display/#visibility","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}}},"white-space":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space","spec_url":["https://drafts.csswg.org/css-text-4/#white-space-property","https://svgwg.org/svg2-draft/text.html#TextWhiteSpace"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:white-space"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"_aliasOf":"pre-wrap"},"shorthand_values":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":114}],"chrome_android":[{"partial_implementation":true,"added":114}],"edge":[{"partial_implementation":true,"added":114}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"textarea_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"-moz-pre-wrap":{"_aliasOf":"pre-wrap"}},"white-space-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space-collapse","spec_url":"https://drafts.csswg.org/css-text-4/#white-space-collapsing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-breaks":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-breaks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-spaces","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space-collapse"]}}},"widows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/widows","spec_url":["https://drafts.csswg.org/css-break/#widows-orphans","https://drafts.csswg.org/css-multicol/#filling-columns"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22},{"alternative_name":"intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:width-height"]}},"max-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"alternative_name":"-moz-available","added":3}],"firefox_android":[{"alternative_name":"-moz-available","added":4}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":7}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":7}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"max-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"},"-moz-available":{"_aliasOf":"stretch"}},"will-change":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/will-change","spec_url":"https://drafts.csswg.org/css-will-change/#will-change","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"scroll-position":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-scroll-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}}},"word-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-break","spec_url":"https://drafts.csswg.org/css-text/#word-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]},"auto-phrase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-word-break-auto-phrase","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:word-break-auto-phrase"]}},"break-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-word","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":67}],"firefox_android":[{"added":67}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break-break-word"]}},"keep-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-keep-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":44}],"chrome_android":[{"added":44}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:word-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"_aliasOf":"word-break"},"word-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-spacing","spec_url":["https://drafts.csswg.org/css-text/#word-spacing-property","https://svgwg.org/svg2-draft/text.html#WordSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]}},"percentages":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"writing-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/writing-mode","spec_url":["https://drafts.csswg.org/css-writing-modes/#block-flow","https://svgwg.org/svg2-draft/text.html#WritingModeProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":8}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":9},{"prefix":"-ms-","added":9}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":10.3},{"prefix":"-webkit-","added":5}]},"tags":["web-features:writing-mode"]},"horizontal-tb":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"lr":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"lr-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"sideways-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"sideways-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"tb-rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"vertical-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical_oriented_form_controls":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"chrome_android":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"edge":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"firefox":[{"added":120}],"firefox_android":[{"added":120}],"ie":[{"added":false}],"safari":[{"added":17.4},{"partial_implementation":true,"added":16.5}],"safari_ios":[{"added":17.4},{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}},"_aliasOf":"writing-mode"},"x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/x","spec_url":"https://svgwg.org/svg2-draft/geometry.html#X","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/y","spec_url":"https://svgwg.org/svg2-draft/geometry.html#Y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}},"z-index":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/z-index","spec_url":"https://drafts.csswg.org/css2/#z-index","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-z-index-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}},"negative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}}},"zoom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom","spec_url":"https://drafts.csswg.org/css-viewport/#zoom-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":126}],"firefox_android":[{"added":126}],"ie":[{"added":5.5}],"safari":[{"added":3.1}],"safari_ios":[{"added":3}]},"tags":["web-features:zoom"]},"reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom#Values","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"58","added":1,"removed":59}],"chrome_android":[{"version_last":"58","added":18,"removed":59}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"18.3","added":3.1,"removed":18.4}],"safari_ios":[{"version_last":"18.3","added":3,"removed":18.4}]}}}},"-webkit-align-content":{"_aliasOf":"align-content"},"-webkit-align-items":{"_aliasOf":"align-items"},"-webkit-align-self":{"_aliasOf":"align-self"},"-webkit-alt":{"_aliasOf":"alt"},"-webkit-animation":{"_aliasOf":"animation"},"-moz-animation":{"_aliasOf":"animation"},"-o-animation":{"_aliasOf":"animation"},"-webkit-animation-delay":{"_aliasOf":"animation-delay"},"-moz-animation-delay":{"_aliasOf":"animation-delay"},"-o-animation-delay":{"_aliasOf":"animation-delay"},"-webkit-animation-direction":{"_aliasOf":"animation-direction"},"-moz-animation-direction":{"_aliasOf":"animation-direction"},"-o-animation-direction":{"_aliasOf":"animation-direction"},"-webkit-animation-duration":{"_aliasOf":"animation-duration"},"-moz-animation-duration":{"_aliasOf":"animation-duration"},"-o-animation-duration":{"_aliasOf":"animation-duration"},"-webkit-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-moz-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-o-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-webkit-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-moz-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-o-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-webkit-animation-name":{"_aliasOf":"animation-name"},"-moz-animation-name":{"_aliasOf":"animation-name"},"-o-animation-name":{"_aliasOf":"animation-name"},"-webkit-animation-play-state":{"_aliasOf":"animation-play-state"},"-moz-animation-play-state":{"_aliasOf":"animation-play-state"},"-o-animation-play-state":{"_aliasOf":"animation-play-state"},"-webkit-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-moz-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-o-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-webkit-appearance":{"_aliasOf":"appearance"},"-moz-appearance":{"_aliasOf":"appearance"},"-webkit-backdrop-filter":{"_aliasOf":"backdrop-filter"},"-webkit-backface-visibility":{"_aliasOf":"backface-visibility"},"-moz-backface-visibility":{"_aliasOf":"backface-visibility"},"-webkit-background-clip":{"_aliasOf":"background-clip"},"-moz-background-clip":{"_aliasOf":"background-clip"},"-webkit-background-origin":{"_aliasOf":"background-origin"},"-moz-background-origin":{"_aliasOf":"background-origin"},"-webkit-background-size":{"_aliasOf":"background-size"},"-moz-background-size":{"_aliasOf":"background-size"},"-o-background-size":{"_aliasOf":"background-size"},"-webkit-border-bottom-left-radius":{"_aliasOf":"border-bottom-left-radius"},"-moz-border-radius-bottomleft":{"_aliasOf":"border-bottom-left-radius"},"-webkit-border-bottom-right-radius":{"_aliasOf":"border-bottom-right-radius"},"-moz-border-radius-bottomright":{"_aliasOf":"border-bottom-right-radius"},"-webkit-border-image":{"_aliasOf":"border-image"},"-moz-border-image":{"_aliasOf":"border-image"},"-o-border-image":{"_aliasOf":"border-image"},"-webkit-border-image-slice":{"_aliasOf":"border-image-slice"},"-moz-border-end-color":{"_aliasOf":"border-inline-end-color"},"-moz-border-end-style":{"_aliasOf":"border-inline-end-style"},"-moz-border-end-width":{"_aliasOf":"border-inline-end-width"},"-moz-border-start-color":{"_aliasOf":"border-inline-start-color"},"-moz-border-start-style":{"_aliasOf":"border-inline-start-style"},"-webkit-border-radius":{"_aliasOf":"border-radius"},"-moz-border-radius":{"_aliasOf":"border-radius"},"-webkit-border-top-left-radius":{"_aliasOf":"border-top-left-radius"},"-moz-border-radius-topleft":{"_aliasOf":"border-top-left-radius"},"-webkit-border-top-right-radius":{"_aliasOf":"border-top-right-radius"},"-moz-border-radius-topright":{"_aliasOf":"border-top-right-radius"},"-webkit-box-align":{"_aliasOf":"box-align"},"-moz-box-align":{"_aliasOf":"box-align"},"-khtml-box-align":{"_aliasOf":"box-align"},"-webkit-box-decoration-break":{"_aliasOf":"box-decoration-break"},"-webkit-box-direction":{"_aliasOf":"box-direction"},"-moz-box-direction":{"_aliasOf":"box-direction"},"-khtml-box-direction":{"_aliasOf":"box-direction"},"-webkit-box-flex":{"_aliasOf":"box-flex"},"-moz-box-flex":{"_aliasOf":"box-flex"},"-khtml-box-flex":{"_aliasOf":"box-flex"},"-webkit-box-flex-group":{"_aliasOf":"box-flex-group"},"-khtml-box-flex-group":{"_aliasOf":"box-flex-group"},"-webkit-box-lines":{"_aliasOf":"box-lines"},"-khtml-box-lines":{"_aliasOf":"box-lines"},"-webkit-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-moz-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-khtml-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-webkit-box-orient":{"_aliasOf":"box-orient"},"-moz-box-orient":{"_aliasOf":"box-orient"},"-khtml-box-orient":{"_aliasOf":"box-orient"},"-webkit-box-pack":{"_aliasOf":"box-pack"},"-moz-box-pack":{"_aliasOf":"box-pack"},"-khtml-box-pack":{"_aliasOf":"box-pack"},"-webkit-box-shadow":{"_aliasOf":"box-shadow"},"-moz-box-shadow":{"_aliasOf":"box-shadow"},"-webkit-box-sizing":{"_aliasOf":"box-sizing"},"-moz-box-sizing":{"_aliasOf":"box-sizing"},"-webkit-clip-path":{"_aliasOf":"clip-path"},"-webkit-column-count":{"_aliasOf":"column-count"},"-moz-column-count":{"_aliasOf":"column-count"},"-moz-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-rule":{"_aliasOf":"column-rule"},"-moz-column-rule":{"_aliasOf":"column-rule"},"-webkit-column-rule-color":{"_aliasOf":"column-rule-color"},"-moz-column-rule-color":{"_aliasOf":"column-rule-color"},"-webkit-column-rule-style":{"_aliasOf":"column-rule-style"},"-moz-column-rule-style":{"_aliasOf":"column-rule-style"},"-webkit-column-rule-width":{"_aliasOf":"column-rule-width"},"-moz-column-rule-width":{"_aliasOf":"column-rule-width"},"-webkit-column-span":{"_aliasOf":"column-span"},"-webkit-column-width":{"_aliasOf":"column-width"},"-moz-column-width":{"_aliasOf":"column-width"},"-webkit-columns":{"_aliasOf":"columns"},"-moz-columns":{"_aliasOf":"columns"},"-webkit-filter":{"_aliasOf":"filter"},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flex":{"_aliasOf":"flex"},"-webkit-flex-basis":{"_aliasOf":"flex-basis"},"-webkit-flex-direction":{"_aliasOf":"flex-direction"},"-ms-flex-direction":{"_aliasOf":"flex-direction"},"-webkit-flex-flow":{"_aliasOf":"flex-flow"},"-webkit-flex-grow":{"_aliasOf":"flex-grow"},"-ms-flex-positive":{"_aliasOf":"flex-grow"},"-webkit-flex-shrink":{"_aliasOf":"flex-shrink"},"-webkit-flex-wrap":{"_aliasOf":"flex-wrap"},"-webkit-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-moz-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-webkit-font-kerning":{"_aliasOf":"font-kerning"},"-moz-font-language-override":{"_aliasOf":"font-language-override"},"-webkit-font-smoothing":{"_aliasOf":"font-smooth"},"-moz-osx-font-smoothing":{"_aliasOf":"font-smooth"},"-webkit-font-variant-ligatures":{"_aliasOf":"font-variant-ligatures"},"-ms-high-contrast-adjust":{"_aliasOf":"forced-color-adjust"},"-ms-grid-columns":{"_aliasOf":"grid-template-columns"},"-ms-grid-rows":{"_aliasOf":"grid-template-rows"},"-webkit-hyphenate-character":{"_aliasOf":"hyphenate-character"},"-webkit-hyphens":{"_aliasOf":"hyphens"},"-ms-hyphens":{"_aliasOf":"hyphens"},"-moz-hyphens":{"_aliasOf":"hyphens"},"-ms-ime-mode":{"_aliasOf":"ime-mode"},"-webkit-initial-letter":{"_aliasOf":"initial-letter"},"offset-block":{"_aliasOf":"inset-block"},"offset-block-end":{"_aliasOf":"inset-block-end"},"offset-block-start":{"_aliasOf":"inset-block-start"},"offset-inline":{"_aliasOf":"inset-inline"},"offset-inline-end":{"_aliasOf":"inset-inline-end"},"offset-inline-start":{"_aliasOf":"inset-inline-start"},"-webkit-justify-content":{"_aliasOf":"justify-content"},"-webkit-line-break":{"_aliasOf":"line-break"},"-ms-line-break":{"_aliasOf":"line-break"},"-khtml-line-break":{"_aliasOf":"line-break"},"-webkit-line-clamp":{"_aliasOf":"line-clamp"},"-webkit-margin-end":{"_aliasOf":"margin-inline-end"},"-moz-margin-end":{"_aliasOf":"margin-inline-end"},"-webkit-margin-start":{"_aliasOf":"margin-inline-start"},"-moz-margin-start":{"_aliasOf":"margin-inline-start"},"-webkit-mask":{"_aliasOf":"mask"},"-webkit-mask-box-image-outset":{"_aliasOf":"mask-border-outset"},"-webkit-mask-box-image-repeat":{"_aliasOf":"mask-border-repeat"},"-webkit-mask-box-image-slice":{"_aliasOf":"mask-border-slice"},"-webkit-mask-box-image-source":{"_aliasOf":"mask-border-source"},"-webkit-mask-box-image-width":{"_aliasOf":"mask-border-width"},"-webkit-mask-clip":{"_aliasOf":"mask-clip"},"-webkit-mask-image":{"_aliasOf":"mask-image"},"-webkit-mask-origin":{"_aliasOf":"mask-origin"},"-webkit-mask-position":{"_aliasOf":"mask-position"},"-webkit-mask-repeat":{"_aliasOf":"mask-repeat"},"-webkit-mask-size":{"_aliasOf":"mask-size"},"-webkit-max-inline-size":{"_aliasOf":"max-inline-size"},"-o-object-fit":{"_aliasOf":"object-fit"},"-o-object-position":{"_aliasOf":"object-position"},"motion":{"_aliasOf":"offset"},"motion-distance":{"_aliasOf":"offset-distance"},"motion-path":{"_aliasOf":"offset-path"},"offset-rotation":{"_aliasOf":"offset-rotate"},"motion-rotation":{"_aliasOf":"offset-rotate"},"-moz-opacity":{"_aliasOf":"opacity"},"-khtml-opacity":{"_aliasOf":"opacity"},"-webkit-order":{"_aliasOf":"order"},"-ms-order":{"_aliasOf":"order"},"-moz-outline":{"_aliasOf":"outline"},"-moz-outline-color":{"_aliasOf":"outline-color"},"-moz-outline-style":{"_aliasOf":"outline-style"},"-moz-outline-width":{"_aliasOf":"outline-width"},"word-wrap":{"_aliasOf":"overflow-wrap"},"-ms-overflow-x":{"_aliasOf":"overflow-x"},"-ms-overflow-y":{"_aliasOf":"overflow-y"},"-webkit-padding-end":{"_aliasOf":"padding-inline-end"},"-moz-padding-end":{"_aliasOf":"padding-inline-end"},"-webkit-padding-start":{"_aliasOf":"padding-inline-start"},"-moz-padding-start":{"_aliasOf":"padding-inline-start"},"-webkit-perspective":{"_aliasOf":"perspective"},"-moz-perspective":{"_aliasOf":"perspective"},"-webkit-perspective-origin":{"_aliasOf":"perspective-origin"},"-moz-perspective-origin":{"_aliasOf":"perspective-origin"},"inset-area":{"_aliasOf":"position-area"},"position-try-options":{"_aliasOf":"position-try-fallbacks"},"-webkit-print-color-adjust":{"_aliasOf":"print-color-adjust"},"-webkit-ruby-position":{"_aliasOf":"ruby-position"},"scroll-snap-margin":{"_aliasOf":"scroll-margin"},"scroll-snap-margin-bottom":{"_aliasOf":"scroll-margin-bottom"},"scroll-snap-margin-left":{"_aliasOf":"scroll-margin-left"},"scroll-snap-margin-right":{"_aliasOf":"scroll-margin-right"},"scroll-snap-margin-top":{"_aliasOf":"scroll-margin-top"},"-ms-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-shape-margin":{"_aliasOf":"shape-margin"},"-moz-tab-size":{"_aliasOf":"tab-size"},"-o-tab-size":{"_aliasOf":"tab-size"},"-moz-text-align-last":{"_aliasOf":"text-align-last"},"-ms-text-combine-horizontal":{"_aliasOf":"text-combine-upright"},"-moz-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-webkit-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-moz-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-skip":{"_aliasOf":"text-decoration-skip"},"-moz-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-emphasis":{"_aliasOf":"text-emphasis"},"-webkit-text-emphasis-color":{"_aliasOf":"text-emphasis-color"},"-webkit-text-emphasis-position":{"_aliasOf":"text-emphasis-position"},"-webkit-text-emphasis-style":{"_aliasOf":"text-emphasis-style"},"-webkit-text-orientation":{"_aliasOf":"text-orientation"},"-ms-text-overflow":{"_aliasOf":"text-overflow"},"-o-text-overflow":{"_aliasOf":"text-overflow"},"-webkit-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-moz-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-webkit-text-underline-position":{"_aliasOf":"text-underline-position"},"-ms-touch-action":{"_aliasOf":"touch-action"},"-webkit-transform":{"_aliasOf":"transform"},"-moz-transform":{"_aliasOf":"transform"},"-ms-transform":{"_aliasOf":"transform"},"-o-transform":{"_aliasOf":"transform"},"-webkit-transform-origin":{"_aliasOf":"transform-origin"},"-moz-transform-origin":{"_aliasOf":"transform-origin"},"-ms-transform-origin":{"_aliasOf":"transform-origin"},"-o-transform-origin":{"_aliasOf":"transform-origin"},"-webkit-transform-style":{"_aliasOf":"transform-style"},"-moz-transform-style":{"_aliasOf":"transform-style"},"-webkit-transition":{"_aliasOf":"transition"},"-moz-transition":{"_aliasOf":"transition"},"-ms-transition":{"_aliasOf":"transition"},"-o-transition":{"_aliasOf":"transition"},"-webkit-transition-delay":{"_aliasOf":"transition-delay"},"-moz-transition-delay":{"_aliasOf":"transition-delay"},"-ms-transition-delay":{"_aliasOf":"transition-delay"},"-o-transition-delay":{"_aliasOf":"transition-delay"},"-webkit-transition-duration":{"_aliasOf":"transition-duration"},"-moz-transition-duration":{"_aliasOf":"transition-duration"},"-ms-transition-duration":{"_aliasOf":"transition-duration"},"-o-transition-duration":{"_aliasOf":"transition-duration"},"-webkit-transition-property":{"_aliasOf":"transition-property"},"-moz-transition-property":{"_aliasOf":"transition-property"},"-ms-transition-property":{"_aliasOf":"transition-property"},"-o-transition-property":{"_aliasOf":"transition-property"},"-webkit-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-moz-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-ms-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-o-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-webkit-user-modify":{"_aliasOf":"user-modify"},"-moz-user-modify":{"_aliasOf":"user-modify"},"-khtml-user-modify":{"_aliasOf":"user-modify"},"-webkit-user-select":{"_aliasOf":"user-select"},"-ms-user-select":{"_aliasOf":"user-select"},"-moz-user-select":{"_aliasOf":"user-select"},"-khtml-user-select":{"_aliasOf":"user-select"},"-ms-word-break":{"_aliasOf":"word-break"},"-webkit-writing-mode":{"_aliasOf":"writing-mode"},"-ms-writing-mode":{"_aliasOf":"writing-mode"}} \ No newline at end of file +{"-moz-float-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-force-broken-image-icon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-image-region":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"111","added":1,"removed":112}],"firefox_android":[{"version_last":"111","added":4,"removed":112}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-orient","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-moz-user-focus":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"121","added":1,"removed":122}],"firefox_android":[{"version_last":"121","added":4,"removed":122}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-moz-user-input":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"none":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"134","added":1,"removed":135}],"firefox_android":[{"version_last":"134","added":4,"removed":135}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"-webkit-app-region":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"-webkit-border-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-border-horizontal-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-border-vertical-spacing":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-box-reflect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-axis":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":17,"removed":35}],"chrome_android":[{"version_last":"34","added":18,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-column-break-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-break-inside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-column-progression":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"34","added":22,"removed":35}],"chrome_android":[{"version_last":"34","added":25,"removed":35}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-cursor-visibility":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-hyphenate-limit-after":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-before":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":11,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-hyphenate-limit-lines":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"29","added":16,"removed":30}],"chrome_android":[{"version_last":"29","added":18,"removed":30}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-align":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-box-contain":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"46","added":12,"removed":47}],"chrome_android":[{"version_last":"46","added":18,"removed":47}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-line-grid":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":17,"removed":34}],"chrome_android":[{"version_last":"33","added":18,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-line-snap":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"33","added":19,"removed":34}],"chrome_android":[{"version_last":"33","added":25,"removed":34}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]}}},"-webkit-locale":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-logical-height":{"_aliasOf":"block-size"},"-webkit-logical-width":{"_aliasOf":"inline-size"},"-webkit-margin-after":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-margin-before":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-mask-box-image":{"_aliasOf":"mask-border"},"-webkit-mask-composite":{"_aliasOf":"mask-composite"},"-webkit-mask-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]}}},"-webkit-mask-repeat-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-repeat-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"119","added":3,"removed":120}],"chrome_android":[{"version_last":"119","added":18,"removed":120}],"edge":[{"version_last":"119","added":79,"removed":120}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"14.1","added":5,"removed":15}],"safari_ios":[{"version_last":"14.5","added":5,"removed":15}]}}},"-webkit-mask-source-type":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"-webkit-max-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-max-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-height":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-min-logical-width":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"-webkit-nbsp-mode":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"version_last":"27","added":1,"removed":28}],"chrome_android":[{"version_last":"27","added":18,"removed":28}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-perspective-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-rtl-ordering":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-tap-highlight-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":4}]}}},"-webkit-text-combine":{"_aliasOf":"text-combine-upright"},"-webkit-text-decorations-in-effect":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"13","added":4,"removed":13.1}],"safari_ios":[{"version_last":"13","added":3.2,"removed":13.4}]}}},"-webkit-text-fill-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-fill-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-security":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-security","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":114}],"firefox_android":[{"added":114}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]}}},"-webkit-text-stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width","spec_url":"https://compat.spec.whatwg.org/#the-webkit-text-stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:text-stroke-fill"]}},"-webkit-text-zoom":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]}}},"-webkit-touch-callout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":2}]}}},"-webkit-transform-origin-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-transform-origin-z":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"-webkit-user-drag":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]}}},"accent-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/accent-color","spec_url":"https://drafts.csswg.org/css-ui/#widget-accent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:accent-color"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:accent-color"]}},"maintains_contrast":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#:~:text=must%20maintain%20contrast%20for%20legibility%20of%20the%20control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"impl_url":"https://crbug.com/343503163","added":false}],"edge":[{"added":93}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/244233","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/244233","added":false}]},"tags":["web-features:accent-color"]}}},"align-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"block_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-justify-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:align-content-block"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#align-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/41344054","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/41344054","added":false}],"edge":[{"impl_url":"https://crbug.com/41344054","added":false}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":11}],"safari_ios":[{"partial_implementation":true,"added":11}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.6}],"safari_ios":[{"added":15.6}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-grid/#grid-align"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-multicol/#the-multi-column-model"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:multi-column"]}},"_aliasOf":"align-content"},"align-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-items","spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-items-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"_aliasOf":"align-items"},"align-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/align-self","spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"partial_implementation":true,"version_last":"35","added":21,"removed":36}],"chrome_android":[{"added":36},{"partial_implementation":true,"version_last":"35","added":25,"removed":36}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"first_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"last_baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":108}],"chrome_android":[{"added":108}],"edge":[{"added":108}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-self-property","https://drafts.csswg.org/css-flexbox/#align-items-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#align-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"_aliasOf":"align-self","-ms-grid_context":{"_aliasOf":"grid_context"}},"alignment-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/alignment-baseline","spec_url":["https://drafts.csswg.org/css-inline/#alignment-baseline-property","https://svgwg.org/svg2-draft/text.html#AlignmentBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]},"alphabetic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"baseline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"central":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"ideographic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"mathematical":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}},"middle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:alignment-baseline"]}}},"all":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/all","spec_url":"https://drafts.csswg.org/css-cascade/#all-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":27}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:all"]}},"alt":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}],"safari_ios":[{"version_last":"17.6","added":9,"removed":18},{"prefix":"-webkit-","version_last":"17.6","added":8,"removed":18}]}},"_aliasOf":"alt"},"anchor-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/anchor-name","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-name-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"anchor-scope":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#propdef-anchor-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-anchor-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"animation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation","spec_url":"https://drafts.csswg.org/css-animations/#animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"animation-timeline_included":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":115}],"chrome_android":[{"partial_implementation":true,"added":115}],"edge":[{"partial_implementation":true,"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-driven-animations"]}},"_aliasOf":"animation"},"animation-composition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-composition","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-composition","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:animation-composition"]}},"animation-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-delay","spec_url":"https://drafts.csswg.org/css-animations/#animation-delay","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"_aliasOf":"animation-delay"},"animation-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-direction","spec_url":"https://drafts.csswg.org/css-animations/#animation-direction","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"alternate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"alternate-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-alternate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-direction-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-direction"},"animation-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration","spec_url":"https://drafts.csswg.org/css-animations/#animation-duration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:animations-css"]},"auto":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-duration#Values","spec_url":"https://drafts.csswg.org/css-animations-2/#valdef-animation-duration-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-duration"},"animation-fill-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode","spec_url":"https://drafts.csswg.org/css-animations/#animation-fill-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":4}]},"tags":["web-features:animations-css"]},"backwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-backwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"forwards":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-forwards","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-fill-mode-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-fill-mode"},"animation-iteration-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count","spec_url":"https://drafts.csswg.org/css-animations/#animation-iteration-count","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"infinite":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-iteration-count-infinite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-iteration-count"},"animation-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-name","spec_url":"https://drafts.csswg.org/css-animations/#animation-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-name"},"animation-play-state":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-play-state","spec_url":"https://drafts.csswg.org/css-animations/#animation-play-state","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:animations-css"]},"paused":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-paused","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"running":{"__compat":{"spec_url":"https://drafts.csswg.org/css-animations/#valdef-animation-play-state-running","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-play-state"},"animation-range":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"animation-range-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-end","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-end-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-range-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-range-start","spec_url":"https://drafts.csswg.org/scroll-animations/#animation-range-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-animation-range-start-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline","spec_url":"https://drafts.csswg.org/css-animations-2/#animation-timeline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"scroll":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/scroll","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":110}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timeline/view","spec_url":"https://drafts.csswg.org/scroll-animations/#view-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"animation-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function","spec_url":["https://drafts.csswg.org/css-animations/#animation-timing-function","https://drafts.csswg.org/css-easing/#linear-easing-function-parsin"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43},{"prefix":"-webkit-","added":3}],"chrome_android":[{"added":43},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":5}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:animations-css"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:animations-css"]}},"_aliasOf":"animation-timing-function"},"appearance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/appearance","spec_url":"https://drafts.csswg.org/css-ui/#appearance-switching","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":12}],"firefox":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":80},{"prefix":"-webkit-","added":64},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":1}]},"tags":["web-features:appearance"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":80}],"firefox_android":[{"added":80}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:appearance"]}},"base-select":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":134}],"chrome_android":[{"added":134}],"edge":[{"added":134}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:customizable-select"]}},"button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"checkbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-checkbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"listbox":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-listbox","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"menulist-button":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-menulist-button","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":80},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":80},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"meter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-meter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":54},{"partial_implementation":true,"added":1}],"firefox_android":[{"added":54},{"partial_implementation":true,"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":3}]},"tags":["web-features:appearance"]}},"progress-bar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-progress-bar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"radio":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-radio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"searchfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-searchfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textarea":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textarea","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:appearance"]}},"textfield":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-appearance-textfield","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:appearance"]}},"_aliasOf":"appearance"},"aspect-ratio":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio","spec_url":"https://drafts.csswg.org/css-sizing-4/#aspect-ratio","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-aspect-ratio-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":89}],"firefox_android":[{"added":89}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:aspect-ratio"]}}},"backdrop-filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter","spec_url":"https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":17,"removed":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":18},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":18},{"prefix":"-webkit-","added":9}]},"tags":["web-features:backdrop-filter"]},"_aliasOf":"backdrop-filter"},"backface-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/backface-visibility","spec_url":"https://drafts.csswg.org/css-transforms-2/#backface-visibility-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":5}]},"tags":["web-features:transforms3d"]},"_aliasOf":"backface-visibility"},"background":{"SVG_image_as_background":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3.1}],"safari_ios":[{"added":1}]},"tags":["web-features:svg"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]},"background-clip":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-clip"]}},"background-origin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-origin"]}},"background-size":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":18}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":4}]},"tags":["web-features:background-size"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background"]}}},"background-attachment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-attachment","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-attachment","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":2}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":14,"removed":15.4},{"version_last":"13.1","added":3.1,"removed":14}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":5,"removed":15.4}]},"tags":["web-features:background-attachment"]}},"local":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-local","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":25}],"firefox_android":[{"added":25}],"ie":[{"added":9}],"safari":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.1","added":5,"removed":13}],"safari_ios":[{"added":15.4},{"partial_implementation":true,"version_last":"15.3","added":13,"removed":15.4},{"version_last":"12.2","added":4.2,"removed":13}]},"tags":["web-features:background-attachment"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-attachment-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3.2}]},"tags":["web-features:background-attachment"]}}},"background-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#background-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":35}],"chrome_android":[{"added":35}],"edge":[{"added":79}],"firefox":[{"added":30}],"firefox_android":[{"added":30}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-blend-mode"]}},"background-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-clip","spec_url":["https://drafts.csswg.org/css-backgrounds/#background-clip","https://drafts.csswg.org/css-backgrounds-4/#background-clip"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-clip"]},"border-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-border-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:background-clip-border-area"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-clip"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-clip-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-clip"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-4/#valdef-background-clip-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"partial_implementation":true,"added":3}],"chrome_android":[{"added":120},{"partial_implementation":true,"added":18}],"edge":[{"added":120},{"partial_implementation":true,"added":79},{"version_last":"18","added":15,"removed":79},{"partial_implementation":true,"version_last":"14","added":12,"removed":15}],"firefox":[{"partial_implementation":true,"added":49}],"firefox_android":[{"partial_implementation":true,"added":49}],"ie":[{"added":false}],"safari":[{"added":14},{"partial_implementation":true,"added":4}],"safari_ios":[{"added":14},{"partial_implementation":true,"added":3.2}]},"tags":["web-features:background-clip-text"]}},"_aliasOf":"background-clip"},"background-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-color"]}},"background-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]},"element":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/element","spec_url":"https://drafts.csswg.org/css-images-4/#element-notation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","added":4}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:element"]},"_aliasOf":"element"},"gradients":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:gradients"]}},"image-rect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/-moz-image-rect","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"firefox_android":[{"prefix":"-moz-","version_last":"119","added":4,"removed":120}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"_aliasOf":"image-rect"},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-image"]}},"svg_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}},"-moz-element":{"_aliasOf":"element"},"-moz-image-rect":{"_aliasOf":"image-rect"},"-webkit-image-set":{"_aliasOf":"image-set"}},"background-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-origin","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"partial_implementation":true,"prefix":"-moz-","version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":3},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":1},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-origin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-origin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-origin-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-origin"]}},"_aliasOf":"background-origin"},"background-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position","spec_url":"https://drafts.csswg.org/css-backgrounds/#background-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:background-position"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-position-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]}}},"background-position-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-x","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-position-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-position-y","spec_url":"https://drafts.csswg.org/css-backgrounds-4/#background-position-longhands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-position"]},"side-relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:background-position"]}}},"background-repeat":{"2-value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4}]},"tags":["web-features:background-repeat"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]},"multiple_backgrounds":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"no-repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-no-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"repeat-y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-repeat-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:background-repeat"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":9}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:background-repeat"]}}},"background-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/background-size","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-background-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"3.6","added":3.6,"removed":4}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:background-size"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:background-size"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-background-size-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":3}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:background-size"]}},"_aliasOf":"background-size"},"baseline-shift":{"__compat":{"spec_url":["https://drafts.csswg.org/css-inline/#baseline-shift-property","https://svgwg.org/svg2-draft/text.html#BaselineShiftProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:baseline-shift"]}}},"baseline-source":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#baseline-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-source-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":115}],"firefox_android":[{"added":115}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:baseline-source"]}}},"block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/block-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-height","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-height","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-height","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-height","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-height","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"block-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border","spec_url":"https://drafts.csswg.org/css-backgrounds/#propdef-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-block-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-block-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-block-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-block-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-left-radius"},"border-bottom-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-bottomright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-bottom-right-radius"},"border-bottom-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-bottom-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-collapse","spec_url":"https://drafts.csswg.org/css2/#propdef-border-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]},"collapse":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"separate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}}},"border-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-color","spec_url":["https://drafts.csswg.org/css-logical/#logical-shorthand-keyword","https://drafts.csswg.org/css-backgrounds/#border-color"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-end-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-end-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16},{"prefix":"-webkit-","added":7}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":15},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":15},{"prefix":"-moz-","added":4}],"ie":[{"added":11}],"safari":[{"added":6},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:border-image"]},"fill":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"gradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":7}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":29}],"firefox_android":[{"added":29}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:border-image"]}},"optional_border_image_slice":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"_aliasOf":"border-image"},"border-image-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-outset","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]},"repeat":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"round":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"space":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-space","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":50}],"firefox_android":[{"added":50}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-repeat-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":9.3}]},"tags":["web-features:border-image"]}}},"border-image-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-slice","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"_aliasOf":"border-image-slice"},"border-image-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-source","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}},"border-image-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-image-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-image-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":13}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-border-image-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:border-image"]}}},"border-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-color","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-end-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-color"},"border-inline-end-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-style"},"border-inline-end-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-end-width","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-end-width","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-end-width"},"border-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-start-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color","spec_url":"https://drafts.csswg.org/css-logical/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-color","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-color","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-color"},"border-inline-start-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style","spec_url":"https://drafts.csswg.org/css-logical/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-border-start-style","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-border-start-style","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"border-inline-start-style"},"border-inline-start-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width","spec_url":"https://drafts.csswg.org/css-logical/#border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"border-inline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-style","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-inline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-inline-width","spec_url":"https://drafts.csswg.org/css-logical/#propdef-border-inline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"border-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-left-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-left-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-radius":{"4_values_for_4_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-moz-","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_borders":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-radius"},"border-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":14}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-right-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-right-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-spacing","spec_url":"https://drafts.csswg.org/css2/#separated-borders","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"border-start-end-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-start-start-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius","spec_url":"https://drafts.csswg.org/css-logical/#border-radius-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"border-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}}},"border-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-color","spec_url":"https://drafts.csswg.org/css-backgrounds/#border-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-left-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topleft","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-left-radius"},"border-top-right-radius":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-radius","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"11","added":1,"removed":12}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"alternative_name":"-moz-border-radius-topright","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":4.2},{"prefix":"-webkit-","added":1}]},"tags":["web-features:border-radius"]},"elliptical_corners":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:border-radius"]}},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"partial_implementation":true,"version_last":"3.6","added":1,"removed":4}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:border-radius"]}},"_aliasOf":"border-top-right-radius"},"border-top-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-style","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-top-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-top-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:borders"]}},"border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/border-width","spec_url":"https://drafts.csswg.org/css-backgrounds/#the-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:borders"]}},"bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/bottom","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"box-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-align","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-align"},"box-decoration-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break","spec_url":"https://drafts.csswg.org/css-break/#break-decoration","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":25}],"edge":[{"added":130},{"partial_implementation":true,"prefix":"-webkit-","added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"prefix":"-webkit-","added":7}],"safari_ios":[{"partial_implementation":true,"prefix":"-webkit-","added":7}]},"tags":["web-features:box-decoration-break"]},"clone":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-clone","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"slice":{"__compat":{"spec_url":"https://drafts.csswg.org/css-break/#valdef-box-decoration-break-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130},{"partial_implementation":true,"added":22}],"chrome_android":[{"added":130},{"partial_implementation":true,"added":25}],"edge":[{"added":130},{"partial_implementation":true,"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:box-decoration-break"]}},"_aliasOf":"box-decoration-break"},"box-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-direction","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-direction"},"box-flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex"},"box-flex-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-flex-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-flex-group"},"box-lines":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-lines","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","version_last":"66","added":1,"removed":67}],"chrome_android":[{"prefix":"-webkit-","version_last":"66","added":18,"removed":67}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-lines"},"box-ordinal-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-ordinal-group"},"box-orient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-orient","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-orient"},"box-pack":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-pack","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":1.1,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":1}]}},"_aliasOf":"box-pack"},"box-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-shadow","spec_url":"https://drafts.csswg.org/css-backgrounds/#box-shadow","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"12","added":3.5,"removed":13}],"firefox_android":[{"added":4},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"10","added":4,"removed":14}],"ie":[{"added":9}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":5},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-shadow"]},"inset":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"multiple_shadows":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:box-shadow"]}},"spread_radius":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:box-shadow"]}},"_aliasOf":"box-shadow"},"box-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/box-sizing","spec_url":"https://drafts.csswg.org/css-sizing/#box-sizing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":10},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":29},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":8}],"safari":[{"added":5.1},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":6},{"prefix":"-webkit-","added":1}]},"tags":["web-features:box-sizing"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-box-sizing-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:box-sizing"]}},"_aliasOf":"box-sizing"},"break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-after","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}}},"break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-before","spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"partial_implementation":true,"added":65}],"firefox_android":[{"partial_implementation":true,"added":65}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":102}],"chrome_android":[{"added":102}],"edge":[{"added":102},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}},"column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:column-breaks"]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-between","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"always":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40438447","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40438447","added":false}],"edge":[{"impl_url":"https://crbug.com/40438447","added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}},"recto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"verso":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}}},"break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/break-inside","spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":79}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]}},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]},"avoid-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:column-breaks"]}}},"paged_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-break/#break-within","https://drafts.csswg.org/css-regions/#region-flow-break","https://drafts.csswg.org/css-multicol/#break-before-break-after-break-inside"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":10}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:page-breaks"]},"avoid-page":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":51}],"chrome_android":[{"added":51}],"edge":[{"added":12}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:page-breaks"]}}}},"caption-side":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caption-side","spec_url":["https://drafts.csswg.org/css2/#propdef-caption-side","https://drafts.csswg.org/css-logical/#caption-side"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]},"bottom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"bottom-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":1,"removed":17}]}}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"version_last":"16.6","added":1,"removed":17}],"safari_ios":[{"version_last":"16.6","added":1,"removed":17}]}}},"top":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"top-outside":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"version_last":"86","added":1,"removed":87}],"firefox_android":[{"version_last":"86","added":4,"removed":87}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}},"writing-mode_relative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":42}],"firefox_android":[{"added":42}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:table"]}}},"caret-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/caret-color","spec_url":"https://drafts.csswg.org/css-ui/#caret-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:caret-color"]}},"clear":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clear","spec_url":["https://drafts.csswg.org/css2/#propdef-clear","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-clear-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip","spec_url":"https://drafts.fxtf.org/css-masking/#clip-property","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:clip"]},"auto":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:clip"]}}},"clip-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-path","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":23}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"partial_implementation":true,"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"partial_implementation":true,"added":10}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:clip-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#typedef-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":54}],"firefox_android":[{"added":54}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"added":49}],"firefox_android":[{"added":49}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:clip-path-animatable"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88}],"chrome_android":[{"added":88}],"edge":[{"added":88}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1},{"prefix":"-webkit-","added":10}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":10}]},"tags":["web-features:clip-path"]},"_aliasOf":"path"},"stroke-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":51}],"firefox_android":[{"added":51}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:clip-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-clip-path-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":54}],"firefox_android":[{"added":54}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:clip-path-boxes"]}},"_aliasOf":"clip-path","-webkit-path":{"_aliasOf":"path"}},"clip-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/clip-rule","spec_url":"https://drafts.fxtf.org/css-masking/#the-clip-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking-1/#valdef-clip-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":15}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}}},"color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color","spec_url":["https://drafts.csswg.org/css-color/#the-color-property","https://svgwg.org/svg2-draft/painting.html#ColorProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:color"]}},"color-adjust":{"_aliasOf":"print-color-adjust"},"color-interpolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation","spec_url":"https://svgwg.org/svg2-draft/painting.html#ColorInterpolationProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"linearGradient":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":123}],"firefox_android":[{"added":123}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"sRGB":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:svg"]}}},"color-interpolation-filters":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-interpolation-filters","spec_url":"https://drafts.fxtf.org/filter-effects/#ColorInterpolationFiltersProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:svg-filters"]}},"linearRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-linearrgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}},"sRGB":{"__compat":{"spec_url":"https://drafts.fxtf.org/filter-effects-1/#valdef-color-interpolation-filters-srgb","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg-filters"]}}},"color-scheme":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/color-scheme","spec_url":"https://drafts.csswg.org/css-color-adjust/#color-scheme-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]},"dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"normal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_dark":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}},"only_light":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98},{"version_last":"84","added":81,"removed":85}],"chrome_android":[{"added":98},{"version_last":"84","added":81,"removed":85}],"edge":[{"added":98},{"version_last":"84","added":81,"removed":85}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:color-scheme"]}}},"column-count":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-count","spec_url":"https://drafts.csswg.org/css-multicol/#cc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":4,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-count-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-count"},"column-fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-fill","spec_url":"https://drafts.csswg.org/css-multicol/#cf","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":17,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","version_last":"68","added":17,"removed":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:column-fill"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-fill-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12}],"firefox":[{"added":17}],"firefox_android":[{"added":17}],"ie":[{"added":11}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:column-fill"]}},"_aliasOf":"column-fill"},"column-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-gap","spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-column-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-column-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-column-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-column-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-column-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#column-row-gap","https://drafts.csswg.org/css-grid/#gutters","https://drafts.csswg.org/css-multicol/#column-gap"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":10},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":10},{"prefix":"-webkit-","added":3}]},"tags":["web-features:multi-column"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:multi-column"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":12}],"safari_ios":[{"added":12}]},"tags":["web-features:multi-column"]}},"_aliasOf":"multicol_context"},"grid-column-gap":{"_aliasOf":"grid_context"},"-webkit-multicol_context":{"_aliasOf":"multicol_context"},"-moz-multicol_context":{"_aliasOf":"multicol_context"}},"column-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule","spec_url":"https://drafts.csswg.org/css-multicol/#column-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule"},"column-rule-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-color","spec_url":"https://drafts.csswg.org/css-multicol/#crc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-color"},"column-rule-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-style","spec_url":"https://drafts.csswg.org/css-multicol/#crs","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-style"},"column-rule-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-rule-width","spec_url":"https://drafts.csswg.org/css-multicol/#crw","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":3.5,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"_aliasOf":"column-rule-width"},"column-span":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-span","spec_url":"https://drafts.csswg.org/css-multicol/#column-span","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":5}]},"tags":["web-features:column-span"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-multicol/#valdef-column-span-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:column-span"]}},"_aliasOf":"column-span"},"column-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/column-width","spec_url":["https://drafts.csswg.org/css-sizing/#column-sizing","https://drafts.csswg.org/css-multicol/#cw"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":50},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"73","added":1.5,"removed":74}],"firefox_android":[{"added":50},{"prefix":"-moz-","added":4}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:multi-column"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:multi-column"]}},"_aliasOf":"column-width"},"columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/columns","spec_url":"https://drafts.csswg.org/css-multicol/#columns","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":50},{"prefix":"-webkit-","added":50}],"chrome_android":[{"added":50}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":52},{"prefix":"-moz-","version_last":"73","added":9,"removed":74}],"firefox_android":[{"added":52},{"prefix":"-moz-","added":22}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:multi-column"]},"_aliasOf":"columns"},"contain":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain","spec_url":"https://drafts.csswg.org/css-contain/#contain-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#inline-size","spec_url":"https://drafts.csswg.org/css-contain-2/#valdef-contain-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":101}],"firefox_android":[{"added":101}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:contain-inline-size"]}},"layout":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-layout"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"paint":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-paint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-paint"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-size"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain"]}},"style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain#style","spec_url":"https://drafts.csswg.org/css-contain/#valdef-contain-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:contain-style"]}}},"contain-intrinsic-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-block-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-block-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-height","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-inline-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"auto_none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"contain-intrinsic-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width","spec_url":"https://drafts.csswg.org/css-sizing-4/#propdef-contain-intrinsic-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":95}],"chrome_android":[{"added":95}],"edge":[{"added":95}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-contain-intrinsic-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":98}],"chrome_android":[{"added":98}],"edge":[{"added":98}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:contain-intrinsic-size"]}}},"container":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"container-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-name","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-name","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"container-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/container-type","spec_url":"https://drafts.csswg.org/css-conditional-5/#container-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]},"inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-inline-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}},"scroll-state":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-scroll-state","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:container-scroll-state-queries"]}},"size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-conditional-5/#valdef-container-type-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":105}],"chrome_android":[{"added":105}],"edge":[{"added":105}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:container-queries"]}}},"content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content","spec_url":"https://drafts.csswg.org/css-content/#content-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]},"alt_text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":128}],"firefox_android":[{"added":128}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:alt-text-generated-content"]}},"element_replacement":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":79}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:content"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images-4/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"partial_implementation":true,"added":113}],"firefox_android":[{"partial_implementation":true,"added":113}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:content"]}},"image-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image/image-set","spec_url":"https://drafts.csswg.org/css-images-4/#image-set-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":20,"removed":113}],"chrome_android":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":25,"removed":113}],"edge":[{"added":113},{"prefix":"-webkit-","added":113},{"partial_implementation":true,"prefix":"-webkit-","version_last":"112","added":79,"removed":113}],"firefox":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"firefox_android":[{"added":89},{"prefix":"-webkit-","added":90},{"partial_implementation":true,"version_last":"88","added":88,"removed":89}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.1","added":10.1,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.1","added":6,"removed":14}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":17},{"partial_implementation":true,"version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"prefix":"-webkit-","version_last":"16.6","added":14,"removed":17},{"partial_implementation":true,"version_last":"13.4","added":10.3,"removed":14},{"partial_implementation":true,"prefix":"-webkit-","version_last":"13.4","added":6,"removed":14}]},"tags":["web-features:image-set"]},"_aliasOf":"image-set"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"none_applies_to_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.element-content-none.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:content"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-content-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"url":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/url_function","spec_url":"https://drafts.csswg.org/css-values/#urls","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:content"]}},"-webkit-image-set":{"_aliasOf":"image-set"}},"content-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/content-visibility","spec_url":"https://drafts.csswg.org/css-contain/#content-visibility","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}],"safari_ios":[{"impl_url":"https://webkit.org/b/283846","partial_implementation":true,"added":18}]},"tags":["web-features:content-visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#content-visibility-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-contain/#valdef-content-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:content-visibility"]}}},"counter-increment":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-increment","spec_url":"https://drafts.csswg.org/css-lists/#increment-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":28}],"chrome_android":[{"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}}},"counter-reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-reset","spec_url":"https://drafts.csswg.org/css-lists/#counter-reset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:counters"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":28}],"chrome_android":[{"partial_implementation":true,"added":28}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"partial_implementation":true,"added":9}],"safari_ios":[{"partial_implementation":true,"added":9}]},"tags":["web-features:counters"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-reset-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":25}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:counters"]}},"reset_does_not_affect_siblings":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":82}],"firefox_android":[{"added":82}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counters"]}},"reversed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#css-counter-reversed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":96}],"firefox_android":[{"added":96}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:counter-reset-reversed"]}}},"counter-set":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/counter-set","spec_url":"https://drafts.csswg.org/css-lists/#propdef-counter-set","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]},"list-item":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-counter-increment-list-item","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-counter-set-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:counter-set"]}}},"cursor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cursor","spec_url":"https://drafts.csswg.org/css-ui/#cursor","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]},"alias":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-alias","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"all-scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-all-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"cell":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-cell","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"col-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-col-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"context-menu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-context-menu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"copy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-copy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"crosshair":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-crosshair","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"default":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-default","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"e-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-e-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ew-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ew-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"grab":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":27},{"prefix":"-moz-","added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grab"},"grabbing":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-grabbing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":68},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":27}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"grabbing"},"help":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-help","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"move":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-move","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"n-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-n-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ne-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ne-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nesw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nesw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"no-drop":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-no-drop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":95}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"not-allowed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-not-allowed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"ns-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-ns-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"nwse-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-nwse-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":10}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"pointer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-pointer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"progress":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-progress","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"row-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-row-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"s-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-s-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"se-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-se-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"sw-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-sw-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":6}],"safari":[{"added":3}],"safari_ios":[{"added":13.4}]},"tags":["web-features:cursor"]}},"url_positioning_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"vertical-text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-vertical-text","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"w-resize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-w-resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"wait":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-wait","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":95}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]}},"zoom-in":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-in","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-in"},"zoom-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-cursor-zoom-out","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":37},{"prefix":"-webkit-","added":18}],"edge":[{"added":12}],"firefox":[{"added":24},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":95}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:cursor"]},"_aliasOf":"zoom-out"},"-webkit-grab":{"_aliasOf":"grab"},"-moz-grab":{"_aliasOf":"grab"},"-webkit-grabbing":{"_aliasOf":"grabbing"},"-webkit-zoom-in":{"_aliasOf":"zoom-in"},"-moz-zoom-in":{"_aliasOf":"zoom-in"},"-webkit-zoom-out":{"_aliasOf":"zoom-out"},"-moz-zoom-out":{"_aliasOf":"zoom-out"}},"custom-property":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/--*","spec_url":"https://drafts.csswg.org/css-variables/#defining-variables","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":15}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:custom-properties"]}},"cx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"cy":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/cy","spec_url":"https://svgwg.org/svg2-draft/geometry.html#CY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"d":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/d","spec_url":"https://svgwg.org/svg2-draft/paths.html#TheDProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/direction","spec_url":["https://drafts.csswg.org/css-writing-modes/#direction","https://svgwg.org/svg2-draft/text.html#DirectionProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"ltr":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-ltr","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"rtl":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-direction-rtl","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"vertical_slider_direction":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124}],"chrome_android":[{"added":124}],"edge":[{"added":124}],"firefox":[{"partial_implementation":true,"added":120}],"firefox_android":[{"partial_implementation":true,"added":120}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":16.5}],"safari_ios":[{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}}},"display":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display","spec_url":["https://drafts.csswg.org/css-display/#the-display-properties","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":37}],"firefox_android":[{"added":37}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:display-contents"]},"contents_unusual":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":65}],"chrome_android":[{"added":65}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-contents"]}},"focusable_elements":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40866683","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40866683","added":false}],"edge":[{"impl_url":"https://crbug.com/40866683","added":false}],"firefox":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"firefox_android":[{"impl_url":["https://bugzil.la/1791648","https://bugzil.la/1553549"],"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/255149","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/255149","added":false}]},"tags":["web-features:display-contents"]}}},"flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"partial_implementation":true,"added":11},{"alternative_name":"-ms-flexbox","partial_implementation":true,"added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex"},"flow-root":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58}],"chrome_android":[{"added":58}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:display-flow-root"]}},"grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid"},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#typedef-display-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8},{"partial_implementation":true,"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]}},"inline-flex":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-inline-flexbox","added":8}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"inline-flex"},"inline-grid":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"prefix":"-ms-","added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"inline-grid"},"inline-table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"is_transitionable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"keyframe_animatable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#display-animation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1834877","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1834877","added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:display-animation"]}},"list-item":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/display-listitem","spec_url":"https://drafts.csswg.org/css-display/#typedef-display-listitem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-list-item"]},"legend-support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-list-item"]}}},"math":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"multi-keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:two-value-display"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-display-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display"]},"option_is_hidden":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display"]}}},"ruby":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-base-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"ruby-text-container":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":7}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:display-ruby"]}},"table":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:display-table"]}},"table-cell":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-column-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-footer-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-header-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"table-row-group":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:display-table"]}},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flexbox":{"_aliasOf":"flex"},"-ms-grid":{"_aliasOf":"grid"},"-webkit-inline-flex":{"_aliasOf":"inline-flex"},"-ms-inline-flexbox":{"_aliasOf":"inline-flex"},"-ms-inline-grid":{"_aliasOf":"inline-grid"}},"dominant-baseline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/dominant-baseline","spec_url":["https://drafts.csswg.org/css-inline/#dominant-baseline-property","https://svgwg.org/svg2-draft/text.html#DominantBaselineProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]},"alphabetic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-alphabetic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"central":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-central","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"mathematical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-mathematical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-dominant-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:dominant-baseline"]}}},"dynamic-range-limit":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#the-dynamic-range-limit-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"constrained":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-constrained","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"no-limit":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-no-limit","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"standard":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-hdr/#valdef-dynamic-range-limit-standard","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"empty-cells":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/empty-cells","spec_url":"https://drafts.csswg.org/css2/#empty-cells","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:table"]}},"field-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/field-sizing","spec_url":"https://drafts.csswg.org/css-ui/#field-sizing","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]},"content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#valdef-field-sizing-fixed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"impl_url":"https://bugzil.la/1832409","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1832409","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/264720","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/264720","added":false}]},"tags":["web-features:field-sizing"]}}},"fill":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"fill-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:opacity-svg"]}},"fill-rule":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fill-rule","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#fill-rule","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"evenodd":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-evenodd","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"nonzero":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-fill-rule-nonzero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"filter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/filter","spec_url":"https://drafts.fxtf.org/filter-effects/#FilterProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53},{"prefix":"-webkit-","added":18}],"chrome_android":[{"added":53}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":35},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":35},{"prefix":"-webkit-","added":49}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":6}]},"tags":["web-features:filter"]},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/246106","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/246106","added":false}]},"tags":["web-features:svg-filters"]}},"_aliasOf":"filter"},"flex":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex"},"flex-basis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-basis","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-basis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":22},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":22},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":22}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":22}],"firefox_android":[{"added":22}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"auto"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":94},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"fit-content"},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":66},{"prefix":"-moz-","added":22}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":22}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:flexbox"]},"_aliasOf":"min-content"},"_aliasOf":"flex-basis","-webkit-auto":{"_aliasOf":"auto"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"flex-direction":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-direction","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-direction-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"column-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-column-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"row-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-direction-row-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":81},{"partial_implementation":true,"added":72}],"firefox_android":[{"added":81},{"partial_implementation":true,"added":79}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-direction"},"flex-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-flow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":28},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-flow"},"flex-grow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-grow","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-grow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11},{"alternative_name":"-ms-flex-positive","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"less_than_zero_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":49}],"chrome_android":[{"added":49}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-grow"},"flex-shrink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-shrink","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-shrink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":8}]},"tags":["web-features:flexbox"]},"_aliasOf":"flex-shrink"},"flex-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flex-wrap","spec_url":"https://drafts.csswg.org/css-flexbox/#flex-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"partial_implementation":true,"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"wrap-reverse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-flexbox/#valdef-flex-wrap-wrap-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]}},"_aliasOf":"flex-wrap"},"float":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/float","spec_url":["https://drafts.csswg.org/css2/#propdef-float","https://drafts.csswg.org/css-logical/#float-clear"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-logical/#float-clear","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:logical-properties"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-float-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:float-clear"]}}},"flood-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-color","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"flood-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/flood-opacity","spec_url":"https://drafts.fxtf.org/filter-effects/#FloodOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"font":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font","spec_url":"https://drafts.csswg.org/css-fonts/#font-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]},"caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"font-width_keyword_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]}},"icon":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"menu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"message-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"small-caption":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}},"status-bar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-shorthand"]}}},"font-family":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family","spec_url":["https://drafts.csswg.org/css-fonts/#generic-font-families","https://drafts.csswg.org/css-fonts/#font-family-prop"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-family"]},"math":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#math","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-family-math"]}},"system-ui":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#system-ui","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":92},{"alternative_name":"-apple-system","added":43}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"-apple-system","added":9}],"safari_ios":[{"added":11},{"alternative_name":"-apple-system","added":9}]},"tags":["web-features:font-family-system"]},"_aliasOf":"system-ui"},"ui-monospace":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-monospace","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-rounded":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-rounded","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-sans-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-sans-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"ui-serif":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-family#ui-serif","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40194142","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40194142","added":false}],"edge":[{"impl_url":"https://crbug.com/40194142","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1461302","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1461302","added":false}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-family-ui"]}},"-apple-system":{"_aliasOf":"system-ui"}},"font-feature-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":15}],"firefox":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"firefox_android":[{"added":34},{"prefix":"-webkit-","added":129},{"prefix":"-moz-","added":15}],"ie":[{"added":10}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-feature-settings-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":16}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-feature-settings"]}},"_aliasOf":"font-feature-settings"},"font-kerning":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-kerning","spec_url":"https://drafts.csswg.org/css-fonts/#font-kerning-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"chrome_android":[{"added":33},{"prefix":"-webkit-","version_last":"32","added":29,"removed":33}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":6}]},"tags":["web-features:font-kerning"]},"_aliasOf":"font-kerning"},"font-language-override":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-language-override","spec_url":"https://drafts.csswg.org/css-fonts/#font-language-override-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":34},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-language-override"]},"_aliasOf":"font-language-override"},"font-optical-sizing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing","spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-auto-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-optical-sizing-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:font-optical-sizing"]}}},"font-palette":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette","spec_url":"https://drafts.csswg.org/css-fonts/#font-palette-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]},"animation_computed":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}},"dark":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-dark","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"light":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-light","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-palette-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":101}],"chrome_android":[{"added":101}],"edge":[{"added":101}],"firefox":[{"added":107}],"firefox_android":[{"added":107}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:font-palette"]}},"palette-mix_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-palette/palette-mix","spec_url":"https://drafts.csswg.org/css-fonts/#typedef-font-palette-palette-mix","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-palette-animation"]}}},"font-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size","spec_url":"https://drafts.csswg.org/css-fonts/#font-size-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-size"]},"math":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"rem_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":42}],"edge":[{"added":12}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":9}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-size"]}},"xxx-large":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size"]}}},"font-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust","spec_url":"https://drafts.csswg.org/css-fonts-5/#font-size-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3},{"partial_implementation":true,"version_last":"2","added":1,"removed":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts-5/#valdef-font-size-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-size-adjust"]}},"two-values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":127}],"chrome_android":[{"added":127}],"edge":[{"added":127}],"firefox":[{"added":92}],"firefox_android":[{"added":92}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:font-size-adjust"]}}},"font-smooth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-smooth","status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"alternative_name":"-webkit-font-smoothing","added":5}],"chrome_android":[{"alternative_name":"-webkit-font-smoothing","added":18}],"edge":[{"alternative_name":"-webkit-font-smoothing","added":79}],"firefox":[{"alternative_name":"-moz-osx-font-smoothing","added":25}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-font-smoothing","added":4}],"safari_ios":[{"alternative_name":"-webkit-font-smoothing","added":3.2}]}},"_aliasOf":"font-smooth"},"font-stretch":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-stretch","spec_url":"https://drafts.csswg.org/css-fonts/#font-stretch-prop","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":12}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":9}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-stretch"]},"percentage":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":18}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-stretch"]}}},"font-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-style-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]},"italic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-italic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-style"]}},"oblique-angle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-style-oblique-angle--90deg-90deg","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:font-style"]}}},"font-synthesis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-synthesis"]},"position":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis"]}},"small-caps":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}},"weight":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:font-synthesis"]}}},"font-synthesis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-position","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-position-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":118}],"firefox_android":[{"added":118}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-synthesis-position"]}}},"font-synthesis-small-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-small-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-small-caps-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-small-caps"]}}},"font-synthesis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-style","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-style"]}}},"font-synthesis-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-synthesis-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-synthesis-weight","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-synthesis-weight-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":97}],"chrome_android":[{"added":97}],"edge":[{"added":97}],"firefox":[{"added":111}],"firefox_android":[{"added":111}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:font-synthesis-weight"]}}},"font-variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant","spec_url":["https://drafts.csswg.org/css-fonts/#font-variant-prop","https://svgwg.org/svg2-draft/text.html#FontVariantProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]},"css_fonts_shorthand":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-size-adjust-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:font-variant"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-variant"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:font-variant"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant"]}}},"font-variant-alternates":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]},"annotation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#annotation()","spec_url":"https://drafts.csswg.org/css-fonts/#annotation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"character_variant":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#character-variant()","spec_url":"https://drafts.csswg.org/css-fonts/#character-variant","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"historical-forms":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-alternates-historical-forms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-alternates-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-alternates"]}},"ornaments":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#ornaments()","spec_url":"https://drafts.csswg.org/css-fonts/#ornaments","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"styleset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#styleset()","spec_url":"https://drafts.csswg.org/css-fonts/#styleset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"stylistic":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#stylistic()","spec_url":"https://drafts.csswg.org/css-fonts/#stylistic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}},"swash":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates#swash()","spec_url":"https://drafts.csswg.org/css-fonts/#swash","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":16.2}],"safari_ios":[{"added":16.2}]},"tags":["web-features:font-variant-alternates"]}}},"font-variant-caps":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-caps-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]},"all-petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"all-small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-all-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"petite-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-petite-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"small-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-small-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"titling-caps":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-titling-caps","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}},"unicase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-caps-unicase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-caps"]}}},"font-variant-east-asian":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis04":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis04","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis78":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis78","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis83":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis83","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"jis90":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-jis90","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-east-asian-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"proportional-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-proportional-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"ruby":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-ruby","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"simplified":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-simplified","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}},"traditional":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-east-asian-traditional","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-east-asian"]}}},"font-variant-emoji":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-emoji","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-emoji-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"flags":[{"name":"layout.css.font-variant-emoji.enabled","type":"preference","value_to_set":"true"}],"added":108}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}],"safari_ios":[{"flags":[{"name":"CSS font-variant-emoji property","type":"preference","value_to_set":"true"}],"added":17.5}]},"tags":["web-features:font-variant-emoji"]},"emoji":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-emoji","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"text":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-text","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}},"unicode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-emoji-unicode","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":131}],"chrome_android":[{"added":131}],"edge":[{"added":131}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:font-variant-emoji"]}}},"font-variant-ligatures":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34},{"prefix":"-webkit-","added":31}],"chrome_android":[{"added":34},{"prefix":"-webkit-","added":31}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9.3},{"prefix":"-webkit-","added":7}]},"tags":["web-features:font-variant-ligatures"]},"common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-common-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-common-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-contextual":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-contextual","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-discretionary-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-discretionary-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"no-historical-ligatures":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-ligatures-no-historical-ligatures","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-none-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-ligatures-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:font-variant-ligatures"]}},"_aliasOf":"font-variant-ligatures"},"font-variant-numeric":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]},"diagonal-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-diagonal-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"lining-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-lining-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-numeric-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"oldstyle-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-oldstyle-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"ordinal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-ordinal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"proportional-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-proportional-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"slashed-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-slashed-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"stacked-fractions":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-stacked-fractions","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}},"tabular-nums":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-numeric-tabular-nums","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":79}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-numeric"]}}},"font-variant-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variant-position","spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#font-variant-position-normal-value","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-variant-position-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":34}],"firefox_android":[{"added":34}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:font-variant-position"]}}},"font-variation-settings":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings","spec_url":"https://drafts.csswg.org/css-fonts/#font-variation-settings-def","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-variation-settings"]}},"font-weight":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/font-weight","spec_url":"https://drafts.csswg.org/css-fonts/#font-weight-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]},"bold":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bold","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"bolder":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-bolder","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"lighter":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-weight-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:font-weight"]}},"number":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":17}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:font-weight"]}}},"font-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#propdef-font-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]},"condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"extra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-extra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"semi-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-semi-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-condensed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-condensed","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}},"ultra-expanded":{"__compat":{"spec_url":"https://drafts.csswg.org/css-fonts/#valdef-font-width-ultra-expanded","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:font-width"]}}},"forced-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#forced-color-adjust-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79},{"alternative_name":"-ms-high-contrast-adjust","added":12}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"alternative_name":"-ms-high-contrast-adjust","added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":79}],"firefox":[{"added":113}],"firefox_android":[{"added":113}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"preserve-parent-color":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-forced-color-adjust-preserve-parent-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":106}],"chrome_android":[{"added":106}],"edge":[{"added":106}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:forced-colors"]}},"_aliasOf":"forced-color-adjust"},"gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gap","spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-gap","added":10.3}]},"tags":["web-features:grid"]},"calc_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:grid"]}},"percentage_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"_aliasOf":"grid_context"},"multicol_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#gap-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66}],"chrome_android":[{"added":66}],"edge":[{"added":16}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:multi-column"]}},"grid-gap":{"_aliasOf":"grid_context"}},"glyph-orientation-vertical":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes-4/#glyph-orientation","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:glyph-orientation-vertical"]}},"grid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid","spec_url":"https://drafts.csswg.org/css-grid/#grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-area","spec_url":"https://drafts.csswg.org/css-grid/#propdef-grid-area","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-auto-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-columns"},"grid-auto-flow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow","spec_url":"https://drafts.csswg.org/css-grid/#grid-auto-flow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"column":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-column","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"dense":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-dense","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"row":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-auto-flow-row","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-auto-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows","spec_url":"https://drafts.csswg.org/css-grid/#auto-tracks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":70},{"partial_implementation":true,"version_last":"69","added":52,"removed":70}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":52,"removed":79}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid-auto-rows"},"grid-column":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-column-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-column-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row","spec_url":"https://drafts.csswg.org/css-grid/#placement-shorthands","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-end","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-row-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-row-start","spec_url":"https://drafts.csswg.org/css-grid/#line-placement","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"grid-template":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template","spec_url":"https://drafts.csswg.org/css-grid/#explicit-grid-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-areas":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas","spec_url":"https://drafts.csswg.org/css-grid/#grid-template-areas-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-areas-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"grid-template-columns":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-columns","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-columns","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-columns"},"grid-template-rows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows","spec_url":["https://drafts.csswg.org/css-grid/#track-sizing","https://drafts.csswg.org/css-grid/#subgrids"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16},{"alternative_name":"-ms-grid-rows","version_last":"18","added":12,"removed":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"alternative_name":"-ms-grid-rows","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"animation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":107}],"chrome_android":[{"added":107}],"edge":[{"added":107}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:grid-animation"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"masonry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Masonry_layout","spec_url":"https://drafts.csswg.org/css-grid-3/#masonry-layout","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40128480","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40128480","added":false}],"edge":[{"impl_url":"https://crbug.com/40128480","added":false}],"firefox":[{"flags":[{"name":"layout.css.grid-template-masonry-value.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://bugzil.la/1757446","added":77}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/248287","added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:masonry"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid-2/#valdef-grid-template-columns-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"minmax":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/minmax","spec_url":"https://drafts.csswg.org/css-grid/#funcdef-grid-template-columns-minmax","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-grid/#valdef-grid-template-rows-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/repeat","spec_url":"https://drafts.csswg.org/css-grid/#repeat-notation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":76},{"partial_implementation":true,"version_last":"75","added":57,"removed":76},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"firefox_android":[{"added":79},{"partial_implementation":true,"version_last":"68","added":57,"removed":79},{"partial_implementation":true,"version_last":"56","added":52,"removed":57}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"subgrid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/CSS_grid_layout/Subgrid","spec_url":"https://drafts.csswg.org/css-grid/#subgrids","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":71}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:subgrid"]}},"_aliasOf":"grid-template-rows"},"hanging-punctuation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation","spec_url":"https://drafts.csswg.org/css-text/#hanging-punctuation-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"partial_implementation":true,"added":10}],"safari_ios":[{"partial_implementation":true,"added":10}]},"tags":["web-features:hanging-punctuation"]},"allow-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-allow-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}},"first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-first","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}},"last":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-last","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-hanging-punctuation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:hanging-punctuation"]}}},"height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/height","spec_url":["https://drafts.csswg.org/css-sizing/#preferred-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"hyphenate-character":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-character","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-character","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":106},{"prefix":"-webkit-","added":6}],"chrome_android":[{"added":106},{"prefix":"-webkit-","added":18}],"edge":[{"added":106},{"prefix":"-webkit-","added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":5}]},"tags":["web-features:hyphenate-character"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-character-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":98}],"firefox_android":[{"added":98}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphenate-character"]}},"_aliasOf":"hyphenate-character"},"hyphenate-limit-chars":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphenate-limit-chars","spec_url":"https://drafts.csswg.org/css-text-4/#propdef-hyphenate-limit-chars","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-hyphenate-limit-chars-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphenate-limit-chars"]}}},"hyphens":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/hyphens","spec_url":"https://drafts.csswg.org/css-text/#hyphens-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"prefix":"-webkit-","added":13}],"chrome_android":[{"added":55},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":43},{"prefix":"-moz-","added":6}],"firefox_android":[{"added":43},{"prefix":"-moz-","added":6}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":17},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":17},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:hyphens"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":88},{"partial_implementation":true,"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":88},{"partial_implementation":true,"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":4.2}]},"tags":["web-features:hyphens"]}},"language_afrikaans":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_albanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_armenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_assamese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_basque":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_belarusian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bengali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bosnian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_bulgarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_catalan":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_croatian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_cyrillic_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_czech":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_danish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_dutch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_english":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":12}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":10}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_esperanto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_estonian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_mul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ethiopic_script_und":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_finnish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_french":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_galician":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_georgian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_reformed_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_german_swiss_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_german_traditional_orthography":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_gujarati":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hindi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_hungarian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_icelandic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_interlingua":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_irish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_italian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_kannada":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_kurmanji":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latin":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_latvian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_lithuanian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_malayalam":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_marathi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_modern_greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_mongolian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_norwegian_nn":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_norwegian_no":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_old_slavonic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_oriya":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_polish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":31}],"firefox_android":[{"added":31}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_portuguese":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_punjabi":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_russian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_slovak":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":130}],"firefox_android":[{"added":130}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_slovenian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_spanish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_swedish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_tamil":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_telugu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_turkish":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:hyphens"]}},"language_turkmen":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_ukrainian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":112}],"chrome_android":[{"added":112}],"edge":[{"added":112}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:hyphens"]}},"language_upper_sorbian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"language_welsh":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":8}],"firefox_android":[{"added":8}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:hyphens"]}},"_aliasOf":"hyphens"},"image-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-orientation","spec_url":"https://drafts.csswg.org/css-images/#the-image-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]},"from-image":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-from-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-orientation-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":81}],"chrome_android":[{"added":81}],"edge":[{"added":81}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:image-orientation"]}}},"image-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image-rendering","spec_url":["https://drafts.csswg.org/css-images/#the-image-rendering","https://svgwg.org/svg2-draft/painting.html#ImageRendering"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:image-rendering"]}},"crisp-edges":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-crisp-edges","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-optimize-contrast","added":13}],"chrome_android":[{"alternative_name":"-webkit-optimize-contrast","added":18}],"edge":[{"alternative_name":"-webkit-optimize-contrast","added":79}],"firefox":[{"added":65},{"prefix":"-moz-","added":3.6}],"firefox_android":[{"added":65},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}],"safari_ios":[{"added":7},{"alternative_name":"-webkit-optimize-contrast","added":6}]},"tags":["web-features:crisp-edges"]},"_aliasOf":"crisp-edges"},"optimizeQuality":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"optimizeSpeed":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"pixelated":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-pixelated","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:image-rendering"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-image-rendering-smooth","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":93}],"firefox_android":[{"added":93}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:smooth"]}},"-webkit-optimize-contrast":{"_aliasOf":"crisp-edges"},"-moz-crisp-edges":{"_aliasOf":"crisp-edges"}},"ime-mode":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#input-method-editor","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ime-mode"]},"_aliasOf":"ime-mode"},"initial-letter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/initial-letter","spec_url":"https://drafts.csswg.org/css-inline/#sizing-drop-initials","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"impl_url":"https://bugzil.la/1223880","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1223880","added":false}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":9}],"safari_ios":[{"prefix":"-webkit-","added":9}]},"tags":["web-features:initial-letter"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-initial-letter-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":110}],"chrome_android":[{"added":110}],"edge":[{"added":110}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:initial-letter"]}},"_aliasOf":"initial-letter"},"inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inline-size","spec_url":["https://drafts.csswg.org/css-logical/#dimension-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57},{"alternative_name":"-webkit-logical-width","added":8}],"chrome_android":[{"added":57},{"alternative_name":"-webkit-logical-width","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-logical-width","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-logical-width","added":5.1}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-logical-width","added":5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset","https://drafts.csswg.org/css-position/#propdef-inset"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}}},"inset-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block","https://drafts.csswg.org/css-position/#propdef-inset-block"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block"},"inset-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-end","https://drafts.csswg.org/css-position/#propdef-inset-block-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-end"},"inset-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-block-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-block-start","https://drafts.csswg.org/css-position/#propdef-inset-block-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-block-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-block-start"},"inset-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline","https://drafts.csswg.org/css-position/#propdef-inset-inline"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline"},"inset-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-end","https://drafts.csswg.org/css-position/#propdef-inset-inline-end"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-end","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-end"},"inset-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start","spec_url":["https://drafts.csswg.org/css-logical/#propdef-inset-inline-start","https://drafts.csswg.org/css-position/#propdef-inset-inline-start"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"firefox_android":[{"added":63},{"alternative_name":"offset-inline-start","version_last":"62","added":41,"removed":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-3/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"_aliasOf":"inset-inline-start"},"interactivity":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#propdef-interactivity","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}},"inert":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui-4/#valdef-interactivity-inert","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]}}}},"interpolate-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/interpolate-size","spec_url":"https://drafts.csswg.org/css-values-5/#interpolate-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1945962","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1945962","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]},"allow-keywords":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-allow-keywords","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}},"numeric-only":{"__compat":{"spec_url":"https://drafts.csswg.org/css-values-5/#valdef-interpolate-size-numeric-only","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:interpolate-size"]}}},"isolation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/isolation","spec_url":"https://drafts.fxtf.org/compositing/#isolation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:isolation"]}},"justify-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-content","spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52},{"partial_implementation":true,"version_last":"51","added":21,"removed":52}],"chrome_android":[{"added":52},{"partial_implementation":true,"version_last":"51","added":25,"removed":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:flexbox"]},"left_right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"safe_unsafe":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":17.6}],"safari_ios":[{"added":17.6}]},"tags":["web-features:flexbox"]}},"space-evenly":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":60}],"chrome_android":[{"added":60}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"start_end":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":93}],"chrome_android":[{"added":93}],"edge":[{"added":93}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:flexbox"]}},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}}},"grid_context":{"__compat":{"spec_url":["https://drafts.csswg.org/css-align/#align-justify-content","https://drafts.csswg.org/css-flexbox/#justify-content-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":52}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}},"_aliasOf":"justify-content"},"justify-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-items","spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":20}],"firefox_android":[{"added":20}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]}}},"justify-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/justify-self","spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":16}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"partial_implementation":true,"prefix":"-ms-","added":10}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#justify-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}},"-ms-grid_context":{"_aliasOf":"grid_context"}},"left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/left","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"letter-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/letter-spacing","spec_url":["https://drafts.csswg.org/css-text/#letter-spacing-property","https://svgwg.org/svg2-draft/text.html#LetterSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-letter-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:letter-spacing"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"lighting-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/lighting-color","spec_url":"https://drafts.fxtf.org/filter-effects/#LightingColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":5}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg-filters"]}},"line-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-break","spec_url":"https://drafts.csswg.org/css-text/#line-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":58},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":58},{"prefix":"-webkit-","added":18}],"edge":[{"added":14}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":11},{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":1}]},"tags":["web-features:line-break"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":83}],"chrome_android":[{"added":83}],"edge":[{"added":83}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:line-break"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:line-break"]}},"loose":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-loose","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:line-break"]}},"strict":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-line-break-strict","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:line-break"]}},"_aliasOf":"line-break"},"line-clamp":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-clamp","spec_url":"https://drafts.csswg.org/css-overflow-4/#propdef-line-clamp","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":6}],"chrome_android":[{"impl_url":"https://crbug.com/40336192","prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":17}],"firefox":[{"prefix":"-webkit-","added":68}],"firefox_android":[{"prefix":"-webkit-","added":68}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":5}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":4.2}]},"tags":["web-features:line-clamp"]},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:line-clamp"]}},"_aliasOf":"line-clamp"},"line-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height","spec_url":"https://drafts.csswg.org/css-inline/#line-height-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-line-height-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:line-height"]}}},"line-height-step":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/line-height-step","spec_url":"https://drafts.csswg.org/css-rhythm/#line-height-step","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"chrome_android":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":60}],"edge":[{"flags":[{"name":"--enable-blink-features=CSSSnapSize","type":"runtime_flag"}],"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:rhythmic-sizing"]}},"list-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style","spec_url":"https://drafts.csswg.org/css-lists/#list-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}}},"list-style-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-image","spec_url":"https://drafts.csswg.org/css-lists/#image-markers","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-image-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-position","spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"inside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#valdef-list-style-position-inside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"outside":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists/#list-style-position-outside","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}}},"list-style-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/list-style-type","spec_url":["https://drafts.csswg.org/css-lists/#text-markers","https://drafts.csswg.org/css-counter-styles/#extending-css2"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]},"afar":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"amharic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"arabic-indic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-arabic-indic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"arabic-indic"},"armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"asterisks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"bengali":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-bengali","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"bengali"},"binary":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"cambodian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cambodian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"cjk-decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"cjk-earthly-branch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-earthly-branch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-earthly-branch"},"cjk-heavenly-stem":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-cjk-heavenly-stem","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"cjk-heavenly-stem"},"cjk-ideographic":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#cjk-ideographic","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"decimal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"decimal-leading-zero":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#decimal-leading-zero","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"devanagari":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-devanagari","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"devanagari"},"disc":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disc","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"disclosure-closed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-closed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"disclosure-open":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#disclosure-open","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89}],"chrome_android":[{"added":89}],"edge":[{"added":89}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"ethiopic":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-abegede-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame"},"ethiopic-halehame-aa-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-aa-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-am":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]}},"_aliasOf":"ethiopic-halehame-am"},"ethiopic-halehame-am-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-gez":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-om-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-sid-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-so-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-halehame-ti-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-er"},"ethiopic-halehame-ti-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"ethiopic-halehame-ti-et"},"ethiopic-halehame-tig":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"ethiopic-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-ethiopic-numeric","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"ethiopic-numeric"},"footnotes":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":13,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]}}},"georgian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#georgian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"gujarati":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gujarati","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gujarati"},"gurmukhi":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-gurmukhi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"gurmukhi"},"hangul":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul"},"hangul-consonant":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":1}],"firefox_android":[{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"hangul-consonant"},"hebrew":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hebrew","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"hiragana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#hiragana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"japanese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-formal"},"japanese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#japanese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"japanese-informal"},"kannada":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-kannada","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"kannada"},"katakana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"katakana-iroha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#katakana-iroha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"khmer":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-khmer","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"khmer"},"korean-hangul-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hangul-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"korean-hanja-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#korean-hanja-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28}],"firefox_android":[{"added":28}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]}},"lao":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lao","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"lao"},"lower-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-lower-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"lower-greek":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-greek","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"lower-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"lower-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#lower-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"malayalam":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-malayalam","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"malayalam"},"mongolian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-mongolian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"myanmar":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-myanmar","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"myanmar"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"octal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"oriya":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-oriya","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"oriya"},"oromo":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"persian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-persian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"persian"},"sidama":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"simp-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-formal"},"simp-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#simp-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"simp-chinese-informal"},"somali":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"square":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":79}],"chrome_android":[{"added":79}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:list-style"]}},"symbols":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/symbols","spec_url":"https://drafts.csswg.org/css-counter-styles/#symbols-function","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:list-style"]}},"tamil":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tamil","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":91}],"chrome_android":[{"added":91}],"edge":[{"added":91}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"tamil"},"telugu":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-telugu","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"telugu"},"thai":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-thai","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":33},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]},"_aliasOf":"thai"},"tibetan":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-tibetan","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:list-style"]}},"tigre":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-er-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"tigrinya-et-abegede":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"trad-chinese-formal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-formal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-formal"},"trad-chinese-informal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#trad-chinese-informal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":45}],"chrome_android":[{"added":45}],"edge":[{"added":79}],"firefox":[{"added":28},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":28},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:list-style"]},"_aliasOf":"trad-chinese-informal"},"upper-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-armenian":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#valdef-counter-style-name-upper-armenian","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":33}],"firefox_android":[{"added":33}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:list-style"]}},"upper-greek":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":1,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]}}},"upper-hexadecimal":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-latin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-latin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"upper-norwegian":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":91},{"version_last":"44","added":6,"removed":45}],"chrome_android":[{"added":91},{"version_last":"44","added":18,"removed":45}],"edge":[{"added":91}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}}},"upper-roman":{"__compat":{"spec_url":"https://drafts.csswg.org/css-counter-styles-3/#upper-roman","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:list-style"]}},"urdu":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"prefix":"-moz-","added":33}],"firefox_android":[{"prefix":"-moz-","added":33}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]}},"_aliasOf":"urdu"},"-moz-arabic-indic":{"_aliasOf":"arabic-indic"},"-moz-bengali":{"_aliasOf":"bengali"},"-moz-cjk-earthly-branch":{"_aliasOf":"cjk-earthly-branch"},"-moz-cjk-heavenly-stem":{"_aliasOf":"cjk-heavenly-stem"},"-moz-devanagari":{"_aliasOf":"devanagari"},"-moz-ethiopic-halehame":{"_aliasOf":"ethiopic-halehame"},"-moz-ethiopic-halehame-am":{"_aliasOf":"ethiopic-halehame-am"},"-moz-ethiopic-halehame-ti-er":{"_aliasOf":"ethiopic-halehame-ti-er"},"-moz-ethiopic-halehame-ti-et":{"_aliasOf":"ethiopic-halehame-ti-et"},"-moz-ethiopic-numeric":{"_aliasOf":"ethiopic-numeric"},"-moz-gujarati":{"_aliasOf":"gujarati"},"-moz-gurmukhi":{"_aliasOf":"gurmukhi"},"-moz-hangul":{"_aliasOf":"hangul"},"-moz-hangul-consonant":{"_aliasOf":"hangul-consonant"},"-moz-japanese-formal":{"_aliasOf":"japanese-formal"},"-moz-japanese-informal":{"_aliasOf":"japanese-informal"},"-moz-kannada":{"_aliasOf":"kannada"},"-moz-khmer":{"_aliasOf":"khmer"},"-moz-lao":{"_aliasOf":"lao"},"-moz-malayalam":{"_aliasOf":"malayalam"},"-moz-myanmar":{"_aliasOf":"myanmar"},"-moz-oriya":{"_aliasOf":"oriya"},"-moz-persian":{"_aliasOf":"persian"},"-moz-simp-chinese-formal":{"_aliasOf":"simp-chinese-formal"},"-moz-simp-chinese-informal":{"_aliasOf":"simp-chinese-informal"},"-moz-tamil":{"_aliasOf":"tamil"},"-moz-telugu":{"_aliasOf":"telugu"},"-moz-thai":{"_aliasOf":"thai"},"-moz-trad-chinese-formal":{"_aliasOf":"trad-chinese-formal"},"-moz-trad-chinese-informal":{"_aliasOf":"trad-chinese-informal"},"-moz-urdu":{"_aliasOf":"urdu"}},"margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin","spec_url":"https://drafts.csswg.org/css-box/#margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-block-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-bottom","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-end","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-end"},"margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#margin-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-margin-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-margin-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-margin-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-margin-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-margin-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-margin-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-margin-start","added":3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"margin-inline-start"},"margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-left","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-right","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-top","spec_url":"https://drafts.csswg.org/css-box/#margin-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:margin"]}}},"margin-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/margin-trim","spec_url":"https://drafts.csswg.org/css-box-4/#margin-trim","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-margin-trim-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40886857","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40886857","added":false}],"edge":[{"impl_url":"https://crbug.com/40886857","added":false}],"firefox":[{"impl_url":"https://bugzil.la/1506241","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1506241","added":false}],"ie":[{"added":false}],"safari":[{"added":16.4}],"safari_ios":[{"added":16.4}]},"tags":["web-features:margin-trim"]}}},"marker":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerShorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"marker-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-end","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerEndProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"marker-mid":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-mid","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerMidProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"marker-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/marker-start","spec_url":"https://svgwg.org/svg2-draft/painting.html#MarkerStartProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"mask":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1},{"partial_implementation":true,"version_last":"119","added":1,"removed":120}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18},{"partial_implementation":true,"version_last":"119","added":18,"removed":120}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"partial_implementation":true,"version_last":"119","added":79,"removed":120},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":53},{"partial_implementation":true,"version_last":"52","added":2,"removed":53}],"firefox_android":[{"added":53},{"partial_implementation":true,"version_last":"52","added":4,"removed":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1},{"partial_implementation":true,"version_last":"15.3","added":3.1,"removed":15.4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2},{"partial_implementation":true,"version_last":"15.3","added":2,"removed":15.4}]},"tags":["web-features:masks"]},"_aliasOf":"mask"},"mask-border":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border"},"mask-border-outset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-outset","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-outset","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-outset","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-outset","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-outset"},"mask-border-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-repeat","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-repeat","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-repeat","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-repeat","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-repeat"},"mask-border-slice":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-slice","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-slice","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-slice","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-slice","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-slice","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-slice"},"mask-border-source":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-source","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-source","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-source","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-source","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-source","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-source"},"mask-border-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-border-width","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-border-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-mask-box-image-width","added":1}],"chrome_android":[{"alternative_name":"-webkit-mask-box-image-width","added":18}],"edge":[{"alternative_name":"-webkit-mask-box-image-width","added":79}],"firefox":[{"impl_url":"https://bugzil.la/877294","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/877294","added":false}],"ie":[{"added":false}],"safari":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":3.1}],"safari_ios":[{"added":17.2},{"alternative_name":"-webkit-mask-box-image-width","added":2}]},"tags":["web-features:mask-border"]},"_aliasOf":"mask-border-width"},"mask-clip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-clip","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-clip"},"mask-composite":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-composite","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-composite","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53},{"prefix":"-webkit-","added":53}],"firefox_android":[{"added":53},{"prefix":"-webkit-","added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"add":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-add","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"exclude":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-exclude","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"intersect":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-intersect","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"subtract":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-composite-subtract","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-composite"},"mask-image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-image","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-image","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":16,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"multiple_mask_images":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"svg_masks":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":8}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-image"},"mask-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-mode","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}},"match-source":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-mode-match-source","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:masks"]}}},"mask-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-origin","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-origin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"border":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"border"},"content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"content"},"fill-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"padding":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:masks"]},"_aliasOf":"padding"},"stroke-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"view-box":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120}],"chrome_android":[{"added":120}],"edge":[{"added":120}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/137293","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/137293","added":false}]},"tags":["web-features:masks"]}},"_aliasOf":"mask-origin","-webkit-border":{"_aliasOf":"border"},"-webkit-content":{"_aliasOf":"content"},"-webkit-padding":{"_aliasOf":"padding"}},"mask-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-position","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-position"},"mask-repeat":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-repeat","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-repeat","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-repeat"},"mask-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-size","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-size","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":120},{"prefix":"-webkit-","added":4}],"chrome_android":[{"added":120},{"prefix":"-webkit-","added":18}],"edge":[{"added":120},{"prefix":"-webkit-","added":79},{"version_last":"18","added":18,"removed":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":2}]},"tags":["web-features:masks"]},"_aliasOf":"mask-size"},"mask-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mask-type","spec_url":"https://drafts.fxtf.org/css-masking/#the-mask-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]},"alpha":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-alpha","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}},"luminance":{"__compat":{"spec_url":"https://drafts.fxtf.org/css-masking/#valdef-mask-type-luminance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":24}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":35}],"firefox_android":[{"added":35}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:mask-type"]}}},"math-depth":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-depth","spec_url":"https://w3c.github.io/mathml-core/#the-math-script-level-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/202303","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/202303","added":false}]},"tags":["web-features:mathml"]}},"math-shift":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-shift","spec_url":"https://w3c.github.io/mathml-core/#the-math-shift","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"math-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/math-style","spec_url":"https://w3c.github.io/mathml-core/#the-math-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:mathml"]}},"max-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-height","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":18}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"max-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-max-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":10.3}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"_aliasOf":"max-inline-size","-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"max-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"partial_implementation":true,"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-max-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]}},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"min-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-block-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-block-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-block-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94}],"firefox_android":[{"added":94}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-height":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-height","spec_url":["https://drafts.csswg.org/css-sizing/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":28}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":28}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":9}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":9}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"min-inline-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-inline-size","spec_url":["https://drafts.csswg.org/css-logical/#propdef-min-inline-size","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":41}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]},"_aliasOf":"min-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-fill-available":{"_aliasOf":"fit-content"},"-moz-max-content":{"_aliasOf":"max-content"},"-moz-min-content":{"_aliasOf":"min-content"}},"min-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-width","spec_url":["https://drafts.csswg.org/css-sizing/#min-size-properties","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:min-max-width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":34},{"version_last":"21","added":16,"removed":22}],"firefox_android":[{"added":34},{"version_last":"21","added":16,"removed":22}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:min-max-width-height"]}},"fit-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"max-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"min-intrinsic","version_last":"47","added":25,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"intrinsic":{"_aliasOf":"max-content"},"-webkit-min-content":{"_aliasOf":"min-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"}},"mix-blend-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode","spec_url":"https://drafts.fxtf.org/compositing/#mix-blend-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":41}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:mix-blend-mode"]},"plus-darker":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-darker","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:mix-blend-mode"]}},"plus-lighter":{"__compat":{"spec_url":"https://drafts.fxtf.org/compositing/#plus-lighter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":100}],"chrome_android":[{"added":100}],"edge":[{"added":100}],"firefox":[{"added":99}],"firefox_android":[{"added":99}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:mix-blend-mode"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":41}],"chrome_android":[{"added":false}],"edge":[{"added":79}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mix-blend-mode"]}}},"object-fit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-fit","spec_url":"https://drafts.csswg.org/css-images/#the-object-fit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"cover":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-cover","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"fill":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-fill","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"scale-down":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images/#valdef-object-fit-scale-down","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-fit"]}},"_aliasOf":"object-fit"},"object-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/object-position","spec_url":"https://drafts.csswg.org/css-images/#the-object-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":32}],"chrome_android":[{"added":32}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":16,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":10}],"safari_ios":[{"added":10}]},"tags":["web-features:object-position"]},"_aliasOf":"object-position"},"object-view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#propdef-object-view-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-images-5/#valdef-object-view-box-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:object-view-box"]}}},"offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset","spec_url":"https://drafts.fxtf.org/motion/#offset-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion","added":46}],"edge":[{"added":79},{"alternative_name":"motion","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset"},"offset-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-anchor","spec_url":"https://drafts.fxtf.org/motion/#offset-anchor-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-distance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-distance","spec_url":"https://drafts.fxtf.org/motion/#offset-distance-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-distance","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-distance","added":46}],"edge":[{"added":79},{"alternative_name":"motion-distance","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"_aliasOf":"offset-distance"},"offset-path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-path","spec_url":"https://drafts.fxtf.org/motion/#offset-path-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55},{"alternative_name":"motion-path","added":46}],"chrome_android":[{"added":55},{"alternative_name":"motion-path","added":46}],"edge":[{"added":79},{"alternative_name":"motion-path","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:motion-path"]},"basic_shape":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-basic-shape","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"margin-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-margin-box","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-padding-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"path":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"ray":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-ray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"url":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-path-url","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:motion-path"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-box-4/#valdef-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-path"},"offset-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-position","spec_url":"https://drafts.fxtf.org/motion/#offset-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"bottom":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"center":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"left":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"normal":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":17.2}],"safari_ios":[{"added":17.2}]},"tags":["web-features:motion-path"]}},"right":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"top":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-position-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"added":122}],"firefox_android":[{"added":122}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}}},"offset-rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/offset-rotate","spec_url":"https://drafts.fxtf.org/motion/#offset-rotate-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"chrome_android":[{"added":56},{"alternative_name":"offset-rotation","added":55},{"alternative_name":"motion-rotation","added":46}],"edge":[{"added":79},{"alternative_name":"offset-rotation","added":79},{"alternative_name":"motion-rotation","added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]},"auto":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"reverse":{"__compat":{"spec_url":"https://drafts.fxtf.org/motion/#valdef-offset-rotate-reverse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46}],"chrome_android":[{"added":46}],"edge":[{"added":79}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:motion-path"]}},"_aliasOf":"offset-rotate"},"opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/opacity","spec_url":["https://drafts.csswg.org/css-color/#propdef-opacity","https://svgwg.org/svg2-draft/render.html#ObjectAndGroupOpacityProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1},{"prefix":"-moz-","version_last":"3","added":1,"removed":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":9}],"safari":[{"added":2},{"prefix":"-khtml-","version_last":"1.3","added":1.1,"removed":2}],"safari_ios":[{"added":1}]},"tags":["web-features:opacity"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:opacity"]}},"_aliasOf":"opacity"},"order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/order","spec_url":"https://drafts.csswg.org/css-display/#order-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":29},{"prefix":"-webkit-","added":21}],"chrome_android":[{"added":29},{"prefix":"-webkit-","added":25}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":20},{"prefix":"-webkit-","added":49}],"firefox_android":[{"added":20},{"prefix":"-webkit-","added":49}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":7}]},"tags":["web-features:flexbox"]},"_aliasOf":"order"},"orphans":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/orphans","spec_url":"https://drafts.csswg.org/css-break/#widows-orphans","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"outline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline","spec_url":"https://drafts.csswg.org/css-ui/#outline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94},{"partial_implementation":true,"version_last":"93","added":1,"removed":94}],"chrome_android":[{"added":94},{"partial_implementation":true,"version_last":"93","added":18,"removed":94}],"edge":[{"added":94},{"partial_implementation":true,"version_last":"93","added":12,"removed":94}],"firefox":[{"added":88},{"partial_implementation":true,"version_last":"87","added":1.5,"removed":88},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":88},{"partial_implementation":true,"version_last":"87","added":4,"removed":88}],"ie":[{"added":8}],"safari":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1.2,"removed":16.4}],"safari_ios":[{"added":16.4},{"partial_implementation":true,"version_last":"16.3","added":1,"removed":16.4}]},"tags":["web-features:outline"]},"_aliasOf":"outline"},"outline-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-color","spec_url":"https://drafts.csswg.org/css-ui/#outline-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-color"},"outline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-offset","spec_url":"https://drafts.csswg.org/css-ui/#outline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outline-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-style","spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ui/#outline-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dashed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dashed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"dotted":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-dotted","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"double":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-double","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"groove":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-groove","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"inset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-inset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"outset":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-outset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"ridge":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-ridge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"solid":{"__compat":{"spec_url":"https://drafts.csswg.org/css-backgrounds-3/#valdef-line-style-solid","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]}},"_aliasOf":"outline-style"},"outline-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/outline-width","spec_url":"https://drafts.csswg.org/css-ui/#outline-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:outlines"]},"_aliasOf":"outline-width"},"overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow","spec_url":["https://drafts.csswg.org/css-overflow/#propdef-overflow","https://svgwg.org/svg2-draft/render.html#OverflowAndClipProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":114}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":114}],"edge":[{"added":12}],"firefox":[{"added":1},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":12}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":12}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":1.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-clip"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"multiple_keywords":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":68}],"chrome_android":[{"added":68}],"edge":[{"added":79}],"firefox":[{"added":61}],"firefox_android":[{"added":61}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor","spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#exclusion-api","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-anchoring/#valdef-overflow-anchor-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":79}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overflow-anchor"]}}},"overflow-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-block","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-clip-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":90}],"chrome_android":[{"partial_implementation":true,"added":90}],"edge":[{"partial_implementation":true,"added":90}],"firefox":[{"partial_implementation":true,"added":102}],"firefox_android":[{"partial_implementation":true,"added":102}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}},"padding-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#ref-for-typedef-visual-box③","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"impl_url":"https://bugzil.la/1661582","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1661582","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/236153","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/236153","added":false}]},"tags":["web-features:overflow-clip-margin"]}}},"overflow-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-inline","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-control","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]},"overlay":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":135}],"edge":[{"added":135}],"firefox":[{"added":112}],"firefox_android":[{"added":112}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/185977","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/185977","added":false}]},"tags":["web-features:logical-properties"]}}},"overflow-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap","spec_url":"https://drafts.csswg.org/css-text/#overflow-wrap-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":23},{"alternative_name":"word-wrap","added":1}],"chrome_android":[{"added":25},{"alternative_name":"word-wrap","added":18}],"edge":[{"added":18},{"alternative_name":"word-wrap","added":12}],"firefox":[{"added":49},{"alternative_name":"word-wrap","added":3.5}],"firefox_android":[{"added":49},{"alternative_name":"word-wrap","added":4}],"ie":[{"alternative_name":"word-wrap","added":5.5}],"safari":[{"added":7},{"alternative_name":"word-wrap","added":1}],"safari_ios":[{"added":7},{"alternative_name":"word-wrap","added":1}]},"tags":["web-features:overflow-wrap"]},"anywhere":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-anywhere","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":80}],"chrome_android":[{"added":80}],"edge":[{"added":80}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:overflow-wrap"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-break-word","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-overflow-wrap-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-wrap"]}},"_aliasOf":"overflow-wrap"},"overflow-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-x","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-clip"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-x","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overflow-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overflow-y","spec_url":"https://drafts.csswg.org/css-overflow/#overflow-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:overflow-shorthand"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"alternative_name":"overlay","added":15}],"chrome_android":[{"added":18},{"alternative_name":"overlay","added":100}],"edge":[{"added":12}],"firefox":[{"added":3.5},{"alternative_name":"overlay","added":112}],"firefox_android":[{"added":4},{"alternative_name":"overlay","added":112}],"ie":[{"added":11}],"safari":[{"added":3},{"alternative_name":"overlay","added":13.1}],"safari_ios":[{"added":2},{"alternative_name":"overlay","added":13.4}]},"tags":["web-features:overflow-shorthand"]},"_aliasOf":"auto"},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":90}],"chrome_android":[{"added":90}],"edge":[{"added":90}],"firefox":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":3.5,"removed":81}],"firefox_android":[{"added":81},{"alternative_name":"-moz-hidden-unscrollable","version_last":"80","added":4,"removed":81}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overflow-clip"]},"_aliasOf":"clip"},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"scroll":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-scroll","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-overflow-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:overflow-shorthand"]}},"_aliasOf":"overflow-y","overlay":{"_aliasOf":"auto"},"-moz-hidden-unscrollable":{"_aliasOf":"clip"}},"overlay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overlay","spec_url":"https://drafts.csswg.org/css-position-4/#overlay","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position-4/#valdef-overlay-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:overlay"]}}},"overscroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":73}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"overscroll-behavior-y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y","spec_url":"https://drafts.csswg.org/css-overscroll/#overscroll-behavior-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"contain":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-contain","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":18}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overscroll/#valdef-overscroll-behavior-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":63}],"chrome_android":[{"added":63}],"edge":[{"added":79},{"partial_implementation":true,"version_last":"18","added":18,"removed":79}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:overscroll-behavior"]}}},"padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding","spec_url":"https://drafts.csswg.org/css-box/#padding-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-block-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:logical-properties"]}},"padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-bottom","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline","spec_url":"https://drafts.csswg.org/css-logical/#propdef-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":66}],"firefox_android":[{"added":66}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:logical-properties"]}},"padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-end","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-end","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-end","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-end","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-end","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-end","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-end","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-end"},"padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start","spec_url":"https://drafts.csswg.org/css-logical/#padding-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69},{"alternative_name":"-webkit-padding-start","added":2}],"chrome_android":[{"added":69},{"alternative_name":"-webkit-padding-start","added":18}],"edge":[{"added":79},{"alternative_name":"-webkit-padding-start","added":79}],"firefox":[{"added":41},{"alternative_name":"-moz-padding-start","added":3}],"firefox_android":[{"added":41},{"alternative_name":"-moz-padding-start","added":4}],"ie":[{"added":false}],"safari":[{"added":12.1},{"alternative_name":"-webkit-padding-start","added":3}],"safari_ios":[{"added":12.2},{"alternative_name":"-webkit-padding-start","added":3}]},"tags":["web-features:logical-properties"]},"_aliasOf":"padding-inline-start"},"padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-left","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-right","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/padding-top","spec_url":"https://drafts.csswg.org/css-box/#padding-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:padding"]}},"page":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page","spec_url":"https://drafts.csswg.org/css-page/#using-named-pages","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":85}],"chrome_android":[{"added":85}],"edge":[{"added":85}],"firefox":[{"added":110}],"firefox_android":[{"added":110}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:page-selectors"]}},"page-break-after":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-after","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-after","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-before":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-before","spec_url":["https://drafts.csswg.org/css-logical/#page","https://drafts.csswg.org/css-page/#page-break-before","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-always","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"impl_url":"https://bugzil.la/775617","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/775617","added":false}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/34155","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/34155","added":false}]},"tags":["web-features:page-break-aliases"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-left","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-right","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.2}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"page-break-inside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/page-break-inside","spec_url":["https://drafts.csswg.org/css-page/#page-break-inside","https://drafts.csswg.org/css-break/#page-break-properties"],"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-auto","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}},"avoid":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-page-break-avoid","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:page-break-aliases"]}}},"paint-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/paint-order","spec_url":"https://svgwg.org/svg2-draft/painting.html#PaintOrderProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":123},{"partial_implementation":true,"added":35}],"chrome_android":[{"added":123},{"partial_implementation":true,"added":35}],"edge":[{"added":123},{"partial_implementation":true,"added":79}],"firefox":[{"added":60}],"firefox_android":[{"added":60}],"ie":[{"added":false}],"safari":[{"added":11},{"partial_implementation":true,"added":8}],"safari_ios":[{"added":11},{"partial_implementation":true,"added":8}]},"tags":["web-features:paint-order"]}},"perspective":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective"},"perspective-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/perspective-origin","spec_url":"https://drafts.csswg.org/css-transforms-2/#perspective-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-perspective-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":2}]},"tags":["web-features:transforms3d"]}},"_aliasOf":"perspective-origin"},"place-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-content","spec_url":"https://drafts.csswg.org/css-align/#place-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-items":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-items","spec_url":"https://drafts.csswg.org/css-align/#place-items-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}}},"place-self":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/place-self","spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]},"anchor-center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flex_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"grid_context":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":59}],"chrome_android":[{"added":59}],"edge":[{"added":79}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:grid"]}},"position_absolute_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#place-self-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":122}],"chrome_android":[{"added":122}],"edge":[{"added":122}],"firefox":[{"added":134}],"firefox_android":[{"added":134}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:absolute-positioning"]}}},"pointer-events":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/pointer-events","spec_url":["https://drafts.csswg.org/css-ui/#pointer-events-control","https://svgwg.org/svg2-draft/interact.html#PointerEventsProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]},"html_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:pointer-events"]}}},"position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position","spec_url":"https://drafts.csswg.org/css-position/#position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:position"]},"absolute":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-absolute","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:absolute-positioning"]}},"absolutely_positioned_flex_children":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":52}],"chrome_android":[{"added":52}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":10}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:flexbox"]}},"fixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-fixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":7}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:fixed-positioning"]}},"position_sticky_table_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":59}],"firefox_android":[{"added":59}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:sticky-positioning"]}},"relative":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-relative","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:relative-positioning"]}},"static":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-static","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:static-positioning"]}},"sticky":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-position-sticky","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":16}],"firefox":[{"added":32}],"firefox_android":[{"added":32}],"ie":[{"added":false}],"safari":[{"added":13},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":13},{"prefix":"-webkit-","added":7}]},"tags":["web-features:sticky-positioning"]},"_aliasOf":"sticky"},"-webkit-sticky":{"_aliasOf":"sticky"}},"position-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-anchor","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-anchor","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":125}],"chrome_android":[{"partial_implementation":true,"added":125}],"edge":[{"partial_implementation":true,"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-area":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-area","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"chrome_android":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"edge":[{"added":129},{"alternative_name":"inset-area","version_last":"130","added":125,"removed":131}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-center","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-left","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-right","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-block-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-block-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-bottom","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-inline-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-inline-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"span-y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-span-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-top","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"x-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-x-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-end","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-self-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-self-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"y-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-y-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":129}],"chrome_android":[{"added":129}],"edge":[{"added":129}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-area"},"position-try":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-prop","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-try-fallbacks":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-fallbacks","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-fallbacks","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"alternative_name":"position-try-options","version_last":"127","added":125,"removed":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"flip-block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"flip-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-flip-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"position-area":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-fallbacks-position-area","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":128},{"version_last":"127","added":125,"removed":128}],"chrome_android":[{"added":128},{"version_last":"127","added":125,"removed":128}],"edge":[{"added":128},{"version_last":"127","added":125,"removed":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"_aliasOf":"position-try-fallbacks"},"position-try-order":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-try-order","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-try-order-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"most-block-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-block-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-height":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-height","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-inline-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-inline-size","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"most-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-most-width","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-try-order-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"position-visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/position-visibility","spec_url":"https://drafts.csswg.org/css-anchor-position-1/#position-visibility","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-always","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchors-visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-anchors-visible","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"no-overflow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#valdef-position-visibility-no-overflow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}}},"print-color-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/print-color-adjust","spec_url":"https://drafts.csswg.org/css-color-adjust/#propdef-print-color-adjust","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":136},{"prefix":"-webkit-","added":17}],"chrome_android":[{"added":136},{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":97},{"alternative_name":"color-adjust","added":48}],"firefox_android":[{"added":97},{"alternative_name":"color-adjust","added":48}],"ie":[{"added":false}],"safari":[{"added":15.4},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":15.4},{"prefix":"-webkit-","added":6}]},"tags":["web-features:print-color-adjust"]},"economy":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-economy","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"exact":{"__compat":{"spec_url":"https://drafts.csswg.org/css-color-adjust/#valdef-print-color-adjust-exact","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":136}],"chrome_android":[{"added":136}],"edge":[{"added":136}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:print-color-adjust"]}},"_aliasOf":"print-color-adjust"},"quotes":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/quotes","spec_url":"https://drafts.csswg.org/css-content/#quotes","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:quotes"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-content/#valdef-quotes-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":11}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:quotes"]}}},"r":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/r","spec_url":"https://svgwg.org/svg2-draft/geometry.html#R","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"reading-flow":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display-4/#reading-flow","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"chrome_android":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"edge":[{"flags":[{"name":"layout.css.reading-flow.enabled","type":"preference","value_to_set":"true"}],"impl_url":"https://crbug.com/40932006","added":128}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:reading-flow"]}},"resize":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/resize","spec_url":"https://drafts.csswg.org/css-ui/#resize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]},"block":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"block_level_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":5}],"firefox_android":[{"added":5}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}},"inline":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":false}]},"tags":["web-features:resize"]}}},"right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/right","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"rotate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rotate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}},"x_y_z_angle":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"row-gap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/row-gap","spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":16}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:grid"]},"flex_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":63}],"firefox_android":[{"added":63}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:flexbox-gap"]}},"grid_context":{"__compat":{"spec_url":"https://drafts.csswg.org/css-align/#column-row-gap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"chrome_android":[{"added":66},{"alternative_name":"grid-row-gap","added":57}],"edge":[{"added":16},{"alternative_name":"grid-row-gap","added":16}],"firefox":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"firefox_android":[{"added":61},{"alternative_name":"grid-row-gap","added":52}],"ie":[{"added":false}],"safari":[{"added":12},{"alternative_name":"grid-row-gap","added":10.1}],"safari_ios":[{"added":12},{"alternative_name":"grid-row-gap","added":10.3}]},"tags":["web-features:grid"]},"_aliasOf":"grid_context"},"grid-row-gap":{"_aliasOf":"grid_context"}},"ruby-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-align","spec_url":"https://drafts.csswg.org/css-ruby/#ruby-align-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-around":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-around","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"space-between":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-space-between","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":128}],"chrome_android":[{"added":128}],"edge":[{"added":128}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-align"]}}},"ruby-overhang":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#propdef-ruby-overhang","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-ruby/#valdef-ruby-overhang-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-overhang"]}}},"ruby-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ruby-position","spec_url":"https://drafts.csswg.org/css-ruby/#rubypos","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":84},{"prefix":"-webkit-","added":18}],"edge":[{"added":84},{"prefix":"-webkit-","added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":18.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:ruby-position"]},"alternate":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40174517","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40174517","added":false}],"edge":[{"impl_url":"https://crbug.com/40174517","added":false}],"firefox":[{"added":88}],"firefox_android":[{"added":88}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:ruby-position"]}},"inter-character":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":84}],"chrome_android":[{"partial_implementation":true,"added":84}],"edge":[{"partial_implementation":true,"added":84}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":84}],"chrome_android":[{"added":84}],"edge":[{"added":84}],"firefox":[{"added":38}],"firefox_android":[{"added":38}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:ruby-position"]}},"_aliasOf":"ruby-position"},"rx":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/rx","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RX","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"ry":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/ry","spec_url":"https://svgwg.org/svg2-draft/geometry.html#RY","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":43}],"chrome_android":[{"added":43}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:svg"]}},"scale":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scale","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"scroll-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior","spec_url":"https://drafts.csswg.org/css-overflow/#smooth-scrolling","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}},"smooth":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scroll-behavior-smooth","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":61}],"chrome_android":[{"added":61}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:scroll-behavior"]}}},"scroll-initial-target":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#propdef-scroll-initial-target","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]},"nearest":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-nearest","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap-2/#valdef-scroll-initial-target-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-initial-target"]}}},"scroll-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-margin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"firefox_android":[{"added":90},{"partial_implementation":true,"version_last":"89","added":68,"removed":90}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin"},"scroll-margin-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-bottom","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-bottom"},"scroll-margin-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-margin-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"scroll-margin-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-left","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-left"},"scroll-margin-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-right","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-right"},"scroll-margin-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#margin-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}],"safari_ios":[{"added":14.5},{"alternative_name":"scroll-snap-margin-top","partial_implementation":true,"added":11}]},"tags":["web-features:scroll-snap"]},"_aliasOf":"scroll-margin-top"},"scroll-marker-group":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-marker-group","spec_url":"https://drafts.csswg.org/css-overflow-5/#scroll-marker-group-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]},"after":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-after","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]}},"before":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-before","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow-5/#valdef-scroll-marker-group-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":135}],"chrome_android":[{"added":false}],"edge":[{"added":135}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scroll-markers"]}}},"scroll-padding":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-padding","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-block-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-block-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-bottom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-inline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline","spec_url":"https://drafts.csswg.org/css-scroll-snap/#propdef-scroll-padding-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-end":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-inline-start":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-logical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-padding-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-padding-left":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-right":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-padding-top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top","spec_url":"https://drafts.csswg.org/css-scroll-snap/#padding-longhands-physical","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":14.1},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.1}],"safari_ios":[{"added":14.5},{"partial_implementation":true,"version_last":"14","added":11,"removed":14.5}]},"tags":["web-features:scroll-snap"]}},"scroll-snap-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-stop":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-stop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]},"always":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-always","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-stop-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":75}],"chrome_android":[{"added":75}],"edge":[{"added":79}],"firefox":[{"added":103}],"firefox_android":[{"added":103}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:scroll-snap"]}}},"scroll-snap-type":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type","spec_url":"https://drafts.csswg.org/css-scroll-snap/#scroll-snap-type","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":99},{"partial_implementation":true,"version_last":"98","added":68,"removed":99},{"version_last":"67","added":39,"removed":68}],"firefox_android":[{"added":68},{"version_last":"67","added":39,"removed":68}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"added":11},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":9}]},"tags":["web-features:scroll-snap"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-block","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-inline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":39}],"firefox_android":[{"added":39}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-x","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scroll-snap/#valdef-scroll-snap-type-y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":69}],"chrome_android":[{"added":69}],"edge":[{"added":79}],"firefox":[{"added":68}],"firefox_android":[{"added":68}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:scroll-snap"]}},"_aliasOf":"scroll-snap-type"},"scroll-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scroll-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-scroll-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"scroll-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#scroll-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"scrollbar-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-color","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/231590","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/231590","added":false}]},"tags":["web-features:scrollbar-color"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-color-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:scrollbar-color"]}}},"scrollbar-gutter":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter","spec_url":"https://drafts.csswg.org/css-overflow/#scrollbar-gutter-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#valdef-scrollbar-gutter-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":94}],"chrome_android":[{"added":94}],"edge":[{"added":94}],"firefox":[{"added":97}],"firefox_android":[{"added":97}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-gutter"]}}},"scrollbar-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width","spec_url":"https://drafts.csswg.org/css-scrollbars/#scrollbar-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}},"thin":{"__compat":{"spec_url":"https://drafts.csswg.org/css-scrollbars/#valdef-scrollbar-width-thin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:scrollbar-width"]}}},"shape-image-threshold":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold","spec_url":"https://drafts.csswg.org/css-shapes/#shape-image-threshold-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"percentages":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":78}],"chrome_android":[{"added":78}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}}},"shape-margin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-margin","spec_url":"https://drafts.csswg.org/css-shapes/#shape-margin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"_aliasOf":"shape-margin"},"shape-outside":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-outside","spec_url":"https://drafts.csswg.org/css-shapes/#shape-outside-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]},"circle":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#circle()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"gradient":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/gradient","spec_url":"https://drafts.csswg.org/css-images/#gradients","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"image":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/image","spec_url":"https://drafts.csswg.org/css-images/#image-values","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#inset()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-shapes/#valdef-shape-outside-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}},"path":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape/path","spec_url":"https://drafts.csswg.org/css-shapes/#funcdef-basic-shape-path","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:shape-outside"]}},"polygon":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/basic-shape#polygon()","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":37}],"chrome_android":[{"added":37}],"edge":[{"added":79}],"firefox":[{"added":62}],"firefox_android":[{"added":62}],"ie":[{"added":false}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:shape-outside"]}}},"shape-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/shape-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#ShapeRendering","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"speak":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":80}],"chrome_android":[{"partial_implementation":true,"added":80}],"edge":[{"partial_implementation":true,"added":80}],"firefox":[{"impl_url":"https://bugzil.la/1748064","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748064","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:speak"]}},"speak-as":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/speak-as","spec_url":"https://drafts.csswg.org/css-speech-1/#speaking-props-speak-as","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"impl_url":"https://bugzil.la/1748068","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1748068","added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]},"digits":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-digits","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"literal-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-literal-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"no-punctuation":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-no-punctuation","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}},"spell-out":{"__compat":{"spec_url":"https://drafts.csswg.org/css-speech-1/#valdef-speak-as-spell-out","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:speak-as"]}}},"stop-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-color","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopColorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stop-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stop-opacity","spec_url":"https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke","spec_url":"https://svgwg.org/svg2-draft/painting.html#SpecifyingStrokePaint","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke-color":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-color","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":11.1}],"safari_ios":[{"added":11.3}]},"tags":["web-features:svg"]}},"stroke-dasharray":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dasharray","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dasharray","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"none":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-dasharray-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"stroke-dashoffset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-dashoffset","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-dashoffset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke-linecap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linecap","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linecap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"butt":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-butt","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"square":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linecap-square","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"stroke-linejoin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-linejoin","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-linejoin","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]},"bevel":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-bevel","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"miter":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-miter","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"round":{"__compat":{"spec_url":"https://drafts.fxtf.org/fill-stroke-3/#valdef-stroke-linejoin-round","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}}},"stroke-miterlimit":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-miterlimit","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-miterlimit","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"stroke-opacity":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-opacity","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-opacity","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:opacity-svg"]}},"stroke-width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/stroke-width","spec_url":"https://drafts.fxtf.org/fill-stroke-3/#stroke-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":15}],"firefox":[{"added":1.5}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"tab-size":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/tab-size","spec_url":"https://drafts.csswg.org/css-text/#tab-size-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":21}],"chrome_android":[{"added":25}],"edge":[{"added":79}],"firefox":[{"added":91},{"prefix":"-moz-","added":4}],"firefox_android":[{"added":91},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:tab-size"]},"length":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/length","spec_url":"https://drafts.csswg.org/css-values/#lengths","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":53}],"firefox_android":[{"added":53}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:tab-size"]}},"_aliasOf":"tab-size"},"table-layout":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/table-layout","spec_url":"https://drafts.csswg.org/css2/#width-layout","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":14}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":3}]},"tags":["web-features:table"]}},"text-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align","spec_url":["https://drafts.csswg.org/css-logical/#text-align","https://drafts.csswg.org/css-text/#text-align-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"center"},"end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"justify":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-justify","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-align"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"left"},"match-parent":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-match-parent","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"prefix":"-webkit-","added":16}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":79}],"firefox":[{"added":40}],"firefox_android":[{"added":40}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-align"]},"_aliasOf":"match-parent"},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":18},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":1},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":4},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":4},{"prefix":"-webkit-","added":1.3},{"prefix":"-khtml-","added":1}],"safari_ios":[{"added":3.2},{"prefix":"-webkit-","added":1},{"prefix":"-khtml-","added":1}]},"tags":["web-features:text-align"]},"_aliasOf":"right"},"start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:text-align"]}},"-webkit-center":{"_aliasOf":"center"},"-moz-center":{"_aliasOf":"center"},"-khtml-center":{"_aliasOf":"center"},"-webkit-left":{"_aliasOf":"left"},"-moz-left":{"_aliasOf":"left"},"-khtml-left":{"_aliasOf":"left"},"-webkit-match-parent":{"_aliasOf":"match-parent"},"-webkit-right":{"_aliasOf":"right"},"-moz-right":{"_aliasOf":"right"},"-khtml-right":{"_aliasOf":"right"}},"text-align-last":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-align-last","spec_url":"https://drafts.csswg.org/css-text/#text-align-last-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":49},{"prefix":"-moz-","version_last":"52","added":12,"removed":53}],"firefox_android":[{"added":49},{"prefix":"-moz-","version_last":"52","added":14,"removed":53}],"ie":[{"partial_implementation":true,"added":5.5}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-align-last-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":47}],"chrome_android":[{"added":47}],"edge":[{"added":12}],"firefox":[{"added":12}],"firefox_android":[{"added":14}],"ie":[{"added":11}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:text-align-last"]}},"_aliasOf":"text-align-last"},"text-anchor":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-anchor","spec_url":"https://svgwg.org/svg2-draft/text.html#TextAnchorProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":14}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:svg"]}},"text-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#propdef-text-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-alpha":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-alpha","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"ideograph-numeric":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-ideograph-numeric","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"no-autospace":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-no-autospace","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-autospace-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":false}]},"tags":["web-features:text-autospace"]}}},"text-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-shorthand","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-edge":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-edge","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-edge","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-edge-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-box-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-box-trim","spec_url":"https://drafts.csswg.org/css-inline-3/#text-box-trim","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-both":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-both","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-end":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-end","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline-3/#valdef-text-box-trim-trim-start","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":133}],"chrome_android":[{"added":133}],"edge":[{"added":133}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-box"]}}},"text-combine-upright":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-combine-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":9}],"chrome_android":[{"added":48},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":18}],"edge":[{"added":79},{"alternative_name":"-ms-text-combine-horizontal","version_last":"18","added":12,"removed":79}],"firefox":[{"added":48}],"firefox_android":[{"added":48}],"ie":[{"alternative_name":"-ms-text-combine-horizontal","added":11}],"safari":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5.1}],"safari_ios":[{"added":15.4},{"alternative_name":"-webkit-text-combine","partial_implementation":true,"added":5}]},"tags":["web-features:text-combine-upright"]},"_aliasOf":"text-combine-upright"},"text-decoration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration","spec_url":["https://drafts.csswg.org/css-text-decor/#text-decoration-property","https://svgwg.org/svg2-draft/text.html#TextDecorationProperties"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-decoration"]},"includes_color-and-style":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":8}],"safari_ios":[{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"includes_color-and-style"},"includes_thickness":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"-webkit-includes_color-and-style":{"_aliasOf":"includes_color-and-style"}},"text-decoration-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"_aliasOf":"text-decoration-color"},"text-decoration-line":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-line-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"blink":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-blink","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":26}],"firefox_android":[{"added":26}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration-line-blink"]}},"grammar-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-grammar-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"line-through":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-line-through","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"overline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-overline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"spelling-error":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-line-spelling-error","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":121}],"chrome_android":[{"added":121}],"edge":[{"added":121}],"firefox":[{"added":137}],"firefox_android":[{"added":137}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-decoration"]}},"underline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-decoration-line-underline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-line"},"text-decoration-skip":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skipping","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"version_last":"63","added":57,"removed":64}],"chrome_android":[{"version_last":"63","added":57,"removed":64}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-skip"},"text-decoration-skip-ink":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-skip-ink-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"impl_url":"https://crbug.com/40675832","added":false}],"chrome_android":[{"impl_url":"https://crbug.com/40675832","added":false}],"edge":[{"impl_url":"https://crbug.com/40675832","added":false}],"firefox":[{"added":75}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-skip-ink-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":15.4}],"safari_ios":[{"added":15.4}]},"tags":["web-features:text-decoration"]}}},"text-decoration-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-decoration-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"firefox_android":[{"added":36},{"prefix":"-moz-","version_last":"38","added":6,"removed":39}],"ie":[{"added":false}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":8}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":8}]},"tags":["web-features:text-decoration"]},"wavy":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":57}],"chrome_android":[{"added":57}],"edge":[{"added":79}],"firefox":[{"added":6}],"firefox_android":[{"added":6}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-decoration"]}},"_aliasOf":"text-decoration-style"},"text-decoration-thickness":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness","spec_url":"https://drafts.csswg.org/css-text-decor-4/#text-decoration-width-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"chrome_android":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"edge":[{"added":89},{"partial_implementation":true,"version_last":"88","added":87,"removed":89}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"from-font":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-decoration-thickness-from-font","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-decoration"]}},"percentage":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-decoration"]}}},"text-emphasis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis"},"text-emphasis-color":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-color-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"_aliasOf":"text-emphasis-color"},"text-emphasis-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":132}],"firefox_android":[{"added":132}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-emphasis"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"over":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":62}],"chrome_android":[{"added":62}],"edge":[{"added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-emphasis"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":108}],"firefox_android":[{"added":108}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-position"},"text-emphasis-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style","spec_url":"https://drafts.csswg.org/css-text-decor/#text-emphasis-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99},{"prefix":"-webkit-","added":25}],"chrome_android":[{"added":99},{"prefix":"-webkit-","added":25}],"edge":[{"added":99},{"prefix":"-webkit-","added":79}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":7},{"prefix":"-webkit-","added":7}]},"tags":["web-features:text-emphasis"]},"circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"dot":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-dot","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"double-circle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-double-circle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"filled":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-filled","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"sesame":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-sesame","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"triangle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor/#valdef-text-emphasis-style-triangle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":99}],"chrome_android":[{"added":99}],"edge":[{"added":99}],"firefox":[{"added":46}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-emphasis"]}},"_aliasOf":"text-emphasis-style"},"text-indent":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-indent","spec_url":"https://drafts.csswg.org/css-text/#text-indent-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":3}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-indent"]},"each-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-each-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-each-line"]}},"hanging":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-indent-hanging","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":15}],"safari_ios":[{"added":15}]},"tags":["web-features:text-indent-hanging"]}}},"text-justify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-justify","spec_url":"https://drafts.csswg.org/css-text/#text-justify-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"chrome_android":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":32}],"edge":[{"flags":[{"name":"#enable-experimental-web-platform-features","type":"preference","value_to_set":"true"}],"added":79},{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":11}],"safari":[{"impl_url":"https://webkit.org/b/99945","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/99945","added":false}]},"tags":["web-features:text-justify"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"inter-character":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-character","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55},{"alternative_name":"distribute","added":55}],"firefox_android":[{"added":55},{"alternative_name":"distribute","added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]},"_aliasOf":"inter-character"},"inter-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-inter-word","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-text-justify-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-justify"]}},"distribute":{"_aliasOf":"inter-character"}},"text-orientation":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-orientation","spec_url":"https://drafts.csswg.org/css-writing-modes/#text-orientation","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":14},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":14},{"prefix":"-webkit-","added":5}]},"tags":["web-features:text-orientation"]},"mixed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-mixed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"sideways":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-sideways","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12},{"alternative_name":"sideways-right","added":83}],"chrome_android":[{"added":18},{"alternative_name":"sideways-right","added":83}],"edge":[{"added":79},{"alternative_name":"sideways-right","added":83}],"firefox":[{"added":44},{"alternative_name":"sideways-right","added":72}],"firefox_android":[{"added":44},{"alternative_name":"sideways-right","added":79}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:text-orientation"]},"_aliasOf":"sideways"},"upright":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-text-orientation-upright","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:text-orientation"]}},"_aliasOf":"text-orientation","sideways-right":{"_aliasOf":"sideways"}},"text-overflow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-overflow","spec_url":["https://drafts.csswg.org/css-overflow/#text-overflow","https://svgwg.org/svg2-draft/text.html#TextOverflowProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":6},{"prefix":"-ms-","added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]},"clip":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-clip","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"ellipsis":{"__compat":{"spec_url":"https://drafts.csswg.org/css-overflow/#overflow-ellipsis","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":7}],"firefox_android":[{"added":7}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:text-overflow"]}},"string":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:custom-ellipses"]}},"two_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":9}],"firefox_android":[{"added":9}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-overflow"]}},"_aliasOf":"text-overflow"},"text-rendering":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-rendering","spec_url":"https://svgwg.org/svg2-draft/painting.html#TextRenderingProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":4}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":5}],"safari_ios":[{"added":4.2}]},"tags":["web-features:svg"]}},"geometricPrecision":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":13}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":46}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}}},"text-shadow":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-shadow","spec_url":"https://drafts.csswg.org/css-text-decor/#text-shadow-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-shadow"]}},"text-size-adjust":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust","spec_url":"https://drafts.csswg.org/css-size-adjust/#adjustment-control","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79},{"prefix":"-webkit-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"prefix":"-webkit-","added":1}]},"tags":["web-features:text-size-adjust"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"percentages":{"__compat":{"spec_url":"https://drafts.csswg.org/css-size-adjust/#valdef-text-size-adjust-percentage-0","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":54}],"chrome_android":[{"added":54}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-size-adjust"]}},"_aliasOf":"text-size-adjust"},"text-spacing-trim":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-spacing-trim","spec_url":"https://drafts.csswg.org/css-text-4/#text-spacing-trim-property","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-normal","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"space-first":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-space-first","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}},"trim-start":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-spacing-trim-trim-start","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":123}],"chrome_android":[{"added":123}],"edge":[{"added":123}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-spacing-trim"]}}},"text-transform":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-transform","spec_url":"https://drafts.csswg.org/css-text-4/#text-transform","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]},"capitalize":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-capitalize","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"dutch_ij_digraph":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"full-size-kana":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-size-kana","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":64}],"firefox_android":[{"added":64}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"full-width":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-full-width","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":19}],"firefox_android":[{"added":19}],"ie":[{"added":false}],"safari":[{"added":17}],"safari_ios":[{"added":17}]},"tags":["web-features:text-transform"]}},"greek_accented_characters":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":34}],"chrome_android":[{"added":34}],"edge":[{"added":79}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-transform"]}},"lowercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-lowercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"lowercase_sigma":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":30}],"chrome_android":[{"added":30}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:text-transform"]}},"math-auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-math-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":109}],"chrome_android":[{"added":109}],"edge":[{"added":109}],"firefox":[{"added":117}],"firefox_android":[{"added":117}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:mathml"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"turkic_is":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":31}],"chrome_android":[{"added":31}],"edge":[{"added":12}],"firefox":[{"added":14}],"firefox_android":[{"added":14}],"ie":[{"added":4}],"safari":[{"added":8}],"safari_ios":[{"added":8}]},"tags":["web-features:text-transform"]}},"uppercase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-transform-uppercase","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}},"uppercase_eszett":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":18}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:text-transform"]}}},"text-underline-offset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset","spec_url":"https://drafts.csswg.org/css-text-decor-4/#underline-offset","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":70}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-offset"]}},"percentage":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-decor-4/#valdef-text-underline-offset-percentage","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-offset"]}}},"text-underline-position":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-underline-position","spec_url":"https://drafts.csswg.org/css-text-decor/#text-underline-position-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":12}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":6}],"safari":[{"added":12.1},{"prefix":"-webkit-","added":9}],"safari_ios":[{"added":12.2},{"prefix":"-webkit-","added":9}]},"tags":["web-features:text-underline-position"]},"from-font":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":87}],"chrome_android":[{"added":87}],"edge":[{"added":87}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":71}],"chrome_android":[{"added":71}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:text-underline-position"]}},"under":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":33}],"chrome_android":[{"added":33}],"edge":[{"added":79}],"firefox":[{"added":74}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":12.1}],"safari_ios":[{"added":12.2}]},"tags":["web-features:text-underline-position"]}},"_aliasOf":"text-underline-position"},"text-wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]},"balance":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#balance","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-balance"]}},"nowrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#nowrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-nowrap"]}},"pretty":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#pretty","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-pretty"]}},"stable":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#stable","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":121}],"firefox_android":[{"added":121}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-stable"]}},"wrap":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap#wrap","spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-mode-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap"]}}},"text-wrap-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-mode","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-mode","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]},"nowrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}},"wrap":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:text-wrap-mode"]}}},"text-wrap-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/text-wrap-style","spec_url":"https://drafts.csswg.org/css-text-4/#text-wrap-style","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"balance":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-balance","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}},"pretty":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-pretty","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:text-wrap-style"]}},"stable":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-text-wrap-style-stable","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":130}],"chrome_android":[{"added":130}],"edge":[{"added":130}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.5}],"safari_ios":[{"added":17.5}]},"tags":["web-features:text-wrap-style"]}}},"timeline-scope":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/timeline-scope","spec_url":"https://drafts.csswg.org/scroll-animations/#propdef-timeline-scope","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-all","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-timeline-scope-none","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":116}],"chrome_android":[{"added":116}],"edge":[{"added":116}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"top":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/top","spec_url":"https://drafts.csswg.org/css-position/#insets","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]},"anchor":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-pos","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-position/#valdef-top-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:physical-properties"]}}},"touch-action":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/touch-action","spec_url":["https://compat.spec.whatwg.org/#touch-action","https://w3c.github.io/pointerevents/#the-touch-action-css-property"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"manipulation":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":9.3}]},"tags":["web-features:touch-action"]},"_aliasOf":"manipulation"},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"none"},"pan-down":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-left":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-right":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-up":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":55}],"chrome_android":[{"added":55}],"edge":[{"added":79}],"firefox":[{"impl_url":"https://bugzil.la/1285685","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1285685","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:touch-action"]}},"pan-x":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-x"},"pan-y":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":12}],"firefox":[{"added":52}],"firefox_android":[{"added":52}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pan-y"},"pinch-zoom":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":56}],"chrome_android":[{"added":56}],"edge":[{"added":12}],"firefox":[{"added":85}],"firefox_android":[{"added":85}],"ie":[{"added":11},{"prefix":"-ms-","added":10}],"safari":[{"added":13}],"safari_ios":[{"added":13}]},"tags":["web-features:touch-action"]},"_aliasOf":"pinch-zoom"},"_aliasOf":"touch-action","-ms-manipulation":{"_aliasOf":"manipulation"},"-ms-none":{"_aliasOf":"none"},"-ms-pan-x":{"_aliasOf":"pan-x"},"-ms-pan-y":{"_aliasOf":"pan-y"},"-ms-pinch-zoom":{"_aliasOf":"pinch-zoom"}},"transform":{"3d":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms3d"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform","spec_url":["https://drafts.csswg.org/css-transforms-2/#transform-functions","https://drafts.csswg.org/css-transforms/#transform-property","https://svgwg.org/svg2-draft/coords.html#TransformProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-webkit-","added":11},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":3.2}]},"tags":["web-features:transforms2d"]},"_aliasOf":"transform"},"transform-box":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-box","spec_url":"https://drafts.csswg.org/css-transforms/#transform-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":11}],"safari_ios":[{"added":11}]},"tags":["web-features:transform-box"]},"border-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-border-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"content-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-content-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"fill-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-fill-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"stroke-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-stroke-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":118}],"chrome_android":[{"added":118}],"edge":[{"added":118}],"firefox":[{"added":125}],"firefox_android":[{"added":125}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}},"view-box":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-box-view-box","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":64}],"chrome_android":[{"added":64}],"edge":[{"added":79}],"firefox":[{"added":55}],"firefox_android":[{"added":55}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:transform-box"]}}},"transform-origin":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-origin","spec_url":"https://drafts.csswg.org/css-transforms/#transform-origin-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":3.5}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"added":10},{"prefix":"-ms-","added":9}],"safari":[{"added":9},{"prefix":"-webkit-","added":2}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":1}]},"tags":["web-features:transforms2d"]},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"center":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-center","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"left":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-left","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"right":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-right","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":19}],"chrome_android":[{"added":25}],"edge":[{"added":17}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":6}],"safari_ios":[{"added":6}]},"tags":["web-features:svg"]}},"three_value_syntax":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":12}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":10}],"firefox_android":[{"added":10}],"ie":[{"added":9}],"safari":[{"added":5}],"safari_ios":[{"added":3.2}]},"tags":["web-features:transforms2d"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms/#valdef-transform-origin-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":2}],"safari_ios":[{"added":1}]},"tags":["web-features:transforms2d"]}},"_aliasOf":"transform-origin"},"transform-style":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transform-style","spec_url":"https://drafts.csswg.org/css-transforms-2/#transform-style-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36},{"prefix":"-webkit-","added":12}],"chrome_android":[{"added":36},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":10}],"ie":[{"added":false}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transforms3d"]},"_aliasOf":"transform-style"},"transition":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition","spec_url":"https://drafts.csswg.org/css-transitions/#transition-shorthand-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"preview","added":4,"removed":null}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4,"removed":false}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"gradients_can_animate":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":10}],"safari":[{"added":null}],"safari_ios":[{"added":false}]},"tags":["web-features:transitions"]}},"transition-behavior":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"_aliasOf":"transition"},"transition-behavior":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-behavior","spec_url":"https://drafts.csswg.org/css-transitions-2/#transition-behavior-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":117}],"chrome_android":[{"added":117}],"edge":[{"added":117}],"firefox":[{"added":129}],"firefox_android":[{"added":129}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:transition-behavior"]}},"transition-delay":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-delay","spec_url":"https://drafts.csswg.org/css-transitions/#transition-delay-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":4}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-delay"},"transition-duration":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-duration","spec_url":"https://drafts.csswg.org/css-transitions/#transition-duration-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"_aliasOf":"transition-duration"},"transition-property":{"IDENT_value":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":10}],"safari":[{"added":4}],"safari_ios":[{"added":3}]},"tags":["web-features:transitions"]}},"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-property","spec_url":"https://drafts.csswg.org/css-transitions/#transition-property-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#valdef-transition-property-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transitions/#propdef-transition-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":4}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":3.1}],"safari_ios":[{"added":2}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-property"},"transition-timing-function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function","spec_url":"https://drafts.csswg.org/css-transitions/#transition-timing-function-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":26},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"firefox_android":[{"added":16},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","version_last":"125","added":4,"removed":126}],"ie":[{"added":10},{"prefix":"-ms-","added":10}],"safari":[{"added":9},{"prefix":"-webkit-","added":3.1}],"safari_ios":[{"added":9},{"prefix":"-webkit-","added":2}]},"tags":["web-features:transitions"]},"jump":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":77}],"chrome_android":[{"added":77}],"edge":[{"added":79}],"firefox":[{"added":65}],"firefox_android":[{"added":65}],"ie":[{"added":false}],"safari":[{"added":14}],"safari_ios":[{"added":14}]},"tags":["web-features:transitions"]}},"_aliasOf":"transition-timing-function"},"translate":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/translate","spec_url":"https://drafts.csswg.org/css-transforms-2/#individual-transforms","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-transforms-2/#valdef-translate-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":104}],"chrome_android":[{"added":104}],"edge":[{"added":104}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":14.1}],"safari_ios":[{"added":14.5}]},"tags":["web-features:individual-transforms"]}}},"unicode-bidi":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi","spec_url":"https://drafts.csswg.org/css-writing-modes/#unicode-bidi","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]},"bidi-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-bidi-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"embed":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-embed","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"isolate":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":16}],"chrome_android":[{"added":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate"},"isolate-override":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-isolate-override","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":17,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"isolate-override"},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":2}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:layout-direction-override"]}},"plaintext":{"__compat":{"spec_url":"https://drafts.csswg.org/css-writing-modes/#valdef-unicode-bidi-plaintext","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":79}],"firefox":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"firefox_android":[{"added":50},{"prefix":"-moz-","version_last":"53","added":10,"removed":54}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":6}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":6}]},"tags":["web-features:layout-direction-override"]},"_aliasOf":"plaintext"},"-webkit-isolate":{"_aliasOf":"isolate"},"-moz-isolate":{"_aliasOf":"isolate"},"-moz-isolate-override":{"_aliasOf":"isolate-override"},"-webkit-isolate-override":{"_aliasOf":"isolate-override"},"-moz-plaintext":{"_aliasOf":"plaintext"},"-webkit-plaintext":{"_aliasOf":"plaintext"}},"user-modify":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-modify","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"prefix":"-webkit-","added":1}],"chrome_android":[{"prefix":"-webkit-","added":18}],"edge":[{"prefix":"-webkit-","added":12}],"firefox":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":1,"removed":132}],"firefox_android":[{"partial_implementation":true,"prefix":"-moz-","version_last":"131","added":4,"removed":132}],"ie":[{"added":false}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":5}]}},"read-write-plaintext-only":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":3}],"safari_ios":[{"added":5}]}}},"_aliasOf":"user-modify"},"user-select":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/user-select","spec_url":"https://drafts.csswg.org/css-ui/#content-selection","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":54},{"prefix":"-webkit-","added":1}],"chrome_android":[{"added":54},{"prefix":"-webkit-","added":18}],"edge":[{"added":79},{"prefix":"-webkit-","added":12},{"prefix":"-ms-","version_last":"18","added":12,"removed":79}],"firefox":[{"added":69},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":1}],"firefox_android":[{"added":79},{"prefix":"-webkit-","added":49},{"prefix":"-moz-","added":4}],"ie":[{"prefix":"-ms-","added":10}],"safari":[{"prefix":"-webkit-","added":3},{"prefix":"-khtml-","version_last":"2","added":2,"removed":3}],"safari_ios":[{"prefix":"-webkit-","added":3}]},"tags":["web-features:user-select"]},"all":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":53}],"chrome_android":[{"added":53}],"edge":[{"added":79}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":false}],"safari":[{"added":16}],"safari_ios":[{"added":16}]},"tags":["web-features:user-select"]}},"auto":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"none":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":21},{"prefix":"-moz-","version_last":"64","added":1,"removed":65}],"firefox_android":[{"added":21},{"prefix":"-moz-","version_last":"64","added":4,"removed":65}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]},"_aliasOf":"none"},"text":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":2}],"safari_ios":[{"added":3}]},"tags":["web-features:user-select"]}},"_aliasOf":"user-select","-moz-none":{"_aliasOf":"none"}},"vector-effect":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vector-effect","spec_url":"https://svgwg.org/svg2-draft/coords.html#VectorEffectProperty","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":6}],"chrome_android":[{"added":18}],"edge":[{"added":79}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":false}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}},"vertical-align":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/vertical-align","spec_url":"https://drafts.csswg.org/css-inline/#propdef-vertical-align","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]},"baseline":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-baseline","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"middle":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-middle","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"sub":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-sub","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"super":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-super","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-bottom":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-bottom","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"text-top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-alignment-baseline-text-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}},"top":{"__compat":{"spec_url":"https://drafts.csswg.org/css-inline/#valdef-baseline-shift-top","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:vertical-align"]}}},"view-timeline":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-shorthand","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-timeline-axis":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-axis","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-axis","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":114}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"block":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-block","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"inline":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-inline","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"x":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-x","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"y":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-scroll-y","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-inset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-inset","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-inset","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/scroll-animations/#valdef-view-timeline-inset-auto","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"impl_url":"https://bugzil.la/1676779","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1676779","added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}}},"view-timeline-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-timeline-name","spec_url":"https://drafts.csswg.org/scroll-animations/#view-timeline-name","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":115}],"chrome_android":[{"added":115}],"edge":[{"added":115}],"firefox":[{"flags":[{"name":"layout.css.scroll-driven-animations.enabled","type":"preference","value_to_set":"true"}],"added":111}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"impl_url":"https://webkit.org/b/222295","added":false}],"safari_ios":[{"impl_url":"https://webkit.org/b/222295","added":false}]},"tags":["web-features:scroll-driven-animations"]}},"view-transition-class":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#view-transition-class-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1860854","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1860854","added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions-2/#valdef-view-transition-class-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18.2}],"safari_ios":[{"added":18.2}]},"tags":["web-features:view-transition-class"]}}},"view-transition-name":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/view-transition-name","spec_url":"https://drafts.csswg.org/css-view-transitions/#view-transition-name-prop","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"impl_url":"https://bugzil.la/1823896","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1823896","added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]},"none":{"__compat":{"spec_url":"https://drafts.csswg.org/css-view-transitions/#valdef-view-transition-name-none","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":111}],"chrome_android":[{"added":111}],"edge":[{"added":111}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":18}],"safari_ios":[{"added":18}]},"tags":["web-features:view-transitions"]}}},"visibility":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/visibility","spec_url":["https://drafts.csswg.org/css-display/#visibility","https://svgwg.org/svg2-draft/render.html#VisibilityControl"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":10}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"hidden":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-hidden","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}},"visible":{"__compat":{"spec_url":"https://drafts.csswg.org/css-display/#valdef-visibility-visible","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:visibility"]}}},"white-space":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space","spec_url":["https://drafts.csswg.org/css-text-4/#white-space-property","https://svgwg.org/svg2-draft/text.html#TextWhiteSpace"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":76}],"chrome_android":[{"added":76}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":13.1}],"safari_ios":[{"added":13.4}]},"tags":["web-features:white-space"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"nowrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-nowrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-line":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-line","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3.5}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"pre-wrap":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-white-space-pre-wrap","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3},{"prefix":"-moz-","version_last":"3.5","added":1,"removed":3.6}],"firefox_android":[{"added":4}],"ie":[{"added":8}],"safari":[{"added":3}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]},"_aliasOf":"pre-wrap"},"shorthand_values":{"__compat":{"status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"partial_implementation":true,"added":114}],"chrome_android":[{"partial_implementation":true,"added":114}],"edge":[{"partial_implementation":true,"added":114}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"version_last":"18","added":12,"removed":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":10}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space"]}},"textarea_support":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":5.5}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:white-space"]}},"-moz-pre-wrap":{"_aliasOf":"pre-wrap"}},"white-space-collapse":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/white-space-collapse","spec_url":"https://drafts.csswg.org/css-text-4/#white-space-collapsing","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]},"break-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-break-spaces","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"collapse":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-collapse","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-breaks":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-breaks","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":114}],"chrome_android":[{"added":114}],"edge":[{"added":114}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":17.4}],"safari_ios":[{"added":17.4}]},"tags":["web-features:white-space-collapse"]}},"preserve-spaces":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-white-space-collapse-preserve-spaces","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":124}],"firefox_android":[{"added":124}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:white-space-collapse"]}}},"widows":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/widows","spec_url":["https://drafts.csswg.org/css-break/#widows-orphans","https://drafts.csswg.org/css-multicol/#filling-columns"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":25}],"chrome_android":[{"added":25}],"edge":[{"added":12}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":8}],"safari":[{"added":1.3}],"safari_ios":[{"added":1}]},"tags":["web-features:widows-orphans"]}},"width":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/width","spec_url":["https://drafts.csswg.org/css-sizing-4/#width-height-keywords","https://drafts.csswg.org/css-sizing-4/#sizing-values"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]},"anchor-size":{"__compat":{"spec_url":"https://drafts.csswg.org/css-anchor-position-1/#anchor-size-fn","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":125}],"chrome_android":[{"added":125}],"edge":[{"added":125}],"firefox":[{"impl_url":"https://bugzil.la/1838746","added":false}],"firefox_android":[{"impl_url":"https://bugzil.la/1838746","added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:anchor-positioning"]}},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-3/#preferred-size-properties","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":11}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:width-height"]}},"fit-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content","spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-fit-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22},{"alternative_name":"intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25},{"alternative_name":"intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":94},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":94},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"prefix":"-webkit-","added":7},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:fit-content"]},"_aliasOf":"fit-content"},"fit-content_function":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/fit-content_function","spec_url":"https://drafts.csswg.org/css-sizing/#funcdef-width-fit-content","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"flags":[{"name":"layout.css.fit-content-function.enabled","type":"preference"}],"added":91}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:fit-content-function"]}},"is_animatable":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":26}],"chrome_android":[{"added":26}],"edge":[{"added":12}],"firefox":[{"added":16}],"firefox_android":[{"added":16}],"ie":[{"added":11}],"safari":[{"added":7}],"safari_ios":[{"added":7}]},"tags":["web-features:width-height"]}},"max-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/max-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-max-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"prefix":"-webkit-","added":22}],"chrome_android":[{"added":46},{"prefix":"-webkit-","added":25}],"edge":[{"added":79},{"prefix":"-webkit-","added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"max-content"},"min-content":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/min-content","spec_url":"https://drafts.csswg.org/css-sizing-3/#valdef-width-min-content","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":1,"removed":48}],"chrome_android":[{"added":46},{"alternative_name":"min-intrinsic","version_last":"47","added":18,"removed":48}],"edge":[{"added":79}],"firefox":[{"added":66},{"prefix":"-moz-","added":3}],"firefox_android":[{"added":66},{"prefix":"-moz-","added":4}],"ie":[{"added":false}],"safari":[{"added":11},{"alternative_name":"min-intrinsic","added":2}],"safari_ios":[{"added":11},{"alternative_name":"min-intrinsic","added":1}]},"tags":["web-features:min-max-content"]},"_aliasOf":"min-content"},"stretch":{"__compat":{"spec_url":"https://drafts.csswg.org/css-sizing-4/#valdef-width-stretch","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"alternative_name":"-webkit-fill-available","added":22}],"chrome_android":[{"alternative_name":"-webkit-fill-available","added":25}],"edge":[{"alternative_name":"-webkit-fill-available","added":79}],"firefox":[{"alternative_name":"-moz-available","added":3}],"firefox_android":[{"alternative_name":"-moz-available","added":4}],"ie":[{"added":false}],"safari":[{"alternative_name":"-webkit-fill-available","added":7}],"safari_ios":[{"alternative_name":"-webkit-fill-available","added":7}]},"tags":["web-features:stretch"]},"_aliasOf":"stretch"},"-webkit-fit-content":{"_aliasOf":"fit-content"},"intrinsic":{"_aliasOf":"max-content"},"-moz-fit-content":{"_aliasOf":"fit-content"},"-webkit-max-content":{"_aliasOf":"max-content"},"-moz-max-content":{"_aliasOf":"max-content"},"min-intrinsic":{"_aliasOf":"min-content"},"-moz-min-content":{"_aliasOf":"min-content"},"-webkit-fill-available":{"_aliasOf":"stretch"},"-moz-available":{"_aliasOf":"stretch"}},"will-change":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/will-change","spec_url":"https://drafts.csswg.org/css-will-change/#will-change","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"contents":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-contents","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}},"scroll-position":{"__compat":{"spec_url":"https://drafts.csswg.org/css-will-change/#valdef-will-change-scroll-position","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":36}],"chrome_android":[{"added":36}],"edge":[{"added":79}],"firefox":[{"added":36}],"firefox_android":[{"added":36}],"ie":[{"added":false}],"safari":[{"added":9.1}],"safari_ios":[{"added":9.3}]},"tags":["web-features:will-change"]}}},"word-break":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-break","spec_url":"https://drafts.csswg.org/css-text/#word-break-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5},{"prefix":"-ms-","added":8}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]},"auto-phrase":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text-4/#valdef-word-break-auto-phrase","status":{"deprecated":false,"experimental":true,"standard_track":true},"support":{"chrome":[{"added":119}],"chrome_android":[{"added":119}],"edge":[{"added":119}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"added":false}],"safari_ios":[{"added":false}]},"tags":["web-features:word-break-auto-phrase"]}},"break-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"break-word":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-break-word","status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":67}],"firefox_android":[{"added":67}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break-break-word"]}},"keep-all":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-keep-all","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":44}],"chrome_android":[{"added":44}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":5.5}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:word-break"]}},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-break-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":15}],"firefox_android":[{"added":15}],"ie":[{"added":11}],"safari":[{"added":3}],"safari_ios":[{"added":2}]},"tags":["web-features:word-break"]}},"_aliasOf":"word-break"},"word-spacing":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/word-spacing","spec_url":["https://drafts.csswg.org/css-text/#word-spacing-property","https://svgwg.org/svg2-draft/text.html#WordSpacingProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]},"normal":{"__compat":{"spec_url":"https://drafts.csswg.org/css-text/#valdef-word-spacing-normal","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":6}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:word-spacing"]}},"percentages":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"added":false}],"chrome_android":[{"added":false}],"edge":[{"added":false}],"firefox":[{"added":45}],"firefox_android":[{"added":45}],"ie":[{"added":false}],"safari":[{"added":7}],"safari_ios":[{"added":7}]}}},"svg_elements":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":72}],"firefox_android":[{"added":79}],"ie":[{"added":9}],"safari":[{"added":5.1}],"safari_ios":[{"added":5}]},"tags":["web-features:svg"]}}},"writing-mode":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/writing-mode","spec_url":["https://drafts.csswg.org/css-writing-modes/#block-flow","https://svgwg.org/svg2-draft/text.html#WritingModeProperty"],"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48},{"prefix":"-webkit-","added":8}],"chrome_android":[{"added":48},{"prefix":"-webkit-","added":18}],"edge":[{"added":12},{"prefix":"-webkit-","added":12}],"firefox":[{"added":41}],"firefox_android":[{"added":41}],"ie":[{"added":9},{"prefix":"-ms-","added":9}],"safari":[{"added":10.1},{"prefix":"-webkit-","added":5.1}],"safari_ios":[{"added":10.3},{"prefix":"-webkit-","added":5}]},"tags":["web-features:writing-mode"]},"horizontal-tb":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"lr":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"lr-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"rl-tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"sideways-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"sideways-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":132}],"chrome_android":[{"added":132}],"edge":[{"added":132}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":18.4}],"safari_ios":[{"added":18.4}]},"tags":["web-features:writing-mode"]}},"tb":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"tb-rl":{"__compat":{"status":{"deprecated":true,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":9}],"safari":[{"added":10.1}],"safari_ios":[{"added":10.3}]},"tags":["web-features:writing-mode-svg-values"]}},"vertical-lr":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical-rl":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":48}],"chrome_android":[{"added":48}],"edge":[{"added":12}],"firefox":[{"added":43}],"firefox_android":[{"added":43}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:writing-mode"]}},"vertical_oriented_form_controls":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"chrome_android":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"edge":[{"added":124},{"partial_implementation":true,"added":121},{"partial_implementation":true,"added":119}],"firefox":[{"added":120}],"firefox_android":[{"added":120}],"ie":[{"added":false}],"safari":[{"added":17.4},{"partial_implementation":true,"added":16.5}],"safari_ios":[{"added":17.4},{"partial_implementation":true,"added":16.5}]},"tags":["web-features:vertical-form-controls"]}},"_aliasOf":"writing-mode"},"x":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/x","spec_url":"https://svgwg.org/svg2-draft/geometry.html#X","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"y":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/y","spec_url":"https://svgwg.org/svg2-draft/geometry.html#Y","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":42}],"chrome_android":[{"added":42}],"edge":[{"added":79}],"firefox":[{"added":69}],"firefox_android":[{"added":79}],"ie":[{"added":false}],"safari":[{"added":9}],"safari_ios":[{"added":9}]},"tags":["web-features:svg"]}},"z-index":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/z-index","spec_url":"https://drafts.csswg.org/css2/#z-index","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]},"auto":{"__compat":{"spec_url":"https://drafts.csswg.org/css2/#valdef-z-index-auto","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":1}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}},"negative_values":{"__compat":{"status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":3}],"firefox_android":[{"added":4}],"ie":[{"added":4}],"safari":[{"added":1}],"safari_ios":[{"added":1}]},"tags":["web-features:z-index"]}}},"zoom":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom","spec_url":"https://drafts.csswg.org/css-viewport/#zoom-property","status":{"deprecated":false,"experimental":false,"standard_track":true},"support":{"chrome":[{"added":1}],"chrome_android":[{"added":18}],"edge":[{"added":12}],"firefox":[{"added":126}],"firefox_android":[{"added":126}],"ie":[{"added":5.5}],"safari":[{"added":3.1}],"safari_ios":[{"added":3}]},"tags":["web-features:zoom"]},"reset":{"__compat":{"mdn_url":"https://developer.mozilla.org/docs/Web/CSS/zoom#Values","status":{"deprecated":true,"experimental":false,"standard_track":false},"support":{"chrome":[{"version_last":"58","added":1,"removed":59}],"chrome_android":[{"version_last":"58","added":18,"removed":59}],"edge":[{"added":false}],"firefox":[{"added":false}],"firefox_android":[{"added":false}],"ie":[{"added":false}],"safari":[{"version_last":"18.3","added":3.1,"removed":18.4}],"safari_ios":[{"version_last":"18.3","added":3,"removed":18.4}]}}}},"-webkit-align-content":{"_aliasOf":"align-content"},"-webkit-align-items":{"_aliasOf":"align-items"},"-webkit-align-self":{"_aliasOf":"align-self"},"-webkit-alt":{"_aliasOf":"alt"},"-webkit-animation":{"_aliasOf":"animation"},"-moz-animation":{"_aliasOf":"animation"},"-o-animation":{"_aliasOf":"animation"},"-webkit-animation-delay":{"_aliasOf":"animation-delay"},"-moz-animation-delay":{"_aliasOf":"animation-delay"},"-o-animation-delay":{"_aliasOf":"animation-delay"},"-webkit-animation-direction":{"_aliasOf":"animation-direction"},"-moz-animation-direction":{"_aliasOf":"animation-direction"},"-o-animation-direction":{"_aliasOf":"animation-direction"},"-webkit-animation-duration":{"_aliasOf":"animation-duration"},"-moz-animation-duration":{"_aliasOf":"animation-duration"},"-o-animation-duration":{"_aliasOf":"animation-duration"},"-webkit-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-moz-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-o-animation-fill-mode":{"_aliasOf":"animation-fill-mode"},"-webkit-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-moz-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-o-animation-iteration-count":{"_aliasOf":"animation-iteration-count"},"-webkit-animation-name":{"_aliasOf":"animation-name"},"-moz-animation-name":{"_aliasOf":"animation-name"},"-o-animation-name":{"_aliasOf":"animation-name"},"-webkit-animation-play-state":{"_aliasOf":"animation-play-state"},"-moz-animation-play-state":{"_aliasOf":"animation-play-state"},"-o-animation-play-state":{"_aliasOf":"animation-play-state"},"-webkit-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-moz-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-o-animation-timing-function":{"_aliasOf":"animation-timing-function"},"-webkit-appearance":{"_aliasOf":"appearance"},"-moz-appearance":{"_aliasOf":"appearance"},"-webkit-backdrop-filter":{"_aliasOf":"backdrop-filter"},"-webkit-backface-visibility":{"_aliasOf":"backface-visibility"},"-moz-backface-visibility":{"_aliasOf":"backface-visibility"},"-webkit-background-clip":{"_aliasOf":"background-clip"},"-moz-background-clip":{"_aliasOf":"background-clip"},"-webkit-background-origin":{"_aliasOf":"background-origin"},"-moz-background-origin":{"_aliasOf":"background-origin"},"-webkit-background-size":{"_aliasOf":"background-size"},"-moz-background-size":{"_aliasOf":"background-size"},"-o-background-size":{"_aliasOf":"background-size"},"-webkit-border-bottom-left-radius":{"_aliasOf":"border-bottom-left-radius"},"-moz-border-radius-bottomleft":{"_aliasOf":"border-bottom-left-radius"},"-webkit-border-bottom-right-radius":{"_aliasOf":"border-bottom-right-radius"},"-moz-border-radius-bottomright":{"_aliasOf":"border-bottom-right-radius"},"-webkit-border-image":{"_aliasOf":"border-image"},"-moz-border-image":{"_aliasOf":"border-image"},"-o-border-image":{"_aliasOf":"border-image"},"-webkit-border-image-slice":{"_aliasOf":"border-image-slice"},"-moz-border-end-color":{"_aliasOf":"border-inline-end-color"},"-moz-border-end-style":{"_aliasOf":"border-inline-end-style"},"-moz-border-end-width":{"_aliasOf":"border-inline-end-width"},"-moz-border-start-color":{"_aliasOf":"border-inline-start-color"},"-moz-border-start-style":{"_aliasOf":"border-inline-start-style"},"-webkit-border-radius":{"_aliasOf":"border-radius"},"-moz-border-radius":{"_aliasOf":"border-radius"},"-webkit-border-top-left-radius":{"_aliasOf":"border-top-left-radius"},"-moz-border-radius-topleft":{"_aliasOf":"border-top-left-radius"},"-webkit-border-top-right-radius":{"_aliasOf":"border-top-right-radius"},"-moz-border-radius-topright":{"_aliasOf":"border-top-right-radius"},"-webkit-box-align":{"_aliasOf":"box-align"},"-moz-box-align":{"_aliasOf":"box-align"},"-khtml-box-align":{"_aliasOf":"box-align"},"-webkit-box-decoration-break":{"_aliasOf":"box-decoration-break"},"-webkit-box-direction":{"_aliasOf":"box-direction"},"-moz-box-direction":{"_aliasOf":"box-direction"},"-khtml-box-direction":{"_aliasOf":"box-direction"},"-webkit-box-flex":{"_aliasOf":"box-flex"},"-moz-box-flex":{"_aliasOf":"box-flex"},"-khtml-box-flex":{"_aliasOf":"box-flex"},"-webkit-box-flex-group":{"_aliasOf":"box-flex-group"},"-khtml-box-flex-group":{"_aliasOf":"box-flex-group"},"-webkit-box-lines":{"_aliasOf":"box-lines"},"-khtml-box-lines":{"_aliasOf":"box-lines"},"-webkit-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-moz-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-khtml-box-ordinal-group":{"_aliasOf":"box-ordinal-group"},"-webkit-box-orient":{"_aliasOf":"box-orient"},"-moz-box-orient":{"_aliasOf":"box-orient"},"-khtml-box-orient":{"_aliasOf":"box-orient"},"-webkit-box-pack":{"_aliasOf":"box-pack"},"-moz-box-pack":{"_aliasOf":"box-pack"},"-khtml-box-pack":{"_aliasOf":"box-pack"},"-webkit-box-shadow":{"_aliasOf":"box-shadow"},"-moz-box-shadow":{"_aliasOf":"box-shadow"},"-webkit-box-sizing":{"_aliasOf":"box-sizing"},"-moz-box-sizing":{"_aliasOf":"box-sizing"},"-webkit-clip-path":{"_aliasOf":"clip-path"},"-webkit-column-count":{"_aliasOf":"column-count"},"-moz-column-count":{"_aliasOf":"column-count"},"-moz-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-fill":{"_aliasOf":"column-fill"},"-webkit-column-rule":{"_aliasOf":"column-rule"},"-moz-column-rule":{"_aliasOf":"column-rule"},"-webkit-column-rule-color":{"_aliasOf":"column-rule-color"},"-moz-column-rule-color":{"_aliasOf":"column-rule-color"},"-webkit-column-rule-style":{"_aliasOf":"column-rule-style"},"-moz-column-rule-style":{"_aliasOf":"column-rule-style"},"-webkit-column-rule-width":{"_aliasOf":"column-rule-width"},"-moz-column-rule-width":{"_aliasOf":"column-rule-width"},"-webkit-column-span":{"_aliasOf":"column-span"},"-webkit-column-width":{"_aliasOf":"column-width"},"-moz-column-width":{"_aliasOf":"column-width"},"-webkit-columns":{"_aliasOf":"columns"},"-moz-columns":{"_aliasOf":"columns"},"-webkit-filter":{"_aliasOf":"filter"},"-webkit-flex":{"_aliasOf":"flex"},"-ms-flex":{"_aliasOf":"flex"},"-webkit-flex-basis":{"_aliasOf":"flex-basis"},"-webkit-flex-direction":{"_aliasOf":"flex-direction"},"-ms-flex-direction":{"_aliasOf":"flex-direction"},"-webkit-flex-flow":{"_aliasOf":"flex-flow"},"-webkit-flex-grow":{"_aliasOf":"flex-grow"},"-ms-flex-positive":{"_aliasOf":"flex-grow"},"-webkit-flex-shrink":{"_aliasOf":"flex-shrink"},"-webkit-flex-wrap":{"_aliasOf":"flex-wrap"},"-webkit-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-moz-font-feature-settings":{"_aliasOf":"font-feature-settings"},"-webkit-font-kerning":{"_aliasOf":"font-kerning"},"-moz-font-language-override":{"_aliasOf":"font-language-override"},"-webkit-font-smoothing":{"_aliasOf":"font-smooth"},"-moz-osx-font-smoothing":{"_aliasOf":"font-smooth"},"-webkit-font-variant-ligatures":{"_aliasOf":"font-variant-ligatures"},"-ms-high-contrast-adjust":{"_aliasOf":"forced-color-adjust"},"-ms-grid-columns":{"_aliasOf":"grid-template-columns"},"-ms-grid-rows":{"_aliasOf":"grid-template-rows"},"-webkit-hyphenate-character":{"_aliasOf":"hyphenate-character"},"-webkit-hyphens":{"_aliasOf":"hyphens"},"-ms-hyphens":{"_aliasOf":"hyphens"},"-moz-hyphens":{"_aliasOf":"hyphens"},"-ms-ime-mode":{"_aliasOf":"ime-mode"},"-webkit-initial-letter":{"_aliasOf":"initial-letter"},"offset-block":{"_aliasOf":"inset-block"},"offset-block-end":{"_aliasOf":"inset-block-end"},"offset-block-start":{"_aliasOf":"inset-block-start"},"offset-inline":{"_aliasOf":"inset-inline"},"offset-inline-end":{"_aliasOf":"inset-inline-end"},"offset-inline-start":{"_aliasOf":"inset-inline-start"},"-webkit-justify-content":{"_aliasOf":"justify-content"},"-webkit-line-break":{"_aliasOf":"line-break"},"-ms-line-break":{"_aliasOf":"line-break"},"-khtml-line-break":{"_aliasOf":"line-break"},"-webkit-line-clamp":{"_aliasOf":"line-clamp"},"-webkit-margin-end":{"_aliasOf":"margin-inline-end"},"-moz-margin-end":{"_aliasOf":"margin-inline-end"},"-webkit-margin-start":{"_aliasOf":"margin-inline-start"},"-moz-margin-start":{"_aliasOf":"margin-inline-start"},"-webkit-mask":{"_aliasOf":"mask"},"-webkit-mask-box-image-outset":{"_aliasOf":"mask-border-outset"},"-webkit-mask-box-image-repeat":{"_aliasOf":"mask-border-repeat"},"-webkit-mask-box-image-slice":{"_aliasOf":"mask-border-slice"},"-webkit-mask-box-image-source":{"_aliasOf":"mask-border-source"},"-webkit-mask-box-image-width":{"_aliasOf":"mask-border-width"},"-webkit-mask-clip":{"_aliasOf":"mask-clip"},"-webkit-mask-image":{"_aliasOf":"mask-image"},"-webkit-mask-origin":{"_aliasOf":"mask-origin"},"-webkit-mask-position":{"_aliasOf":"mask-position"},"-webkit-mask-repeat":{"_aliasOf":"mask-repeat"},"-webkit-mask-size":{"_aliasOf":"mask-size"},"-webkit-max-inline-size":{"_aliasOf":"max-inline-size"},"-o-object-fit":{"_aliasOf":"object-fit"},"-o-object-position":{"_aliasOf":"object-position"},"motion":{"_aliasOf":"offset"},"motion-distance":{"_aliasOf":"offset-distance"},"motion-path":{"_aliasOf":"offset-path"},"offset-rotation":{"_aliasOf":"offset-rotate"},"motion-rotation":{"_aliasOf":"offset-rotate"},"-moz-opacity":{"_aliasOf":"opacity"},"-khtml-opacity":{"_aliasOf":"opacity"},"-webkit-order":{"_aliasOf":"order"},"-ms-order":{"_aliasOf":"order"},"-moz-outline":{"_aliasOf":"outline"},"-moz-outline-color":{"_aliasOf":"outline-color"},"-moz-outline-style":{"_aliasOf":"outline-style"},"-moz-outline-width":{"_aliasOf":"outline-width"},"word-wrap":{"_aliasOf":"overflow-wrap"},"-ms-overflow-x":{"_aliasOf":"overflow-x"},"-ms-overflow-y":{"_aliasOf":"overflow-y"},"-webkit-padding-end":{"_aliasOf":"padding-inline-end"},"-moz-padding-end":{"_aliasOf":"padding-inline-end"},"-webkit-padding-start":{"_aliasOf":"padding-inline-start"},"-moz-padding-start":{"_aliasOf":"padding-inline-start"},"-webkit-perspective":{"_aliasOf":"perspective"},"-moz-perspective":{"_aliasOf":"perspective"},"-webkit-perspective-origin":{"_aliasOf":"perspective-origin"},"-moz-perspective-origin":{"_aliasOf":"perspective-origin"},"inset-area":{"_aliasOf":"position-area"},"position-try-options":{"_aliasOf":"position-try-fallbacks"},"-webkit-print-color-adjust":{"_aliasOf":"print-color-adjust"},"-webkit-ruby-position":{"_aliasOf":"ruby-position"},"scroll-snap-margin":{"_aliasOf":"scroll-margin"},"scroll-snap-margin-bottom":{"_aliasOf":"scroll-margin-bottom"},"scroll-snap-margin-left":{"_aliasOf":"scroll-margin-left"},"scroll-snap-margin-right":{"_aliasOf":"scroll-margin-right"},"scroll-snap-margin-top":{"_aliasOf":"scroll-margin-top"},"-ms-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-scroll-snap-type":{"_aliasOf":"scroll-snap-type"},"-webkit-shape-margin":{"_aliasOf":"shape-margin"},"-moz-tab-size":{"_aliasOf":"tab-size"},"-o-tab-size":{"_aliasOf":"tab-size"},"-moz-text-align-last":{"_aliasOf":"text-align-last"},"-ms-text-combine-horizontal":{"_aliasOf":"text-combine-upright"},"-moz-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-webkit-text-decoration-color":{"_aliasOf":"text-decoration-color"},"-moz-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-line":{"_aliasOf":"text-decoration-line"},"-webkit-text-decoration-skip":{"_aliasOf":"text-decoration-skip"},"-moz-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-decoration-style":{"_aliasOf":"text-decoration-style"},"-webkit-text-emphasis":{"_aliasOf":"text-emphasis"},"-webkit-text-emphasis-color":{"_aliasOf":"text-emphasis-color"},"-webkit-text-emphasis-position":{"_aliasOf":"text-emphasis-position"},"-webkit-text-emphasis-style":{"_aliasOf":"text-emphasis-style"},"-webkit-text-orientation":{"_aliasOf":"text-orientation"},"-ms-text-overflow":{"_aliasOf":"text-overflow"},"-o-text-overflow":{"_aliasOf":"text-overflow"},"-webkit-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-moz-text-size-adjust":{"_aliasOf":"text-size-adjust"},"-webkit-text-underline-position":{"_aliasOf":"text-underline-position"},"-ms-touch-action":{"_aliasOf":"touch-action"},"-webkit-transform":{"_aliasOf":"transform"},"-moz-transform":{"_aliasOf":"transform"},"-ms-transform":{"_aliasOf":"transform"},"-o-transform":{"_aliasOf":"transform"},"-webkit-transform-origin":{"_aliasOf":"transform-origin"},"-moz-transform-origin":{"_aliasOf":"transform-origin"},"-ms-transform-origin":{"_aliasOf":"transform-origin"},"-o-transform-origin":{"_aliasOf":"transform-origin"},"-webkit-transform-style":{"_aliasOf":"transform-style"},"-moz-transform-style":{"_aliasOf":"transform-style"},"-webkit-transition":{"_aliasOf":"transition"},"-moz-transition":{"_aliasOf":"transition"},"-ms-transition":{"_aliasOf":"transition"},"-o-transition":{"_aliasOf":"transition"},"-webkit-transition-delay":{"_aliasOf":"transition-delay"},"-moz-transition-delay":{"_aliasOf":"transition-delay"},"-ms-transition-delay":{"_aliasOf":"transition-delay"},"-o-transition-delay":{"_aliasOf":"transition-delay"},"-webkit-transition-duration":{"_aliasOf":"transition-duration"},"-moz-transition-duration":{"_aliasOf":"transition-duration"},"-ms-transition-duration":{"_aliasOf":"transition-duration"},"-o-transition-duration":{"_aliasOf":"transition-duration"},"-webkit-transition-property":{"_aliasOf":"transition-property"},"-moz-transition-property":{"_aliasOf":"transition-property"},"-ms-transition-property":{"_aliasOf":"transition-property"},"-o-transition-property":{"_aliasOf":"transition-property"},"-webkit-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-moz-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-ms-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-o-transition-timing-function":{"_aliasOf":"transition-timing-function"},"-webkit-user-modify":{"_aliasOf":"user-modify"},"-moz-user-modify":{"_aliasOf":"user-modify"},"-khtml-user-modify":{"_aliasOf":"user-modify"},"-webkit-user-select":{"_aliasOf":"user-select"},"-ms-user-select":{"_aliasOf":"user-select"},"-moz-user-select":{"_aliasOf":"user-select"},"-khtml-user-select":{"_aliasOf":"user-select"},"-ms-word-break":{"_aliasOf":"word-break"},"-webkit-writing-mode":{"_aliasOf":"writing-mode"},"-ms-writing-mode":{"_aliasOf":"writing-mode"}} \ No newline at end of file diff --git a/docs/config.yml b/docs/config.yml index c9da2ea8608..544c94c4681 100644 --- a/docs/config.yml +++ b/docs/config.yml @@ -97,6 +97,7 @@ categories: redirects: browser/browser: browser + browser/components/newtab/docs/index.html: browser/extensions/newtab/docs/index.html contributing/how_to_contribute_firefox.html: contributing/contribution_quickref.html contributing/artifact_builds.html: contributing/build/artifact_builds.html contributing/linux_build.html: setup/linux_build.html diff --git a/docshell/base/BrowsingContext.h b/docshell/base/BrowsingContext.h index 7ded624c385..5823cf8e1dd 100644 --- a/docshell/base/BrowsingContext.h +++ b/docshell/base/BrowsingContext.h @@ -224,9 +224,6 @@ struct EmbedderColorSchemes { * This is only ever set to true on the top BC, so consumers need to get \ * the value from the top BC! */ \ FIELD(HasSessionHistory, bool) \ - /* Tracks if this context is the only top-level document in the session \ - * history of the context. */ \ - FIELD(IsSingleToplevelInHistory, bool) \ FIELD(UseErrorPages, bool) \ FIELD(PlatformOverride, nsString) \ /* Specifies if this BC has loaded documents besides the initial \ diff --git a/docshell/base/CanonicalBrowsingContext.cpp b/docshell/base/CanonicalBrowsingContext.cpp index a9ff63156be..efcf377f326 100644 --- a/docshell/base/CanonicalBrowsingContext.cpp +++ b/docshell/base/CanonicalBrowsingContext.cpp @@ -1301,7 +1301,6 @@ void CanonicalBrowsingContext::ReplaceActiveSessionHistoryEntry( nsSHistory* shistory = static_cast(GetSessionHistory()); if (shistory) { shistory->NotifyOnHistoryReplaceEntry(); - shistory->UpdateRootBrowsingContextState(); } ResetSHEntryHasUserInteractionCache(); diff --git a/docshell/shistory/nsISHistory.idl b/docshell/shistory/nsISHistory.idl index c579655ddb7..49251d789a6 100644 --- a/docshell/shistory/nsISHistory.idl +++ b/docshell/shistory/nsISHistory.idl @@ -287,8 +287,6 @@ interface nsISHistory: nsISupports [noscript] void AddChildSHEntryHelper(in nsISHEntry aCloneRef, in nsISHEntry aNewEntry, in BrowsingContext aRootBC, in boolean aCloneChildren); - [noscript, notxpcom] boolean isEmptyOrHasEntriesForSingleTopLevelPage(); - /** * Determine if we can navigate back in history from the entry at aIndex * to an entry that has user interaction. diff --git a/docshell/shistory/nsSHistory.cpp b/docshell/shistory/nsSHistory.cpp index 659d3b3eaf5..e051cd66305 100644 --- a/docshell/shistory/nsSHistory.cpp +++ b/docshell/shistory/nsSHistory.cpp @@ -784,17 +784,6 @@ void nsSHistory::HandleEntriesToSwapInDocShell( } } -void nsSHistory::UpdateRootBrowsingContextState(BrowsingContext* aRootBC) { - if (aRootBC && aRootBC->EverAttached()) { - bool sameDocument = IsEmptyOrHasEntriesForSingleTopLevelPage(); - if (sameDocument != aRootBC->GetIsSingleToplevelInHistory()) { - // If the browsing context is discarded then its session history is - // invalid and will go away. - Unused << aRootBC->SetIsSingleToplevelInHistory(sameDocument); - } - } -} - NS_IMETHODIMP nsSHistory::AddToRootSessionHistory(bool aCloneChildren, nsISHEntry* aOSHE, BrowsingContext* aRootBC, @@ -883,7 +872,6 @@ nsSHistory::AddEntry(nsISHEntry* aSHEntry, bool aPersist) { NotifyListeners(mListeners, [](auto l) { l->OnHistoryReplaceEntry(); }); aSHEntry->SetPersist(aPersist); mEntries[mIndex] = aSHEntry; - UpdateRootBrowsingContextState(); return NS_OK; } } @@ -915,8 +903,6 @@ nsSHistory::AddEntry(nsISHEntry* aSHEntry, bool aPersist) { PurgeHistory(Length() - gHistoryMaxSize); } - UpdateRootBrowsingContextState(); - return NS_OK; } @@ -1150,8 +1136,6 @@ nsSHistory::PurgeHistory(int32_t aNumEntries) { rootBC->GetDocShell()->HistoryPurged(aNumEntries); } - UpdateRootBrowsingContextState(rootBC); - return NS_OK; } @@ -1213,8 +1197,6 @@ nsSHistory::ReplaceEntry(int32_t aIndex, nsISHEntry* aReplaceEntry) { aReplaceEntry->SetPersist(true); mEntries[aIndex] = aReplaceEntry; - UpdateRootBrowsingContextState(); - return NS_OK; } @@ -2026,8 +2008,6 @@ void nsSHistory::RemoveEntries(nsTArray& aIDs, int32_t aStartIndex, } --index; } - - UpdateRootBrowsingContextState(); } void nsSHistory::RemoveFrameEntries(nsISHEntry* aEntry) { @@ -2417,25 +2397,6 @@ nsSHistory::CreateEntry(nsISHEntry** aEntry) { return NS_OK; } -NS_IMETHODIMP_(bool) -nsSHistory::IsEmptyOrHasEntriesForSingleTopLevelPage() { - if (mEntries.IsEmpty()) { - return true; - } - - nsISHEntry* entry = mEntries[0]; - size_t length = mEntries.Length(); - for (size_t i = 1; i < length; ++i) { - bool sharesDocument = false; - mEntries[i]->SharesDocumentWith(entry, &sharesDocument); - if (!sharesDocument) { - return false; - } - } - - return true; -} - static void CollectEntries( nsTHashMap& aHashtable, SessionHistoryEntry* aEntry) { diff --git a/docshell/shistory/nsSHistory.h b/docshell/shistory/nsSHistory.h index fac7fb0ad48..b35ed6084d8 100644 --- a/docshell/shistory/nsSHistory.h +++ b/docshell/shistory/nsSHistory.h @@ -189,7 +189,6 @@ class nsSHistory : public mozilla::LinkedListElement, uint64_t newID = aRootBC ? aRootBC->Id() : 0; if (mRootBC != newID) { mRootBC = newID; - UpdateRootBrowsingContextState(aRootBC); } } @@ -200,13 +199,6 @@ class nsSHistory : public mozilla::LinkedListElement, return mRequestedIndex == -1 ? mIndex : mRequestedIndex; } - // Update the root browsing context state when adding, removing or - // replacing entries. - void UpdateRootBrowsingContextState() { - RefPtr rootBC(GetBrowsingContext()); - UpdateRootBrowsingContextState(rootBC); - } - void GetEpoch(uint64_t& aEpoch, mozilla::Maybe& aId) const { aEpoch = mEpoch; @@ -228,9 +220,6 @@ class nsSHistory : public mozilla::LinkedListElement, private: friend class nsSHistoryObserver; - void UpdateRootBrowsingContextState( - mozilla::dom::BrowsingContext* aBrowsingContext); - bool LoadDifferingEntries(nsISHEntry* aPrevEntry, nsISHEntry* aNextEntry, mozilla::dom::BrowsingContext* aParent, long aLoadType, diff --git a/docshell/test/browser/browser.toml b/docshell/test/browser/browser.toml index 87ac76d142d..e58b79927b1 100644 --- a/docshell/test/browser/browser.toml +++ b/docshell/test/browser/browser.toml @@ -151,7 +151,10 @@ https_first_disabled = true ["browser_bug388121-2.js"] ["browser_bug420605.js"] -skip-if = ["verify"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775923 + "verify", +] ["browser_bug422543.js"] https_first_disabled = true diff --git a/dom/animation/Animation.cpp b/dom/animation/Animation.cpp index be6373c86f6..5281d20621d 100644 --- a/dom/animation/Animation.cpp +++ b/dom/animation/Animation.cpp @@ -846,6 +846,17 @@ void Animation::CommitStyles(ErrorResult& aRv) { return; } + // Count how often the endpoint-inclusive behavior makes a difference so we + // can gauge if it is Web-compatible. + auto computedTimingWithEndpointIncluded = + keyframeEffect->GetComputedTiming(nullptr, EndpointBehavior::Inclusive); + auto computedTimingWithEndpointExcluded = + keyframeEffect->GetComputedTiming(nullptr, EndpointBehavior::Exclusive); + if (computedTimingWithEndpointIncluded.mProgress != + computedTimingWithEndpointExcluded.mProgress) { + doc->SetUseCounter(eUseCounter_custom_CommitStylesNonFillingFinalValue); + } + // Calling SetCSSDeclaration will trigger attribute setting code. // Start the update now so that the old rule doesn't get used // between when we mutate the declaration and when we set the new @@ -1382,7 +1393,7 @@ static TimeStamp EnsurePaintIsScheduled(Document& aDoc) { if (!rd->IsInRefresh()) { return {}; } - return rd->MostRecentRefresh(/* aEnsureTimerStarted = */ false); + return rd->MostRecentRefresh(); } // https://drafts.csswg.org/web-animations/#play-an-animation @@ -1697,7 +1708,8 @@ void Animation::UpdateEffect(PostRestyleMode aPostRestyle) { void Animation::FlushUnanimatedStyle() const { if (Document* doc = GetRenderedDocument()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } } diff --git a/dom/animation/CSSAnimation.cpp b/dom/animation/CSSAnimation.cpp index a112eb21154..d8d85c3bd4b 100644 --- a/dom/animation/CSSAnimation.cpp +++ b/dom/animation/CSSAnimation.cpp @@ -367,7 +367,7 @@ void CSSAnimationKeyframeEffect::MaybeFlushUnanimatedStyle() const { if (dom::Document* doc = GetRenderedDocument()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, false /* flush animations */, false)); } } diff --git a/dom/base/ChromeUtils.cpp b/dom/base/ChromeUtils.cpp index 0e73fd32f4c..bd6dd143216 100644 --- a/dom/base/ChromeUtils.cpp +++ b/dom/base/ChromeUtils.cpp @@ -2585,4 +2585,11 @@ void ChromeUtils::AndroidMoveTaskToBack(GlobalObject& aGlobal) { #endif } +already_AddRefed ChromeUtils::CreateCSPFromHeader( + GlobalObject& aGlobal, const nsAString& aHeader, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, ErrorResult& aRv) { + return CSP_CreateFromHeader(aHeader, aSelfURI, aLoadingPrincipal, + aRv); +} + } // namespace mozilla::dom diff --git a/dom/base/ChromeUtils.h b/dom/base/ChromeUtils.h index 7c700415831..bb5a5721ac3 100644 --- a/dom/base/ChromeUtils.h +++ b/dom/base/ChromeUtils.h @@ -331,6 +331,10 @@ class ChromeUtils { static void AndroidMoveTaskToBack(GlobalObject& aGlobal); + static already_AddRefed CreateCSPFromHeader( + GlobalObject& aGlobal, const nsAString& aHeader, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, ErrorResult& aRv); + private: // Number of DevTools session debugging the current process static std::atomic sDevToolsOpenedCount; diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp index ce95a815d14..ea3ebd551af 100644 --- a/dom/base/Document.cpp +++ b/dom/base/Document.cpp @@ -11376,7 +11376,8 @@ already_AddRefed Document::CreateEvent(const nsAString& aEventType, } void Document::FlushPendingNotifications(FlushType aType) { - mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style); + mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style, + aType >= FlushType::Layout); FlushPendingNotifications(flush); } @@ -17308,7 +17309,7 @@ void Document::UpdateLastRememberedSizes() { mElementsObservedForLastRememberedSize.Remove(it); continue; } - const auto element = *it; + auto* element = *it; MOZ_ASSERT(element->GetComposedDoc() == this); nsIFrame* frame = element->GetPrimaryFrame(); MOZ_ASSERT(frame); @@ -18097,7 +18098,7 @@ void Document::DetermineProximityToViewportAndNotifyResizeObservers() { bool initialResetOfScrolledIntoViewFlagsDone = false; const ChangesToFlush ctf( interruptible ? FlushType::InterruptibleLayout : FlushType::Layout, - /* aFlushAnimations = */ false); + /* aFlushAnimations = */ false, /* aUpdateRelevancy = */ false); // 2. While true: while (true) { diff --git a/dom/base/DocumentOrShadowRoot.cpp b/dom/base/DocumentOrShadowRoot.cpp index 5c29728f4b5..324d250517e 100644 --- a/dom/base/DocumentOrShadowRoot.cpp +++ b/dom/base/DocumentOrShadowRoot.cpp @@ -605,7 +605,8 @@ void DocumentOrShadowRoot::GetAnimations( // structure while iterating over the children below. if (Document* doc = AsNode().GetComposedDoc()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } GetAnimationsOptions options; diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index 970a0fe5673..3243dbfd31d 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -4125,7 +4125,8 @@ void Element::GetAnimations(const GetAnimationsOptions& aOptions, // be reflected in the flags passed in DocumentOrShadowRoot::GetAnimations // too. doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Style, false /* flush animations */)); + ChangesToFlush(FlushType::Style, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } GetAnimationsWithoutFlush(aOptions, aAnimations); diff --git a/dom/base/FlushType.h b/dom/base/FlushType.h index c90cbbd16fa..461cf580e26 100644 --- a/dom/base/FlushType.h +++ b/dom/base/FlushType.h @@ -58,11 +58,17 @@ const EnumeratedArray // clang-format on struct ChangesToFlush { - ChangesToFlush(FlushType aFlushType, bool aFlushAnimations) - : mFlushType(aFlushType), mFlushAnimations(aFlushAnimations) {} + ChangesToFlush(FlushType aFlushType, bool aFlushAnimations, + bool aUpdateRelevancy) + : mFlushType(aFlushType), + mFlushAnimations(aFlushAnimations), + mUpdateRelevancy(aUpdateRelevancy) { + MOZ_ASSERT_IF(mUpdateRelevancy, mFlushType >= FlushType::Layout); + } FlushType mFlushType; bool mFlushAnimations; + bool mUpdateRelevancy; }; } // namespace mozilla diff --git a/dom/base/Nyx.cpp b/dom/base/Nyx.cpp index ca840eb6079..b7057536275 100644 --- a/dom/base/Nyx.cpp +++ b/dom/base/Nyx.cpp @@ -48,34 +48,22 @@ void Nyx::Release(const GlobalObject&, uint32_t aIterations) { /* static */ void Nyx::GetRawData(const GlobalObject& aGlobal, JS::MutableHandle aRetval, ErrorResult& aRv) { - const size_t maxMsgSize = 4096; - - FallibleTArray data; - - // Allocate memory for the buffer - if (!data.SetLength(maxMsgSize, fallible)) { - MOZ_FUZZING_NYX_ABORT("ERROR: Failed to initialize buffer!\n"); + uint8_t* buf = nullptr; + uint32_t size = fuzzing::Nyx::instance().get_raw_data(&buf); + if (buf == nullptr) { + MOZ_FUZZING_NYX_PRINT("ERROR: Failed to get pointer to global payload.\n"); } - // Retrieve raw data into the buffer - uint32_t bufsize = - fuzzing::Nyx::instance().get_raw_data(data.Elements(), data.Length()); + auto* cx = aGlobal.Context(); + JS::Rooted arrayBuffer( + cx, JS::NewArrayBufferWithUserOwnedContents(cx, size, buf)); - if (!data.SetLength(bufsize, fallible)) { - MOZ_FUZZING_NYX_ABORT("ERROR: Failed to resize buffer!\n"); - } - - if (bufsize == 0xFFFFFFFF) { - MOZ_FUZZING_NYX_DEBUG("Nyx: Out of data.\n"); - fuzzing::Nyx::instance().release(0); - } - - JS::Rooted buffer( - aGlobal.Context(), ArrayBuffer::Create(aGlobal.Context(), data, aRv)); - if (aRv.Failed()) { + if (!arrayBuffer) { + MOZ_FUZZING_NYX_PRINT("ERROR: Failed to create ArrayBuffer.\n"); return; } - aRetval.set(buffer); + + aRetval.set(arrayBuffer); } } // namespace mozilla::dom diff --git a/dom/base/UseCounters.conf b/dom/base/UseCounters.conf index 0ae0be2dff9..c084eda9f7f 100644 --- a/dom/base/UseCounters.conf +++ b/dom/base/UseCounters.conf @@ -391,6 +391,10 @@ custom DocumentQueryCommandStateOrValueInsertBrOnReturn calls queryCommandState custom DocumentQueryCommandSupportedOrEnabledContentReadOnly calls queryCommandSupported or queryCommandEnabled with contentReadOnly custom DocumentQueryCommandSupportedOrEnabledInsertBrOnReturn calls queryCommandSupported or queryCommandEnabled with insertBrOnReturn +// Web Animations +method Animation.commitStyles +custom CommitStylesNonFillingFinalValue calls commitStyles and its result differs depending on whether the endpoint-inclusive pref is enabled or not + // SVG filters custom feBlend uses the feBlend SVG filter. custom feColorMatrix uses the feColorMatrix SVG filter. diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index eba6b032314..44b5f278a6d 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -1919,33 +1919,6 @@ nsIBidiKeyboard* nsContentUtils::GetBidiKeyboard() { return sBidiKeyboard; } -/** - * This is used to determine whether a character is in one of the classes - * which CSS says should be part of the first-letter. Currently, that is - * all punctuation classes (P*). Note that this is a change from CSS2 - * which excluded Pc and Pd. - * - * https://www.w3.org/TR/css-pseudo-4/#first-letter-pseudo - * "Punctuation (i.e, characters that belong to the Punctuation (P*) Unicode - * general category [UAX44]) [...]" - */ - -// static -bool nsContentUtils::IsFirstLetterPunctuation(uint32_t aChar) { - switch (mozilla::unicode::GetGeneralCategory(aChar)) { - case HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: /* Pc */ - case HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION: /* Pd */ - case HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: /* Pe */ - case HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: /* Pf */ - case HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: /* Pi */ - case HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: /* Po */ - case HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION: /* Ps */ - return true; - default: - return false; - } -} - // static bool nsContentUtils::IsAlphanumeric(uint32_t aChar) { nsUGenCategory cat = mozilla::unicode::GetGenCategory(aChar); diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 96044e9c8c4..e8acff918e3 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -809,11 +809,6 @@ class nsContentUtils { static const nsDependentSubstring TrimWhitespace(const nsAString& aStr, bool aTrimTrailing = true); - /** - * Returns true if aChar is of class Ps, Pi, Po, Pf, or Pe. - */ - static bool IsFirstLetterPunctuation(uint32_t aChar); - /** * Returns true if aChar is of class Lu, Ll, Lt, Lm, Lo, Nd, Nl or No */ diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index ef82ecc59cc..b6e01b586e7 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -418,12 +418,8 @@ nsDOMWindowUtils::GetDocumentMetadata(const nsAString& aName, NS_IMETHODIMP nsDOMWindowUtils::UpdateLayerTree() { + FlushLayoutWithoutThrottledAnimations(); if (RefPtr presShell = GetPresShell()) { - // Don't flush throttled animations since it might fire MozAfterPaint event - // (in WebRender it constantly does), thus the reftest harness can't take - // any snapshot until the throttled animations finished. - presShell->FlushPendingNotifications( - ChangesToFlush(FlushType::Layout, false /* flush animations */)); RefPtr vm = presShell->GetViewManager(); if (nsView* view = vm->GetRootView()) { nsAutoScriptBlocker scriptBlocker; @@ -2172,12 +2168,11 @@ nsDOMWindowUtils::NeedsFlush(int32_t aFlushType, bool* aResult) { NS_IMETHODIMP nsDOMWindowUtils::FlushLayoutWithoutThrottledAnimations() { - nsCOMPtr doc = GetDocument(); - if (doc) { + if (nsCOMPtr doc = GetDocument()) { doc->FlushPendingNotifications( - ChangesToFlush(FlushType::Layout, false /* flush animations */)); + ChangesToFlush(FlushType::Layout, /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ true)); } - return NS_OK; } diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp index e9afd67f18e..cd75485b736 100644 --- a/dom/base/nsGlobalWindowOuter.cpp +++ b/dom/base/nsGlobalWindowOuter.cpp @@ -5920,9 +5920,12 @@ void nsGlobalWindowOuter::CloseOuter(bool aTrustedCaller) { nsresult rv = mDoc->GetURL(url); NS_ENSURE_SUCCESS_VOID(rv); + RefPtr csh = + nsDocShell::Cast(mDocShell)->GetSessionHistory(); + if (!StringBeginsWith(url, u"about:neterror"_ns) && !mBrowsingContext->GetTopLevelCreatedByWebContent() && - !aTrustedCaller && !IsOnlyTopLevelDocumentInSHistory()) { + !aTrustedCaller && csh && csh->Count() > 1) { bool allowClose = mAllowScriptsToClose || Preferences::GetBool("dom.allow_scripts_to_close_windows", true); @@ -5965,23 +5968,6 @@ void nsGlobalWindowOuter::CloseOuter(bool aTrustedCaller) { FinalClose(); } -bool nsGlobalWindowOuter::IsOnlyTopLevelDocumentInSHistory() { - NS_ENSURE_TRUE(mDocShell && mBrowsingContext, false); - // Disabled since IsFrame() is buggy in Fission - // MOZ_ASSERT(mBrowsingContext->IsTop()); - - if (mozilla::SessionHistoryInParent()) { - return mBrowsingContext->GetIsSingleToplevelInHistory(); - } - - RefPtr csh = nsDocShell::Cast(mDocShell)->GetSessionHistory(); - if (csh && csh->LegacySHistory()) { - return csh->LegacySHistory()->IsEmptyOrHasEntriesForSingleTopLevelPage(); - } - - return false; -} - nsresult nsGlobalWindowOuter::Close() { CloseOuter(/* aTrustedCaller = */ true); return NS_OK; diff --git a/dom/base/nsGlobalWindowOuter.h b/dom/base/nsGlobalWindowOuter.h index 7b953f28cab..a846e57a878 100644 --- a/dom/base/nsGlobalWindowOuter.h +++ b/dom/base/nsGlobalWindowOuter.h @@ -965,8 +965,6 @@ class nsGlobalWindowOuter final : public mozilla::dom::EventTarget, void MaybeAllowStorageForOpenedWindow(nsIURI* aURI); - bool IsOnlyTopLevelDocumentInSHistory(); - void MaybeResetWindowName(Document* aNewDocument); public: diff --git a/dom/base/test/browser.toml b/dom/base/test/browser.toml index 1944a54445a..89d4183bbd2 100644 --- a/dom/base/test/browser.toml +++ b/dom/base/test/browser.toml @@ -74,6 +74,7 @@ skip-if = [ "os == 'linux' && os_version == '18.04' && processor == 'x86_64' && opt && socketprocess_networking", # Bug 1775696 "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1775696 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1775696 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775696 "os == 'mac' && os_version == '14.70' && processor == 'x86_64' && debug", # Bug 1929448 ] @@ -109,6 +110,7 @@ skip-if = ["true"] # Fails with Fission, and we're unlikely to spend time to fix skip-if = [ "os == 'win' && opt", # Bug 1505235 "os == 'mac' && os_version == '10.15' && processor == 'x86_64'", # Bug 1661132 (osx), Bug 1866073 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1661132 (osx) "socketprocess_networking", ] support-files = ["browser_multiple_popups.html"] diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml index cfbec41114c..5f16098f42a 100644 --- a/dom/base/use_counter_metrics.yaml +++ b/dom/base/use_counter_metrics.yaml @@ -107,8 +107,8 @@ use.counter: send_in_pings: - use-counters -# Total of 2391 use counter metrics (excludes denominators). -# Total of 355 'page' use counters. +# Total of 2395 use counter metrics (excludes denominators). +# Total of 357 'page' use counters. use.counter.page: svgsvgelement_getelementbyid: type: counter @@ -5295,6 +5295,40 @@ use.counter.page: send_in_pings: - use-counters + animation_commitstyles: + type: counter + description: > + Whether a page called called Animation.commitStyles. + Compare against `use.counter.top_level_content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + + commit_styles_non_filling_final_value: + type: counter + description: > + Whether a page calls commitStyles and its result differs depending on whether the endpoint-inclusive pref is enabled or not. + Compare against `use.counter.top_level_content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + fe_blend: type: counter description: > @@ -6145,7 +6179,7 @@ use.counter.page: send_in_pings: - use-counters -# Total of 355 'document' use counters. +# Total of 357 'document' use counters. use.counter.doc: svgsvgelement_getelementbyid: type: counter @@ -11332,6 +11366,40 @@ use.counter.doc: send_in_pings: - use-counters + animation_commitstyles: + type: counter + description: > + Whether a document called called Animation.commitStyles. + Compare against `use.counter.content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + + commit_styles_non_filling_final_value: + type: counter + description: > + Whether a document calls commitStyles and its result differs depending on whether the endpoint-inclusive pref is enabled or not. + Compare against `use.counter.content_documents_destroyed` + to calculate the rate. + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 + notification_emails: + - dom-core@mozilla.com + - emilio@mozilla.com + expires: never + send_in_pings: + - use-counters + fe_blend: type: counter description: > diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index 6035ea8629c..e810c3e4f31 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -2143,25 +2143,10 @@ UniquePtr CanvasRenderingContext2D::GetImageBuffer( mBufferProvider->ReturnSnapshot(snapshot.forget()); if (ret && ShouldResistFingerprinting(RFPTarget::CanvasRandomization)) { - bool randomize = true; - // Skip randomization if we are doing user characteristics data collection. - // During data collection, we'll 1) set the pref to true 2) be in the main - // thread and 3) be in chrome code (JS Window Actor). - if (StaticPrefs:: - privacy_resistFingerprinting_randomization_canvas_disable_for_chrome()) { - bool isCallerChrome = - NS_IsMainThread() && nsContentUtils::IsCallerChrome(); - if (isCallerChrome) { - randomize = false; - } - } - if (randomize) { - nsRFPService::RandomizePixels( - GetCookieJarSettings(), ret.get(), out_imageSize->width, - out_imageSize->height, - out_imageSize->width * out_imageSize->height * 4, - SurfaceFormat::A8R8G8B8_UINT32); - } + nsRFPService::RandomizePixels( + GetCookieJarSettings(), ret.get(), out_imageSize->width, + out_imageSize->height, out_imageSize->width * out_imageSize->height * 4, + SurfaceFormat::A8R8G8B8_UINT32); } return ret; diff --git a/dom/chrome-webidl/ChromeUtils.webidl b/dom/chrome-webidl/ChromeUtils.webidl index e0d953da57a..1fd0519864c 100644 --- a/dom/chrome-webidl/ChromeUtils.webidl +++ b/dom/chrome-webidl/ChromeUtils.webidl @@ -788,6 +788,9 @@ partial namespace ChromeUtils { // Equivalent to pressing the home button. Exclusively for testing. [ChromeOnly] undefined androidMoveTaskToBack(); + + [Throws] + ContentSecurityPolicy createCSPFromHeader(DOMString header, URI selfURI, Principal loadingPrincipal); }; /* diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp index a37fe4feb95..13deaabfff0 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp @@ -6618,6 +6618,8 @@ void EventStateManager::ContentRemoved(Document* aDocument, entry.GetData()->ContentRemoved(*aContent); } } + + NotifyContentWillBeRemovedForGesture(*aContent); } void EventStateManager::TextControlRootWillBeRemoved( @@ -7505,24 +7507,24 @@ bool EventStateManager::WheelPrefs::IsOverOnePageScrollAllowedY( MIN_MULTIPLIER_VALUE_ALLOWING_OVER_ONE_PAGE_SCROLL; } -void EventStateManager::NotifyDestroyingFrameForGesture(nsIFrame* aFrame) { - MOZ_ASSERT(aFrame); - if (mGestureDownContent != aFrame->GetContent()) { +void EventStateManager::NotifyContentWillBeRemovedForGesture( + nsIContent& aContent) { + if (!mGestureDownContent) { return; } - if (nsIFrame* parent = aFrame->GetParent()) { - nsIFrame* f = nsLayoutUtils::GetNonGeneratedAncestor(parent); - MOZ_ASSERT(f); - - nsIContent* content = f->GetContent(); - mGestureDownContent = content; - mGestureDownFrameOwner = content; - mGestureDownInTextControl = - content && content->IsInNativeAnonymousSubtree() && - TextControlElement::FromNodeOrNull( - content->GetClosestNativeAnonymousSubtreeRootParentOrHost()); + if (!nsContentUtils::ContentIsFlattenedTreeDescendantOf(mGestureDownContent, + &aContent)) { + return; } + + nsIContent* parent = aContent.GetFlattenedTreeParent(); + mGestureDownContent = parent; + mGestureDownFrameOwner = parent; + mGestureDownInTextControl = + parent && parent->IsInNativeAnonymousSubtree() && + TextControlElement::FromNodeOrNull( + parent->GetClosestNativeAnonymousSubtreeRootParentOrHost()); } } // namespace mozilla diff --git a/dom/events/EventStateManager.h b/dom/events/EventStateManager.h index e76047169c8..58ebde74421 100644 --- a/dom/events/EventStateManager.h +++ b/dom/events/EventStateManager.h @@ -530,10 +530,9 @@ class EventStateManager : public nsSupportsWeakReference, public nsIObserver { return mGestureDownContent; } - // If the current frame is for the current gesture down content (being - // dragged), when it's destroyed, we should continue the gesture on its - // parent. - void NotifyDestroyingFrameForGesture(nsIFrame* aFrame); + // Update the tracked gesture content to the parent of its frame when it's + // removed, so that the gesture can be continued. + void NotifyContentWillBeRemovedForGesture(nsIContent& aContent); bool IsTrackingDragGesture() const { return mGestureDownContent != nullptr; } diff --git a/dom/media/gtest/TestMediaDataEncoder.cpp b/dom/media/gtest/TestMediaDataEncoder.cpp index b212b9c1c4d..622e407a426 100644 --- a/dom/media/gtest/TestMediaDataEncoder.cpp +++ b/dom/media/gtest/TestMediaDataEncoder.cpp @@ -688,7 +688,7 @@ TEST_F(MediaDataEncoderTest, AndroidNotSupportedSize) { } #endif -#if defined(XP_LINUX) && !defined(ANDROID) +#if !defined(ANDROID) TEST_F(MediaDataEncoderTest, H264AVCC) { RUN_IF_SUPPORTED(CodecType::H264, [this]() { // Encod frames in avcC format. @@ -703,14 +703,18 @@ TEST_F(MediaDataEncoderTest, H264AVCC) { for (auto frame : output) { EXPECT_FALSE(AnnexB::IsAnnexB(frame)); if (frame->mKeyframe) { - AnnexB::IsAVCC(frame); - AVCCConfig config = AVCCConfig::Parse(frame).unwrap(); - EXPECT_EQ(config.mAVCProfileIndication, - static_cast( - kH264SpecificAVCC.mProfile)); - EXPECT_EQ(config.mAVCLevelIndication, - static_cast( - kH264SpecificAVCC.mLevel)); + // The extradata may be included at the beginning, whenever it changes, + // or with every keyframe to support robust seeking or decoder resets. + if (frame->mExtraData && !frame->mExtraData->IsEmpty()) { + EXPECT_TRUE(AnnexB::IsAVCC(frame)); + AVCCConfig config = AVCCConfig::Parse(frame).unwrap(); + EXPECT_EQ(config.mAVCProfileIndication, + static_cast( + kH264SpecificAVCC.mProfile)); + EXPECT_EQ(config.mAVCLevelIndication, + static_cast( + kH264SpecificAVCC.mLevel)); + } } } WaitForShutdown(e); @@ -813,7 +817,7 @@ TEST_F(MediaDataEncoderTest, VP8Duration) { }); } -#if defined(XP_LINUX) && !defined(ANDROID) +#if !defined(ANDROID) TEST_F(MediaDataEncoderTest, VP8EncodeAfterDrain) { RUN_IF_SUPPORTED(CodecType::VP8, [this]() { RefPtr e = CreateVP8Encoder(); @@ -986,7 +990,7 @@ TEST_F(MediaDataEncoderTest, VP9Duration) { }); } -#if defined(XP_LINUX) && !defined(ANDROID) +#if !defined(ANDROID) TEST_F(MediaDataEncoderTest, VP9EncodeAfterDrain) { RUN_IF_SUPPORTED(CodecType::VP9, [this]() { RefPtr e = CreateVP9Encoder(); diff --git a/dom/media/ipc/MFCDMParent.cpp b/dom/media/ipc/MFCDMParent.cpp index 8a4d3349074..d11481e1554 100644 --- a/dom/media/ipc/MFCDMParent.cpp +++ b/dom/media/ipc/MFCDMParent.cpp @@ -7,6 +7,7 @@ #include #include #include +#include "mozilla/Likely.h" #define INITGUID // Enable DEFINE_PROPERTYKEY() #include // For DEFINE_PROPERTYKEY() definition #include // For InitPropVariantFrom*() @@ -16,6 +17,7 @@ #include "RemoteDecodeUtils.h" // For GetCurrentSandboxingKind() #include "SpecialSystemDirectory.h" // For temp dir #include "WMFUtils.h" +#include "mozilla/DataMutex.h" #include "mozilla/EMEUtils.h" #include "mozilla/ProfilerMarkers.h" #include "mozilla/KeySystemConfig.h" @@ -90,13 +92,13 @@ DEFINE_PROPERTYKEY(EME_CONTENTDECRYPTIONMODULE_ORIGIN_ID, 0x1218a3e2, 0xcfb0, } \ } while (false) -StaticMutex sFactoryMutex; -MOZ_RUNINIT static nsTHashMap> - sFactoryMap; -MOZ_RUNINIT static CopyableTArray sCapabilities; -StaticMutex sCapabilitesMutex; -MOZ_RUNINIT static ComPtr sMediaEngineClassFactory; +MOZ_RUNINIT static StaticDataMutex< + nsTHashMap>> + sFactoryMap("sFactoryMap"); +MOZ_RUNINIT static StaticDataMutex> + sCapabilities("sCapabilities"); +MOZ_RUNINIT static StaticDataMutex> sMediaEngineClassFactory( + "sMediaEngineClassFactory"); // RAIIized PROPVARIANT. See // third_party/libwebrtc/modules/audio_device/win/core_audio_utility_win.h @@ -486,24 +488,32 @@ LPCWSTR MFCDMParent::GetCDMLibraryName(const nsString& aKeySystem) { /* static */ void MFCDMParent::Shutdown() { - StaticMutexAutoLock lock(sCapabilitesMutex); - sFactoryMap.Clear(); - sCapabilities.Clear(); - sMediaEngineClassFactory.Reset(); + { + auto factoryMap = sFactoryMap.Lock(); + factoryMap->Clear(); + } + { + auto capabilities = sCapabilities.Lock(); + capabilities->Clear(); + } + { + auto mediaEngineClassFactory = sMediaEngineClassFactory.Lock(); + mediaEngineClassFactory->Reset(); + } } /* static */ HRESULT MFCDMParent::GetOrCreateFactory( const nsString& aKeySystem, ComPtr& aFactoryOut) { - StaticMutexAutoLock lock(sFactoryMutex); - auto rv = sFactoryMap.MaybeGet(aKeySystem); + auto factoryMap = sFactoryMap.Lock(); + auto rv = factoryMap->MaybeGet(aKeySystem); if (!rv) { MFCDM_PARENT_SLOG("No factory %s, creating...", NS_ConvertUTF16toUTF8(aKeySystem).get()); ComPtr factory; MFCDM_RETURN_IF_FAILED(LoadFactory(aKeySystem, factory)); - sFactoryMap.InsertOrUpdate(aKeySystem, factory); + factoryMap->InsertOrUpdate(aKeySystem, factory); aFactoryOut.Swap(factory); } else { aFactoryOut = *rv; @@ -524,15 +534,29 @@ HRESULT MFCDMParent::LoadFactory( NS_ConvertUTF16toUTF8(aKeySystem).get()); ComPtr cdmFactory; if (loadFromPlatform) { - if (!sMediaEngineClassFactory) { - MFCDM_RETURN_IF_FAILED(CoCreateInstance( - CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, - IID_PPV_ARGS(&sMediaEngineClassFactory))); - } ComPtr clsFactory; - MFCDM_RETURN_IF_FAILED(sMediaEngineClassFactory.As(&clsFactory)); + { + auto mediaEngineClassFactory = sMediaEngineClassFactory.Lock(); + if (!*mediaEngineClassFactory) { + MFCDM_RETURN_IF_FAILED(CoCreateInstance( + CLSID_MFMediaEngineClassFactory, nullptr, CLSCTX_INPROC_SERVER, + IID_PPV_ARGS(&*mediaEngineClassFactory))); + } + MFCDM_RETURN_IF_FAILED((*mediaEngineClassFactory).As(&clsFactory)); + } MFCDM_RETURN_IF_FAILED(clsFactory->CreateContentDecryptionModuleFactory( MapKeySystem(aKeySystem).get(), IID_PPV_ARGS(&cdmFactory))); + if (MOZ_UNLIKELY(!cdmFactory)) { + if (IsBeingProfiledOrLogEnabled()) { + nsPrintfCString msg( + "CreateContentDecryptionModuleFactory succeeded, but still no " + "factory?!"); + MFCDM_PARENT_SLOG("%s", msg.get()); + PROFILER_MARKER_TEXT("MFCDMParent::LoadFactoryFailed", MEDIA_PLAYBACK, + {}, msg); + } + return E_UNEXPECTED; + } aFactoryOut.Swap(cdmFactory); MFCDM_PARENT_SLOG("Created factory for %s from platform!", NS_ConvertUTF16toUTF8(aKeySystem).get()); @@ -645,7 +669,11 @@ static bool FactorySupports(ComPtr& aFactory, if (IsPlayReadyKeySystemAndSupported(aKeySystem) && StaticPrefs::media_eme_playready_istypesupportedex()) { ComPtr spDrmTypeSupport; - MFCDM_RETURN_BOOL_IF_FAILED(sMediaEngineClassFactory.As(&spDrmTypeSupport)); + { + auto mediaEngineClassFactory = sMediaEngineClassFactory.Lock(); + MFCDM_RETURN_BOOL_IF_FAILED( + (*mediaEngineClassFactory).As(&spDrmTypeSupport)); + } BSTR keySystem = aIsHWSecure ? CreateBSTRFromConstChar(kPlayReadyKeySystemHardware) : CreateBSTRFromConstChar(kPlayReadyKeySystemName); @@ -841,8 +869,8 @@ void MFCDMParent::GetCapabilities(const nsString& aKeySystem, RETURN_VOID_IF_FAILED(GetOrCreateFactory(aKeySystem, factory)); } - StaticMutexAutoLock lock(sCapabilitesMutex); - for (auto& capabilities : sCapabilities) { + auto capabilitiesUnlocked = sCapabilities.Lock(); + for (auto& capabilities : *capabilitiesUnlocked) { if (capabilities.keySystem().Equals(aKeySystem) && capabilities.isHardwareDecryption() == isHardwareDecryption) { MFCDM_PARENT_SLOG( @@ -1060,7 +1088,7 @@ void MFCDMParent::GetCapabilities(const nsString& aKeySystem, KeySystemConfig::SessionType::PersistentLicense); // Cache capabilities for reuse. - sCapabilities.AppendElement(aCapabilitiesOut); + capabilitiesUnlocked->AppendElement(aCapabilitiesOut); } mozilla::ipc::IPCResult MFCDMParent::RecvGetCapabilities( diff --git a/dom/media/mediacontrol/tests/browser/browser.toml b/dom/media/mediacontrol/tests/browser/browser.toml index e9893269db1..e333f2c3e1e 100644 --- a/dom/media/mediacontrol/tests/browser/browser.toml +++ b/dom/media/mediacontrol/tests/browser/browser.toml @@ -55,9 +55,13 @@ skip-if = ["os == 'mac' && os_version == '10.15' && processor == 'x86_64' && ver skip-if = [ "os == 'linux' && os_version == '22.04' && processor == 'x86_64'", # Bug 1673527 "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1775892 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1775892 ] ["browser_media_control_seek.js"] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1961556 +] ["browser_media_control_stop_timer.js"] diff --git a/dom/media/platforms/apple/AppleUtils.cpp b/dom/media/platforms/apple/AppleUtils.cpp new file mode 100644 index 00000000000..2e043cd35d0 --- /dev/null +++ b/dom/media/platforms/apple/AppleUtils.cpp @@ -0,0 +1,80 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "apple/AppleUtils.h" + +#include + +namespace mozilla { + +SessionPropertyManager::SessionPropertyManager( + const AutoCFTypeRef& aSession) + : mSession(aSession) { + MOZ_ASSERT(mSession, "Session must be valid"); +} + +SessionPropertyManager::SessionPropertyManager( + const VTCompressionSessionRef& aSession) + : mSession(aSession, AutoTypePolicy::Retain) { + MOZ_ASSERT(mSession, "Session must be valid"); +} + +bool SessionPropertyManager::IsSupported(CFStringRef aKey) { + MOZ_ASSERT(mSession); + if (!mSupportedKeys) { + CFDictionaryRef dict; + if (VTSessionCopySupportedPropertyDictionary(mSession.Ref(), &dict) == + noErr) { + mSupportedKeys.Reset(dict, AutoTypePolicy::NoRetain); + } + } + return mSupportedKeys && CFDictionaryContainsKey(mSupportedKeys.Ref(), aKey); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, int32_t aValue) { + return Set(aKey, aValue, kCFNumberSInt32Type); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, int64_t aValue) { + return Set(aKey, aValue, kCFNumberSInt64Type); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, float aValue) { + return Set(aKey, aValue, kCFNumberFloatType); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, bool aValue) { + MOZ_ASSERT(mSession); + CFBooleanRef value = aValue ? kCFBooleanTrue : kCFBooleanFalse; + return VTSessionSetProperty(mSession.Ref(), aKey, value); +} + +OSStatus SessionPropertyManager::Set(CFStringRef aKey, CFStringRef value) { + MOZ_ASSERT(mSession); + return VTSessionSetProperty(mSession.Ref(), aKey, value); +} + +OSStatus SessionPropertyManager::Copy(CFStringRef aKey, bool& aValue) { + MOZ_ASSERT(mSession); + + AutoCFTypeRef value; + OSStatus rv = VTSessionCopyProperty(mSession.Ref(), aKey, kCFAllocatorDefault, + value.Receive()); + if (rv == noErr) { + aValue = value == kCFBooleanTrue; + } + return rv; +} + +template +OSStatus SessionPropertyManager::Set(CFStringRef aKey, V aValue, + CFNumberType aType) { + MOZ_ASSERT(mSession); + AutoCFTypeRef value( + CFNumberCreate(kCFAllocatorDefault, aType, &aValue), + AutoTypePolicy::NoRetain); + return VTSessionSetProperty(mSession.Ref(), aKey, value.Ref()); +} + +} // namespace mozilla diff --git a/dom/media/platforms/apple/AppleUtils.h b/dom/media/platforms/apple/AppleUtils.h index 1aee7be4cbf..8941c21b506 100644 --- a/dom/media/platforms/apple/AppleUtils.h +++ b/dom/media/platforms/apple/AppleUtils.h @@ -7,9 +7,11 @@ #ifndef mozilla_AppleUtils_h #define mozilla_AppleUtils_h +#include "mozilla/Assertions.h" #include "mozilla/Attributes.h" -#include // For CFRelease() -#include // For CVBufferRelease() +#include // For CFRelease() +#include // For CVBufferRelease() +#include // For VTCompressionSessionRef #if TARGET_OS_IPHONE inline bool OSSupportsSVC() { @@ -95,6 +97,139 @@ class CFRefPtr { T mRef; }; +template +struct AutoTypeRefTraits; + +enum class AutoTypePolicy { Retain, NoRetain }; +template > +class AutoTypeRef { + public: + explicit AutoTypeRef(T aObj = Traits::InvalidValue(), + AutoTypePolicy aPolicy = AutoTypePolicy::NoRetain) + : mObj(aObj) { + if (mObj != Traits::InvalidValue()) { + if (aPolicy == AutoTypePolicy::Retain) { + mObj = Traits::Retain(mObj); + } + } + } + + ~AutoTypeRef() { ReleaseIfNeeded(); } + + // Copy constructor + AutoTypeRef(const AutoTypeRef& aOther) : mObj(aOther.mObj) { + if (mObj != Traits::InvalidValue()) { + mObj = Traits::Retain(mObj); + } + } + + // Copy assignment + AutoTypeRef& operator=(const AutoTypeRef& aOther) { + ReleaseIfNeeded(); + mObj = aOther.mObj; + if (mObj != Traits::InvalidValue()) { + mObj = Traits::Retain(mObj); + } + return *this; + } + + // Move constructor + AutoTypeRef(AutoTypeRef&& aOther) : mObj(aOther.mObj) { + aOther.mObj = Traits::InvalidValue(); + } + + // Move assignment + AutoTypeRef& operator=(const AutoTypeRef&& aOther) { + ReleaseIfNeeded(); + mObj = aOther.mObj; + aOther.mObj = Traits::InvalidValue(); + return *this; + } + + explicit operator bool() const { return mObj != Traits::InvalidValue(); } + + operator T() { return mObj; } + + T& Ref() { return mObj; } + + T* Receive() { + MOZ_ASSERT(mObj == Traits::InvalidValue(), + "Receive() should only be called for uninitialized objects"); + return &mObj; + } + + void Reset(T aObj = Traits::InvalidValue(), + AutoTypePolicy aPolicy = AutoTypePolicy::NoRetain) { + ReleaseIfNeeded(); + mObj = aObj; + if (mObj != Traits::InvalidValue()) { + if (aPolicy == AutoTypePolicy::Retain) { + mObj = Traits::Retain(mObj); + } else { + mObj = aObj; + } + } + } + + private: + void ReleaseIfNeeded() { + if (mObj != Traits::InvalidValue()) { + Traits::Release(mObj); + mObj = Traits::InvalidValue(); + } + } + T mObj; +}; + +template +struct CFTypeRefTraits { + static CFT InvalidValue() { return nullptr; } + static CFT Retain(CFT aObject) { + CFRetain(aObject); + return aObject; + } + static void Release(CFT aObject) { CFRelease(aObject); } +}; + +template +struct CVBufferRefTraits { + static CVB InvalidValue() { return nullptr; } + static CVB Retain(CVB aObject) { + CVBufferRetain(aObject); + return aObject; + } + static void Release(CVB aObject) { CVBufferRelease(aObject); } +}; + +template +using AutoCFTypeRef = AutoTypeRef>; +template +using AutoCVBufferRef = AutoTypeRef>; + +class MOZ_RAII SessionPropertyManager { + public: + explicit SessionPropertyManager( + const AutoCFTypeRef& aSession); + explicit SessionPropertyManager(const VTCompressionSessionRef& aSession); + ~SessionPropertyManager() = default; + + bool IsSupported(CFStringRef aKey); + + OSStatus Set(CFStringRef aKey, int32_t aValue); + OSStatus Set(CFStringRef aKey, int64_t aValue); + OSStatus Set(CFStringRef aKey, float aValue); + OSStatus Set(CFStringRef aKey, bool aValue); + OSStatus Set(CFStringRef aKey, CFStringRef value); + OSStatus Copy(CFStringRef aKey, bool& aValue); + + private: + template + OSStatus Set(CFStringRef aKey, V aValue, CFNumberType aType); + + AutoCFTypeRef mSession; + AutoCFTypeRef mSupportedKeys; +}; + } // namespace mozilla #endif // mozilla_AppleUtils_h diff --git a/dom/media/platforms/apple/AppleVTDecoder.cpp b/dom/media/platforms/apple/AppleVTDecoder.cpp index a5d81a2e92d..8ef21c1a27e 100644 --- a/dom/media/platforms/apple/AppleVTDecoder.cpp +++ b/dom/media/platforms/apple/AppleVTDecoder.cpp @@ -12,7 +12,6 @@ #include "AOMDecoder.h" #include "AppleDecoderModule.h" -#include "AppleUtils.h" #include "CallbackThreadRegistry.h" #include "H264.h" #include "H265.h" @@ -187,8 +186,8 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { "AppleVTDecoder"_ns, aId, flag); }); - AutoCFRelease block = nullptr; - AutoCFRelease sample = nullptr; + AutoCFTypeRef block; + AutoCFTypeRef sample; VTDecodeInfoFlags infoFlags; OSStatus rv; @@ -202,7 +201,7 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { kCFAllocatorNull, // Block allocator. NULL, // Block source. 0, // Data offset. - aSample->Size(), false, block.receive()); + aSample->Size(), false, block.Receive()); if (rv != noErr) { NS_ERROR("Couldn't create CMBlockBuffer"); MonitorAutoLock mon(mMonitor); @@ -215,7 +214,7 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { CMSampleTimingInfo timestamp = TimingInfoFromSample(aSample); rv = CMSampleBufferCreate(kCFAllocatorDefault, block, true, 0, 0, mFormat, 1, - 1, ×tamp, 0, NULL, sample.receive()); + 1, ×tamp, 0, NULL, sample.Receive()); if (rv != noErr) { NS_ERROR("Couldn't create CMSampleBuffer"); MonitorAutoLock mon(mMonitor); @@ -253,15 +252,13 @@ void AppleVTDecoder::ProcessDecode(MediaRawData* aSample) { void AppleVTDecoder::ProcessShutdown() { if (mSession) { - LOG("%s: cleaning up session %p", __func__, mSession); + LOG("%s: cleaning up session", __func__); VTDecompressionSessionInvalidate(mSession); - CFRelease(mSession); - mSession = nullptr; + mSession.Reset(); } if (mFormat) { - LOG("%s: releasing format %p", __func__, mFormat); - CFRelease(mFormat); - mFormat = nullptr; + LOG("%s: releasing format", __func__); + mFormat.Reset(); } } @@ -595,7 +592,7 @@ nsresult AppleVTDecoder::WaitForAsynchronousFrames() { MediaResult AppleVTDecoder::InitializeSession() { OSStatus rv; - AutoCFRelease extensions = CreateDecoderExtensions(); + AutoCFTypeRef extensions(CreateDecoderExtensions()); CMVideoCodecType streamType; if (mStreamType == StreamType::H264) { streamType = kCMVideoCodecType_H264; @@ -609,25 +606,25 @@ MediaResult AppleVTDecoder::InitializeSession() { rv = CMVideoFormatDescriptionCreate( kCFAllocatorDefault, streamType, AssertedCast(mPictureWidth), - AssertedCast(mPictureHeight), extensions, &mFormat); + AssertedCast(mPictureHeight), extensions, mFormat.Receive()); if (rv != noErr) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, RESULT_DETAIL("Couldn't create format description!")); } // Contruct video decoder selection spec. - AutoCFRelease spec = CreateDecoderSpecification(); + AutoCFTypeRef spec(CreateDecoderSpecification()); // Contruct output configuration. - AutoCFRelease outputConfiguration = - CreateOutputConfiguration(); + AutoCFTypeRef outputConfiguration( + CreateOutputConfiguration()); VTDecompressionOutputCallbackRecord cb = {PlatformCallback, this}; rv = VTDecompressionSessionCreate(kCFAllocatorDefault, mFormat, spec, // Video decoder selection. outputConfiguration, // Output video format. - &cb, &mSession); + &cb, mSession.Receive()); if (rv != noErr) { LOG("AppleVTDecoder: VTDecompressionSessionCreate failed: %d", rv); @@ -657,9 +654,9 @@ MediaResult AppleVTDecoder::InitializeSession() { } CFDictionaryRef AppleVTDecoder::CreateDecoderExtensions() { - AutoCFRelease data = + AutoCFTypeRef data( CFDataCreate(kCFAllocatorDefault, mExtraData->Elements(), - AssertedCast(mExtraData->Length())); + AssertedCast(mExtraData->Length()))); const void* atomsKey[1]; if (mStreamType == StreamType::H264) { @@ -676,9 +673,9 @@ CFDictionaryRef AppleVTDecoder::CreateDecoderExtensions() { static_assert(std::size(atomsKey) == std::size(atomsValue), "Non matching keys/values array size"); - AutoCFRelease atoms = CFDictionaryCreate( + AutoCFTypeRef atoms(CFDictionaryCreate( kCFAllocatorDefault, atomsKey, atomsValue, std::size(atomsKey), - &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); + &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); const void* extensionKeys[] = { kCVImageBufferChromaLocationBottomFieldKey, @@ -718,8 +715,8 @@ CFDictionaryRef AppleVTDecoder::CreateOutputConfiguration() { if (mUseSoftwareImages) { // Output format type: SInt32 PixelFormatTypeValue = kCVPixelFormatType_420YpCbCr8Planar; - AutoCFRelease PixelFormatTypeNumber = CFNumberCreate( - kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue); + AutoCFTypeRef PixelFormatTypeNumber(CFNumberCreate( + kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue)); const void* outputKeys[] = {kCVPixelBufferPixelFormatTypeKey}; const void* outputValues[] = {PixelFormatTypeNumber}; static_assert(std::size(outputKeys) == std::size(outputValues), @@ -739,8 +736,8 @@ CFDictionaryRef AppleVTDecoder::CreateOutputConfiguration() { : kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) : (is10Bit ? kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange : kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange); - AutoCFRelease PixelFormatTypeNumber = CFNumberCreate( - kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue); + AutoCFTypeRef PixelFormatTypeNumber(CFNumberCreate( + kCFAllocatorDefault, kCFNumberSInt32Type, &PixelFormatTypeValue)); // Construct IOSurface Properties const void* IOSurfaceKeys[] = {kIOSurfaceIsGlobal}; const void* IOSurfaceValues[] = {kCFBooleanTrue}; @@ -748,10 +745,10 @@ CFDictionaryRef AppleVTDecoder::CreateOutputConfiguration() { "Non matching keys/values array size"); // Contruct output configuration. - AutoCFRelease IOSurfaceProperties = CFDictionaryCreate( + AutoCFTypeRef IOSurfaceProperties(CFDictionaryCreate( kCFAllocatorDefault, IOSurfaceKeys, IOSurfaceValues, std::size(IOSurfaceKeys), &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); + &kCFTypeDictionaryValueCallBacks)); const void* outputKeys[] = {kCVPixelBufferIOSurfacePropertiesKey, kCVPixelBufferPixelFormatTypeKey, diff --git a/dom/media/platforms/apple/AppleVTDecoder.h b/dom/media/platforms/apple/AppleVTDecoder.h index c7e5a783f79..0d74fae6b6d 100644 --- a/dom/media/platforms/apple/AppleVTDecoder.h +++ b/dom/media/platforms/apple/AppleVTDecoder.h @@ -16,6 +16,7 @@ #include "PlatformDecoderModule.h" #include "ReorderQueue.h" #include "TimeUnits.h" +#include "apple/AppleUtils.h" #include "mozilla/Atomics.h" #include "mozilla/DefineEnum.h" #include "mozilla/ProfilerUtils.h" @@ -147,8 +148,8 @@ class AppleVTDecoder final : public MediaDataDecoder, // safe to access it in OutputFrame without protecting. Maybe mSeekTargetThreshold; - CMVideoFormatDescriptionRef mFormat; - VTDecompressionSessionRef mSession; + AutoCFTypeRef mFormat; + AutoCFTypeRef mSession; Atomic mIsHardwareAccelerated; PerformanceRecorderMulti mPerformanceRecorder; }; diff --git a/dom/media/platforms/apple/AppleVTEncoder.cpp b/dom/media/platforms/apple/AppleVTEncoder.cpp index 681e8f31aa0..372db4fd3c0 100644 --- a/dom/media/platforms/apple/AppleVTEncoder.cpp +++ b/dom/media/platforms/apple/AppleVTEncoder.cpp @@ -12,7 +12,6 @@ #include #include "AnnexB.h" -#include "AppleUtils.h" #include "H264.h" #include "ImageContainer.h" @@ -70,64 +69,59 @@ static void FrameCallback(void* aEncoder, void* aFrameRefCon, OSStatus aStatus, ->OutputFrame(aStatus, aInfoFlags, aSampleBuffer); } -static bool SetAverageBitrate(VTCompressionSessionRef& aSession, - uint32_t aBitsPerSec) { - int64_t bps(aBitsPerSec); - AutoCFRelease bitrate( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &bps)); - return VTSessionSetProperty(aSession, - kVTCompressionPropertyKey_AverageBitRate, - bitrate) == noErr; +bool AppleVTEncoder::SetAverageBitrate(uint32_t aBitsPerSec) { + MOZ_ASSERT(mSession); + + SessionPropertyManager mgr(mSession); + return mgr.Set(kVTCompressionPropertyKey_AverageBitRate, + int64_t(aBitsPerSec)) == noErr; } -static bool SetConstantBitrate(VTCompressionSessionRef& aSession, - uint32_t aBitsPerSec) { - int32_t bps(aBitsPerSec); - AutoCFRelease bitrate( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &bps)); +bool AppleVTEncoder::SetConstantBitrate(uint32_t aBitsPerSec) { + MOZ_ASSERT(mSession); if (__builtin_available(macos 13.0, *)) { - int rv = VTSessionSetProperty(aSession, - kVTCompressionPropertyKey_ConstantBitRate, - bitrate) == noErr; + SessionPropertyManager mgr(mSession); + OSStatus rv = mgr.Set(kVTCompressionPropertyKey_ConstantBitRate, + AssertedCast(aBitsPerSec)); if (rv == kVTPropertyNotSupportedErr) { LOGE("Constant bitrate not supported."); } + return rv == noErr; } return false; } -static bool SetBitrateAndMode(VTCompressionSessionRef& aSession, - BitrateMode aBitrateMode, uint32_t aBitsPerSec) { +bool AppleVTEncoder::SetBitrateAndMode(BitrateMode aBitrateMode, + uint32_t aBitsPerSec) { if (aBitrateMode == BitrateMode::Variable) { - return SetAverageBitrate(aSession, aBitsPerSec); + return SetAverageBitrate(aBitsPerSec); } - return SetConstantBitrate(aSession, aBitsPerSec); + return SetConstantBitrate(aBitsPerSec); } -static bool SetFrameRate(VTCompressionSessionRef& aSession, int64_t aFPS) { - AutoCFRelease framerate( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &aFPS)); - return VTSessionSetProperty(aSession, - kVTCompressionPropertyKey_ExpectedFrameRate, - framerate) == noErr; +bool AppleVTEncoder::SetFrameRate(int64_t aFPS) { + MOZ_ASSERT(mSession); + + SessionPropertyManager mgr(mSession); + return mgr.Set(kVTCompressionPropertyKey_ExpectedFrameRate, aFPS) == noErr; } -static bool SetRealtime(VTCompressionSessionRef& aSession, bool aEnabled) { +bool AppleVTEncoder::SetRealtime(bool aEnabled) { + MOZ_ASSERT(mSession); + // B-frames has been disabled in Init(), so no need to set it here. - CFBooleanRef enabled = aEnabled ? kCFBooleanTrue : kCFBooleanFalse; - OSStatus status = VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_RealTime, enabled); + SessionPropertyManager mgr(mSession); + OSStatus status = mgr.Set(kVTCompressionPropertyKey_RealTime, aEnabled); LOGD("%s real time, status: %d", aEnabled ? "Enable" : "Disable", status); if (status != noErr) { return false; } if (__builtin_available(macos 11.0, *)) { - status = VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality, - enabled); + status = mgr.Set( + kVTCompressionPropertyKey_PrioritizeEncodingSpeedOverQuality, aEnabled); LOGD("%s PrioritizeEncodingSpeedOverQuality, status: %d", aEnabled ? "Enable" : "Disable", status); if (status != noErr && status != kVTPropertyNotSupportedErr) { @@ -136,10 +130,8 @@ static bool SetRealtime(VTCompressionSessionRef& aSession, bool aEnabled) { } int32_t maxFrameDelayCount = aEnabled ? 0 : kVTUnlimitedFrameDelayCount; - AutoCFRelease cf(CFNumberCreate( - kCFAllocatorDefault, kCFNumberSInt32Type, &maxFrameDelayCount)); - status = VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_MaxFrameDelayCount, cf); + status = + mgr.Set(kVTCompressionPropertyKey_MaxFrameDelayCount, maxFrameDelayCount); LOGD("Set max frame delay count to %d, status: %d", maxFrameDelayCount, status); if (status != noErr && status != kVTPropertyNotSupportedErr) { @@ -149,8 +141,9 @@ static bool SetRealtime(VTCompressionSessionRef& aSession, bool aEnabled) { return true; } -static bool SetProfileLevel(VTCompressionSessionRef& aSession, - H264_PROFILE aValue) { +bool AppleVTEncoder::SetProfileLevel(H264_PROFILE aValue) { + MOZ_ASSERT(mSession); + CFStringRef profileLevel = nullptr; switch (aValue) { case H264_PROFILE::H264_PROFILE_BASE: @@ -166,10 +159,12 @@ static bool SetProfileLevel(VTCompressionSessionRef& aSession, LOGE("Profile %d not handled", static_cast(aValue)); } - return profileLevel ? VTSessionSetProperty( - aSession, kVTCompressionPropertyKey_ProfileLevel, - profileLevel) == noErr - : false; + if (profileLevel == nullptr) { + return false; + } + + SessionPropertyManager mgr(mSession); + return mgr.Set(kVTCompressionPropertyKey_ProfileLevel, profileLevel) == noErr; } static Result MapPixelFormat( @@ -256,7 +251,7 @@ MediaResult AppleVTEncoder::InitSession() { LOGD("low latency rate control: %s, Hardware allowed: %s", lowLatencyRateControl ? "yes" : "no", mHardwareNotAllowed ? "no" : "yes"); - AutoCFRelease spec( + AutoCFTypeRef spec( BuildEncoderSpec(mHardwareNotAllowed, lowLatencyRateControl)); // Bug 1955153: Set sourceImageBufferAttributes using the pixel format derived @@ -265,20 +260,20 @@ MediaResult AppleVTEncoder::InitSession() { kCFAllocatorDefault, mConfig.mSize.width, mConfig.mSize.height, kCMVideoCodecType_H264, spec, nullptr /* sourceImageBufferAttributes */, kCFAllocatorDefault, &FrameCallback, this /* outputCallbackRefCon */, - &mSession); + mSession.Receive()); if (status != noErr) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "fail to create encoder session"); } - if (VTSessionSetProperty(mSession, - kVTCompressionPropertyKey_AllowFrameReordering, - kCFBooleanFalse) != noErr) { + SessionPropertyManager mgr(mSession); + + if (mgr.Set(kVTCompressionPropertyKey_AllowFrameReordering, false) != noErr) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "Couldn't disable bframes"); } - if (mConfig.mUsage == Usage::Realtime && !SetRealtime(mSession, true)) { + if (mConfig.mUsage == Usage::Realtime && !SetRealtime(true)) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "fail to configure real-time"); } @@ -290,8 +285,7 @@ MediaResult AppleVTEncoder::InitSession() { LOGD("H264 CBR not supported in VideoToolbox, falling back to VBR"); mConfig.mBitrateMode = BitrateMode::Variable; } - bool rv = - SetBitrateAndMode(mSession, mConfig.mBitrateMode, mConfig.mBitrate); + bool rv = SetBitrateAndMode(mConfig.mBitrateMode, mConfig.mBitrate); if (!rv) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, "fail to configurate bitrate"); @@ -314,11 +308,9 @@ MediaResult AppleVTEncoder::InitSession() { default: MOZ_ASSERT_UNREACHABLE("Unhandled value"); } - AutoCFRelease cf(CFNumberCreate( - kCFAllocatorDefault, kCFNumberFloatType, &baseLayerFPSRatio)); - if (VTSessionSetProperty( - mSession, kVTCompressionPropertyKey_BaseLayerFrameRateFraction, - cf)) { + + if (mgr.Set(kVTCompressionPropertyKey_BaseLayerFrameRateFraction, + baseLayerFPSRatio) != noErr) { return MediaResult( NS_ERROR_DOM_MEDIA_FATAL_ERR, nsPrintfCString("fail to configure SVC (base ratio: %f", @@ -334,11 +326,9 @@ MediaResult AppleVTEncoder::InitSession() { mConfig.mKeyframeInterval > std::numeric_limits::max() ? std::numeric_limits::max() : AssertedCast(mConfig.mKeyframeInterval); - AutoCFRelease cf( - CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &interval)); - if (VTSessionSetProperty(mSession, - kVTCompressionPropertyKey_MaxKeyFrameInterval, - cf) != noErr) { + + if (mgr.Set(kVTCompressionPropertyKey_MaxKeyFrameInterval, interval) != + noErr) { return MediaResult( NS_ERROR_DOM_MEDIA_FATAL_ERR, nsPrintfCString("fail to configurate keyframe interval:%" PRId64, @@ -347,18 +337,18 @@ MediaResult AppleVTEncoder::InitSession() { if (mConfig.mCodecSpecific) { const H264Specific& specific = mConfig.mCodecSpecific->as(); - if (!SetProfileLevel(mSession, specific.mProfile)) { + if (!SetProfileLevel(specific.mProfile)) { return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR, nsPrintfCString("fail to configurate profile level:%d", int(specific.mProfile))); } } - AutoCFRelease isUsingHW = nullptr; - status = VTSessionCopyProperty( - mSession, kVTCompressionPropertyKey_UsingHardwareAcceleratedVideoEncoder, - kCFAllocatorDefault, isUsingHW.receive()); - mIsHardwareAccelerated = status == noErr && isUsingHW == kCFBooleanTrue; + bool isUsingHW = false; + status = + mgr.Copy(kVTCompressionPropertyKey_UsingHardwareAcceleratedVideoEncoder, + isUsingHW); + mIsHardwareAccelerated = status == noErr && isUsingHW; LOGD("Using hw acceleration: %s", mIsHardwareAccelerated ? "yes" : "no"); errorExit.release(); @@ -368,8 +358,7 @@ MediaResult AppleVTEncoder::InitSession() { void AppleVTEncoder::InvalidateSessionIfNeeded() { if (mSession) { VTCompressionSessionInvalidate(mSession); - CFRelease(mSession); - mSession = nullptr; + mSession.Reset(); } } @@ -380,10 +369,10 @@ CFDictionaryRef AppleVTEncoder::BuildSourceImageBufferAttributes( kCVPixelBufferIOSurfacePropertiesKey, // TODO kCVPixelBufferPixelFormatTypeKey}; - AutoCFRelease ioSurfaceProps(CFDictionaryCreate( + AutoCFTypeRef ioSurfaceProps(CFDictionaryCreate( kCFAllocatorDefault, nullptr, nullptr, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks)); - AutoCFRelease pixelFormat( + AutoCFTypeRef pixelFormat( CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &aPixelFormat)); const void* values[] = {kCFBooleanTrue, ioSurfaceProps, pixelFormat}; @@ -490,6 +479,8 @@ bool AppleVTEncoder::WriteExtraData(MediaRawData* aDst, CMSampleBufferRef aSrc, return true; } + LOGV("Writing extra data (%s) for keyframe", aAsAnnexB ? "AnnexB" : "AVCC"); + aDst->mKeyframe = true; CMFormatDescriptionRef desc = CMSampleBufferGetFormatDescription(aSrc); if (!desc) { @@ -503,15 +494,17 @@ bool AppleVTEncoder::WriteExtraData(MediaRawData* aDst, CMSampleBufferRef aSrc, RefPtr avcc = extractAvcc(desc); if (!avcc) { + LOGE("failed to extract avcc"); return false; } if (!mAvcc || !H264::CompareExtraData(avcc, mAvcc)) { + LOGV("avcC changed, updating"); mAvcc = avcc; aDst->mExtraData = mAvcc; } - return avcc != nullptr; + return true; } static bool WriteNALUs(MediaRawData* aDst, CMSampleBufferRef aSrc, @@ -705,7 +698,7 @@ void AppleVTEncoder::ProcessEncode(const RefPtr& aSample) { MaybeResolveOrRejectEncodePromise(); } - AutoCVBufferRelease buffer( + AutoCVBufferRef buffer( CreateCVPixelBuffer(aSample->mImage)); if (!buffer) { LOGE("Failed to allocate buffer"); @@ -770,15 +763,13 @@ AppleVTEncoder::ProcessReconfigure( [&](const DisplayDimensionsChange& aChange) -> bool { return false; }, [&](const BitrateModeChange& aChange) -> bool { mConfig.mBitrateMode = aChange.get(); - return SetBitrateAndMode(mSession, mConfig.mBitrateMode, - mConfig.mBitrate); + return SetBitrateAndMode(mConfig.mBitrateMode, mConfig.mBitrate); }, [&](const BitrateChange& aChange) -> bool { mConfig.mBitrate = aChange.get().refOr(0); // 0 is the default in AppleVTEncoder: the encoder chooses the bitrate // based on the content. - return SetBitrateAndMode(mSession, mConfig.mBitrateMode, - mConfig.mBitrate); + return SetBitrateAndMode(mConfig.mBitrateMode, mConfig.mBitrate); }, [&](const FramerateChange& aChange) -> bool { // 0 means default, in VideoToolbox, and is valid, perform some light @@ -789,11 +780,11 @@ AppleVTEncoder::ProcessReconfigure( LOGE("Invalid fps of %lf", fps); return false; } - return SetFrameRate(mSession, AssertedCast(fps)); + return SetFrameRate(AssertedCast(fps)); }, [&](const UsageChange& aChange) -> bool { mConfig.mUsage = aChange.get(); - return SetRealtime(mSession, aChange.get() == Usage::Realtime); + return SetRealtime(aChange.get() == Usage::Realtime); }, [&](const ContentHintChange& aChange) -> bool { return false; }, [&](const SampleRateChange& aChange) -> bool { return false; }, @@ -1019,8 +1010,7 @@ RefPtr AppleVTEncoder::SetBitrate(uint32_t aBitsPerSec) { RefPtr self = this; return InvokeAsync(mTaskQueue, __func__, [self, aBitsPerSec]() { MOZ_ASSERT(self->mSession); - bool rv = SetBitrateAndMode(self->mSession, self->mConfig.mBitrateMode, - aBitsPerSec); + bool rv = self->SetBitrateAndMode(self->mConfig.mBitrateMode, aBitsPerSec); return rv ? GenericPromise::CreateAndResolve(true, __func__) : GenericPromise::CreateAndReject( NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR, __func__); diff --git a/dom/media/platforms/apple/AppleVTEncoder.h b/dom/media/platforms/apple/AppleVTEncoder.h index 146e7554961..db9208b9a76 100644 --- a/dom/media/platforms/apple/AppleVTEncoder.h +++ b/dom/media/platforms/apple/AppleVTEncoder.h @@ -10,6 +10,7 @@ #include #include +#include "apple/AppleUtils.h" #include "PlatformEncoderModule.h" namespace mozilla { @@ -73,6 +74,14 @@ class AppleVTEncoder final : public MediaDataEncoder { CVPixelBufferRef CreateCVPixelBuffer(layers::Image* aSource); bool WriteExtraData(MediaRawData* aDst, CMSampleBufferRef aSrc, const bool aAsAnnexB); + + bool SetAverageBitrate(uint32_t aBitsPerSec); + bool SetConstantBitrate(uint32_t aBitsPerSec); + bool SetBitrateAndMode(BitrateMode aBitrateMode, uint32_t aBitsPerSec); + bool SetFrameRate(int64_t aFPS); + bool SetRealtime(bool aEnabled); + bool SetProfileLevel(H264_PROFILE aValue); + void AssertOnTaskQueue() { MOZ_ASSERT(mTaskQueue->IsCurrentThreadIn()); } EncoderConfig mConfig; @@ -86,7 +95,7 @@ class AppleVTEncoder final : public MediaDataEncoder { MediaResult mError; // Written by Init() but used only in task queue. - VTCompressionSessionRef mSession; + AutoCFTypeRef mSession; // Can be accessed on any thread, but only written on during init. Atomic mIsHardwareAccelerated; // Accessed only in mTaskQueue. Used for for OS versions < 11. diff --git a/dom/media/platforms/moz.build b/dom/media/platforms/moz.build index a277b5b02db..237cbc9f044 100644 --- a/dom/media/platforms/moz.build +++ b/dom/media/platforms/moz.build @@ -89,11 +89,13 @@ if CONFIG["MOZ_APPLEMEDIA"]: EXPORTS += [ "apple/AppleDecoderModule.h", "apple/AppleEncoderModule.h", + "apple/AppleUtils.h", ] UNIFIED_SOURCES += [ "apple/AppleATDecoder.cpp", "apple/AppleDecoderModule.cpp", "apple/AppleEncoderModule.cpp", + "apple/AppleUtils.cpp", "apple/AppleVTDecoder.cpp", "apple/AppleVTEncoder.cpp", ] diff --git a/dom/media/platforms/wmf/WMFEncoderModule.cpp b/dom/media/platforms/wmf/WMFEncoderModule.cpp index 7b5af9bf50f..d459f0e3d36 100644 --- a/dom/media/platforms/wmf/WMFEncoderModule.cpp +++ b/dom/media/platforms/wmf/WMFEncoderModule.cpp @@ -26,6 +26,9 @@ bool WMFEncoderModule::Supports(const EncoderConfig& aConfig) const { if (aConfig.IsAudio()) { return false; } + if (aConfig.mScalabilityMode != ScalabilityMode::None) { + return aConfig.mCodec == CodecType::H264; + } return SupportsCodec(aConfig.mCodec); } diff --git a/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp b/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp index 9dd95b204b9..d5dc3b07b5d 100644 --- a/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp +++ b/dom/media/platforms/wmf/WMFMediaDataEncoder.cpp @@ -343,7 +343,8 @@ already_AddRefed WMFMediaDataEncoder::IMFSampleToMediaData( auto frame = MakeRefPtr(); - if (mConfig.mScalabilityMode != ScalabilityMode::None) { + if (mConfig.mCodec == CodecType::H264 && + mConfig.mScalabilityMode != ScalabilityMode::None) { auto maybeId = H264::ExtractSVCTemporalId(lockBuffer.Data(), lockBuffer.Length()); frame->mTemporalLayerId = Some(maybeId.unwrapOr(0)); diff --git a/dom/media/test/mochitest.toml b/dom/media/test/mochitest.toml index c968f09e990..35e758ababb 100644 --- a/dom/media/test/mochitest.toml +++ b/dom/media/test/mochitest.toml @@ -815,6 +815,7 @@ scheme = "https" ["test_mediatrack_consuming_mediastream.html"] scheme = "https" tags = "mtg" +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # TIMEOUT ["test_mediatrack_replay_from_end.html"] @@ -831,6 +832,7 @@ skip-if = [ ["test_mp4a_32bit_samplesize.html"] # bug 1924052 ["test_multiple_mediastreamtracks.html"] +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # TIMEOUT scheme = "https" ["test_play_events_2.html"] @@ -897,6 +899,7 @@ skip-if = ["os == 'android'"] # Android has black frames issue. ["test_setSinkId_after_loop.html"] scheme = "https" +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # Bug 1961557 ["test_temporary_file_blob_video_plays.html"] skip-if = ["os == 'android'"] # bug 1533534 # android(bug 1232305) diff --git a/dom/media/test/mochitest_compat.toml b/dom/media/test/mochitest_compat.toml index f0cb9986d54..7f34caafb9f 100644 --- a/dom/media/test/mochitest_compat.toml +++ b/dom/media/test/mochitest_compat.toml @@ -863,6 +863,7 @@ skip-if = ["wmfme"] # Bug 1781539 ["test_mediatrack_events.html"] scheme = "https" +skip-if = ["os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug"] # TIMEOUT ["test_mediatrack_parsing_ogg.html"] diff --git a/dom/media/test/reftest/color_quads/reftest.list b/dom/media/test/reftest/color_quads/reftest.list index 6e58cdcfc40..27f618e105a 100644 --- a/dom/media/test/reftest/color_quads/reftest.list +++ b/dom/media/test/reftest/color_quads/reftest.list @@ -14,17 +14,17 @@ defaults pref(media.av1.enabled,true) # - # yuv420p -fuzzy(16-51,5234-5622) fuzzy-if(swgl,32-38,1600-91746) fuzzy-if(useDrawSnapshot,16-16,11600-11600) fuzzy-if(cocoaWidget,16-73,5212-5622) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png -fuzzy-if(Android,25-255,273680-359920) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(appleSilicon,30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 +fuzzy(16-51,5234-5622) fuzzy-if(swgl,32-38,1600-91746) fuzzy-if(useDrawSnapshot,16-16,11600-11600) fuzzy-if(cocoaWidget,16-73,5212-5622) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),65-68,187405-196775) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png +fuzzy-if(Android,25-255,273680-359920) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(cocoaWidget&&/^14\.20$/.test(os_version),30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 fuzzy-if(winWidget,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm -skip-if(winWidget&&isCoverageBuild) fuzzy(0-16,75-1941) fuzzy-if(Android,28-255,273680-359920) fuzzy-if(cocoaWidget,30-32,187326-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-13,0-196692) fuzzy-if(appleSilicon,30-48,1835-187409) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 -skip-if(Android) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(appleSilicon,30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 +skip-if(winWidget&&isCoverageBuild) fuzzy(0-16,75-1941) fuzzy-if(Android,28-255,273680-359920) fuzzy-if(cocoaWidget,30-32,187326-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-13,0-196692) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-2,0-159) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),30-48,1835-187409) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 +skip-if(Android) fuzzy-if(cocoaWidget,0-35,0-1947) fuzzy-if(cocoaWidget&&swgl,0-67,0-196692) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,12-12,187326-196692) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),30-48,1760-187409) fuzzy-if(winWidget&&swgl,0-20,0-5620) fuzzy-if(winWidget&&!swgl,0-1,0-78) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p.av1.webm # Bug 1934894 -skip-if(Android) fuzzy(16-48,8107-8818) fuzzy-if(winWidget&&swgl,31-38,8240-184080) fuzzy-if(appleSilicon,33-38,8819-11705) fuzzy-if(useDrawSnapshot,20-20,187200-187200) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png +skip-if(Android) fuzzy(16-48,8107-8818) fuzzy-if(useDrawSnapshot,20-20,187200-187200) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),65-68,187405-196775) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),33-38,8819-11705) fuzzy-if(winWidget&&swgl,31-38,8240-184080) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm ../reftest_img.html?src=color_quads/720p.png skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # On Windows & sw render, we noticed that the comparison image captured from AV1 is not equal to its displayed video frame, so we would need to compare other codecs directly to PNG file. That should be fixed in bug 1748540. skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,0-16,0-1718) fuzzy-if(cocoaWidget&&swgl,0-42,0-196694) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,40-42,187328-196694) fuzzy-if(appleSilicon,0-16,0-1874) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 -skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(useDrawSnapshot,0-1,0-10) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,2-36,184281-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),39-40,187329-196695) fuzzy-if(appleSilicon,36-49,187329-187407) fuzzy-if(winWidget,0-21,0-360000) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 +skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(useDrawSnapshot,0-1,0-10) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,2-36,184281-187407) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),39-40,187329-196695) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-1,0-6) fuzzy-if(cocoaWidget&&/^11\.20$/.test(os_version),36-49,187329-187407) fuzzy-if(winWidget,0-21,0-360000) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 skip-if(Android) skip-if(winWidget&&swgl) fuzzy-if(Android,255-255,273726-273726) fuzzy-if(cocoaWidget,0-16,0-1718) fuzzy-if(cocoaWidget&&swgl,0-42,0-196694) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version)&&!swgl,40-42,187328-196694) fuzzy-if(appleSilicon,0-16,0-1874) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.av1.webm # Bug 1934894 skip-if(Android) skip-if(!(winWidget&&swgl)) fuzzy(0-35,0-8506) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.webm ../reftest_img.html?src=color_quads/720p.png skip-if(Android) skip-if(!(winWidget&&swgl)) fuzzy(0-35,0-8506) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p.vp9.mp4 ../reftest_img.html?src=color_quads/720p.png @@ -32,17 +32,17 @@ skip-if(Android) skip-if(!(winWidget&&swgl)) fuzzy(0-35,0-8506) == ../reftest_vi # - # yuv420p10 -skip-if(Android) fuzzy(33-49,1870-2579) fuzzy-if(swgl,34-52,180421-270528) fuzzy-if(useDrawSnapshot,16-16,183840-183840) fuzzy-if(cocoaWidget,60-74,270329-271024) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png +skip-if(Android) fuzzy(33-49,1870-2579) fuzzy-if(swgl,34-52,180421-270528) fuzzy-if(useDrawSnapshot,16-16,183840-183840) fuzzy-if(cocoaWidget,60-74,270329-271024) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),67-70,273726-287412) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png skip-if(Android) fuzzy-if(cocoaWidget,0-12,0-187770) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm #[2] skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm skip-if(Android) fuzzy-if(cocoaWidget,0-12,0-187770) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.tv.yuv420p10.av1.webm -skip-if(Android) fuzzy(33-49,174620-270059) fuzzy-if(!winWidget&&swgl,36-52,11553-11555) fuzzy-if(winWidget&&swgl,36-52,11554-187200) fuzzy-if(swgl&&cocoaWidget,34-50,11465-270059) fuzzy-if(useDrawSnapshot,20-20,186800-186800) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png -skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-12,0-274122) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),40-42,187329-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 +skip-if(Android) fuzzy(33-49,174620-270059) fuzzy-if(useDrawSnapshot,20-20,186800-186800) fuzzy-if(!winWidget&&swgl,36-52,11553-11555) fuzzy-if(swgl&&cocoaWidget,34-50,11465-270059) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),66-69,273726-287412) fuzzy-if(winWidget&&swgl,36-52,11554-187200) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm ../reftest_img.html?src=color_quads/720p.png +skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-42,0-196695) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-42,0-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.webm ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm #[2] skip-if(Android) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.h264.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm -skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-12,0-274122) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),40-42,187329-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 +skip-if(Android) fuzzy-if(cocoaWidget&&/^14\.70$/.test(os_version),0-42,0-196695) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),0-42,0-196695) == ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.vp9.mp4 ../reftest_video.html?src=color_quads/720p.png.bt709.bt709.pc.yuv420p10.av1.webm # Bug 1934894 # Android is really broken in a variety of ways for p10. #[2]: yuv420p10 broken in h264.mp4: https://bugzilla.mozilla.org/show_bug.cgi?id=1711812 diff --git a/dom/media/test/reftest/reftest.list b/dom/media/test/reftest/reftest.list index 35b50478564..1598f676859 100644 --- a/dom/media/test/reftest/reftest.list +++ b/dom/media/test/reftest/reftest.list @@ -1,7 +1,7 @@ skip-if(Android) fuzzy-if(cocoaWidget,0-80,0-76800) fuzzy-if(appleSilicon,0-80,0-76800) fuzzy-if(winWidget,0-63,0-76799) fuzzy-if(gtkWidget,0-70,0-2032) HTTP(..) == short.mp4.firstframe.html short.mp4.firstframe-ref.html pref(media.seekToNextFrame.enabled,true) skip-if(Android) fuzzy-if(cocoaWidget,0-87,0-76797) fuzzy-if(appleSilicon,0-87,0-76797) fuzzy-if(winWidget,0-60,0-76797) fuzzy-if(gtkWidget,0-60,0-6070) HTTP(..) == short.mp4.lastframe.html short.mp4.lastframe-ref.html skip-if(Android) skip-if(cocoaWidget) skip-if(winWidget) fuzzy-if(gtkWidget,0-57,0-4282) fuzzy-if(cocoaWidget,55-80,4173-4417) HTTP(..) == bipbop_300_215kbps.mp4.lastframe.html bipbop_300_215kbps.mp4.lastframe-ref.html -skip-if(Android) fuzzy-if(cocoaWidget,0-25,0-175921) fuzzy-if(appleSilicon,34-34,40100-40100) fuzzy-if(winWidget,0-71,0-179198) fuzzy-if(gtkWidget,0-46,0-173482) HTTP(..) == gizmo.mp4.seek.html gizmo.mp4.55thframe-ref.html +skip-if(Android) fuzzy-if(cocoaWidget,0-25,0-175921) fuzzy-if(appleSilicon,0-34,0-40100) fuzzy-if(winWidget,0-71,0-179198) fuzzy-if(gtkWidget,0-46,0-173482) HTTP(..) == gizmo.mp4.seek.html gizmo.mp4.55thframe-ref.html # Bug 1758718 skip-if(Android) skip-if(cocoaWidget) fuzzy(0-10,0-778236) == image-10bits-rendering-video.html image-10bits-rendering-ref.html skip-if(Android) fuzzy(0-10,0-778536) fuzzy-if(appleSilicon,0-37,0-699614) == image-10bits-rendering-90-video.html image-10bits-rendering-90-ref.html diff --git a/dom/media/tests/crashtests/crashtests.list b/dom/media/tests/crashtests/crashtests.list index f6e2fcc563d..3d492d13e44 100644 --- a/dom/media/tests/crashtests/crashtests.list +++ b/dom/media/tests/crashtests/crashtests.list @@ -23,7 +23,7 @@ asserts-if(Android,0-1) pref(browser.link.open_newwindow,2) load 1429507_2.html load 1443212.html asserts-if(Android,0-2) load 1453030.html load 1468451.html -skip-if(wayland) skip-if(cocoaWidget&&/^14\.70$/.test(os_version)) skip-if(Android) load 1490700.html # wayland: bug 1856368, macOS bug 1932140, No screenshare on Android +skip-if(wayland) skip-if(cocoaWidget&&/^14\.70$/.test(os_version)) skip-if(cocoaWidget&&/^15\.30$/.test(os_version)) skip-if(Android) load 1490700.html # wayland: bug 1856368, macOS bug 1932140, No screenshare on Android load 1505957.html load 1509442.html load 1511130.html @@ -39,4 +39,4 @@ load 1764933.html load 1764940.html load 1766668.html load 1783765.html -skip-if(Android) load 1920264.html +skip-if(Android) skip-if(cocoaWidget&&/^15\.30$/.test(os_version)) load 1920264.html diff --git a/dom/media/webrtc/tests/crashtests/crashtests.list b/dom/media/webrtc/tests/crashtests/crashtests.list index 8bcf1e69ca1..43caafff456 100644 --- a/dom/media/webrtc/tests/crashtests/crashtests.list +++ b/dom/media/webrtc/tests/crashtests/crashtests.list @@ -5,5 +5,5 @@ load 1789908.html load 1799168.html load 1816708.html load 1821477.html -load 1903905.html +skip-if(cocoaWidget&&/^15\.30$/.test(os_version)) load 1903905.html pref(media.navigator.permission.device,true) pref(media.audio_loopback_dev,"real-device-request-with-clear-cache") load getUserMedia-audio.html # bug 1767893 diff --git a/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml b/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml index 24c6c2f2521..cb3beb51b3b 100644 --- a/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml +++ b/dom/media/webrtc/tests/mochitests/mochitest_datachannel.toml @@ -57,6 +57,9 @@ scheme = "http" ["test_dataChannel_hostnameObfuscation.html"] scheme = "http" +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1961560 +] ["test_dataChannel_noOffer.html"] scheme = "http" diff --git a/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml b/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml index 541a667c362..0408dc5939a 100644 --- a/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml +++ b/dom/media/webrtc/tests/mochitests/mochitest_peerconnection.toml @@ -397,7 +397,10 @@ skip-if = ["os == 'android'"] # Bug 1614460 ["test_peerConnection_simulcastOffer_oldSetParameters.html"] ["test_peerConnection_simulcastOffer_screenshare.html"] -skip-if = ["os == 'android'"] # no screenshare on android +skip-if = [ + "os == 'android'", # no screenshare on android + "os == 'mac' && os_version == '15.30' && arch == 'aarch64'", # Bug 1941688 +] ["test_peerConnection_stats.html"] diff --git a/dom/quota/test/xpcshell/test_temporaryStorageEviction.js b/dom/quota/test/xpcshell/test_temporaryStorageEviction.js new file mode 100644 index 00000000000..427919120c9 --- /dev/null +++ b/dom/quota/test/xpcshell/test_temporaryStorageEviction.js @@ -0,0 +1,327 @@ +/** + * Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const { PrefUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs" +); +const { PrincipalUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs" +); +const { QuotaUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs" +); +const { SimpleDBUtils } = ChromeUtils.importESModule( + "resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs" +); + +// This value is used to set dom.quotaManager.temporaryStorage.fixedLimit +// for this test, and must match the needs of the writes we plan to do. +// The storage size must be a multiple of (number of origins - 1) to ensure +// `dataSize` is a whole number. This is enforced below with a check to +// guarantee predictable writes. +const storageSizeKB = 32; + +/** + * This test simulates origin usage across five related stages, exercising: + * - Access time tracking on first and last access to each origin + * - Eviction logic based on activity and last access time + * - Usage reflection via QuotaManager's reporting APIs + * + * The test is data-driven: it defines a list of origins, each with a flag + * array representing whether data on disk is expected to exist after each + * stage. These flags are used to verify origin usage deterministically at each + * point. + * + * The total storage size is evenly divided among all origins except the last + * one. This ensures predictable write outcomes: + * - All but the last origin succeed in writing initially + * - The last origin exceeds quota and triggers eviction conditions + * + * Each stage simulates realistic temporary storage (AKA best-effort) behavior: + * Stage 1 - Initializes all origin directories in reverse to test access time + * updates + * Stage 2 - Opens connections and fills storage, leaving no room for the last + * origin + * Stage 3 - Closes most connections to allow eviction of inactive origins + * Stage 4 - Shrinks temporary storage by 50%, triggering additional evictions + * Stage 5 - Writes again to the last origin to validate ongoing eviction + * behavior + * + * This test ensures correctness and robustness of temporary storage handling, + * especially around eviction and access time policies. + */ +async function testTemporaryStorageEviction() { + const storageSize = storageSizeKB * 1024; + + // flags: [stage1, stage2, stage3, stage4, stage5] + // 1 = data on disk should exist, 0 = data on disk should not exist + + /* prettier-ignore */ + const originInfos = [ + { url: "https://www.alpha.com", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.beta.com", flags: [0, 1, 0, 0, 0] }, + { url: "https://www.gamma.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.delta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.epsilon.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.alpha.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.beta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.gamma.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.delta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www2.epsilon.com",flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.alpha.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.beta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.gamma.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.delta.com", flags: [0, 1, 1, 0, 0] }, + { url: "https://www3.epsilon.com",flags: [0, 1, 1, 0, 0] }, + { url: "https://www.alpha.org", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.beta.org", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.gamma.org", flags: [0, 1, 1, 0, 0] }, + { url: "https://www.delta.org", flags: [0, 1, 1, 1, 0] }, + { url: "https://www.epsilon.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.zeta.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.eta.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.theta.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.iota.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.kappa.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.lambda.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.mu.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.nu.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.xi.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.omicron.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.pi.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.rho.org", flags: [0, 1, 1, 1, 1] }, + { url: "https://www.omega.org", flags: [0, 0, 1, 1, 1] }, + ]; + Assert.equal( + storageSize % (originInfos.length - 1), + 0, + "Correct storage size" + ); + + const name = "test_temporaryStorageEviction"; + + const dataSize = storageSize / (originInfos.length - 1); + const dataBuffer = new ArrayBuffer(dataSize); + + async function checkUsage(stage) { + for (const originInfo of originInfos) { + const url = originInfo.url; + + info(`Checking usage for ${url}`); + + const principal = PrincipalUtils.createPrincipal(url); + + const request = Services.qms.getUsageForPrincipal(principal, {}); + const usageResult = await QuotaUtils.requestFinished(request); + + if (originInfo.flags[stage - 1]) { + Assert.greater(usageResult.usage, 0, "Correct usage"); + } else { + Assert.equal(usageResult.usage, 0, "Correct usage"); + } + } + } + + async function createAndOpenConnection(url) { + const principal = PrincipalUtils.createPrincipal(url); + + const connection = SimpleDBUtils.createConnection(principal); + + const openRequest = connection.open(name); + await SimpleDBUtils.requestFinished(openRequest); + + return connection; + } + + info( + "Stage 1: Reverse creation of origins to test first/last access time updates" + ); + + // Initializes storage and temporary storage and creates all origin + // directories with metadata, in reverse order. This ensures that the + // "first access" and "last access" logic for updating origin access time is + // properly exercised in other stages. + + info("Initializing storage"); + + { + const request = Services.qms.init(); + await QuotaUtils.requestFinished(request); + } + + info("Initializing temporary storage"); + + { + const request = Services.qms.initTemporaryStorage(); + await QuotaUtils.requestFinished(request); + } + + info("Initializing temporary origins"); + + for (const originInfo of originInfos.toReversed()) { + const principal = PrincipalUtils.createPrincipal(originInfo.url); + + const request = Services.qms.initializeTemporaryOrigin( + "default", + principal, + /* aCreateIfNonExistent */ true + ); + await QuotaUtils.requestFinished(request); + + // Wait 40ms to ensure the next origin gets a different access time. Some + // systems have low timer resolution, so this adds a safe buffer. + await new Promise(function (resolve) { + do_timeout(40, resolve); + }); + } + + info("Checking usage"); + + await checkUsage(/* stage */ 1); + + info( + "Stage 2: All origins active; eviction not possible, last write should fail" + ); + + // Opens connections for all origins and writes data to each except the last + // one. Since all origins remain active (open connections), none can be + // evicted, even if storage runs out. This tests that eviction logic respects + // activity status. + + const connections = await (async function () { + let connections = []; + // Stage 1 + for (const originInfo of originInfos) { + const connection = await createAndOpenConnection(originInfo.url); + + connections.push(connection); + } + + return connections; + })(); + + // Write to all but the last origin. + for (const connection of connections.slice(0, -1)) { + const writeRequest = connection.write(dataBuffer); + await SimpleDBUtils.requestFinished(writeRequest); + } + + // Try to write to the last origin. + { + const writeRequest = connections.at(-1).write(dataBuffer); + try { + await SimpleDBUtils.requestFinished(writeRequest); + Assert.ok(false, "Should have thrown"); + } catch (e) { + Assert.ok(true, "Should have thrown"); + Assert.strictEqual( + e.resultCode, + NS_ERROR_FILE_NO_DEVICE_SPACE, + "Threw right result code" + ); + } + } + + await checkUsage(/* stage */ 2); + + info("Stage 3: Inactive origins can be evicted; last origin writes again"); + + // Closes all connections except the first and last origin. This leaves most + // origins inactive, making them eligible for eviction. The last origin + // writes data again, which should now succeed because there is at least one + // inactive origin that can be evicted to make space. + + // Close all connections except the first and the last + for (const connection of connections.slice(1, -1)) { + const closeRequest = connection.close(); + await SimpleDBUtils.requestFinished(closeRequest); + + // Wait 40ms to ensure the next origin gets a different access time. Some + // systems have low timer resolution, so this adds a safe buffer. + await new Promise(function (resolve) { + do_timeout(40, resolve); + }); + } + + // Write to the last origin. + { + const writeRequest = connections.at(-1).write(dataBuffer); + await SimpleDBUtils.requestFinished(writeRequest); + } + + await checkUsage(/* stage */ 3); + + info("Stage 4: Shrink quota by 50%; evict origins by last access time"); + + // Shrinks the temporary storage quota by 50%. This triggers eviction of + // approximately half of the origins based on their last access time. It + // tests that quota reduction correctly respects access time ordering when + // deciding which origins to evict. + + info("Shutting down storage"); + + { + const request = Services.qms.reset(); + await QuotaUtils.requestFinished(request); + } + + info("Setting preferences"); + + { + const prefs = [ + ["dom.quotaManager.temporaryStorage.fixedLimit", storageSizeKB / 2], + ]; + + PrefUtils.setPrefs(prefs); + } + + info("Initializing storage"); + + { + const request = Services.qms.init(); + await QuotaUtils.requestFinished(request); + } + + info("Initializing temporary storage"); + + { + const request = Services.qms.initTemporaryStorage(); + await QuotaUtils.requestFinished(request); + } + + await checkUsage(/* stage */ 4); + + info("Stage 5: Last origin writes more; one more origin should be evicted"); + + // The last origin writes additional data, which should exceed the current + // quota again. This triggers eviction of one more inactive origin, + // validating that eviction continues to respect quota limits and frees up + // space as needed. + + { + const connection = await createAndOpenConnection(originInfos.at(-1).url); + + const seekRequest = connection.seek(dataSize); + await SimpleDBUtils.requestFinished(seekRequest); + + const writeRequest = connection.write(dataBuffer); + await SimpleDBUtils.requestFinished(writeRequest); + } + + await checkUsage(/* stage */ 5); +} + +async function testSteps() { + add_task( + { + pref_set: [ + ["dom.quotaManager.loadQuotaFromCache", false], + ["dom.quotaManager.temporaryStorage.fixedLimit", storageSizeKB], + ["dom.quotaManager.temporaryStorage.updateOriginAccessTime", true], + ], + }, + testTemporaryStorageEviction + ); +} diff --git a/dom/quota/test/xpcshell/xpcshell.toml b/dom/quota/test/xpcshell/xpcshell.toml index e936dcc3671..fa086368040 100644 --- a/dom/quota/test/xpcshell/xpcshell.toml +++ b/dom/quota/test/xpcshell/xpcshell.toml @@ -155,6 +155,8 @@ skip-if = ["inc_origin_init"] ["test_tempMetadataCleanup.js"] +["test_temporaryStorageEviction.js"] + ["test_unaccessedOrigins.js"] ["test_unknownFiles.js"] diff --git a/dom/security/nsCSPUtils.cpp b/dom/security/nsCSPUtils.cpp index 8750dfa730e..62107bb635b 100644 --- a/dom/security/nsCSPUtils.cpp +++ b/dom/security/nsCSPUtils.cpp @@ -415,6 +415,28 @@ CSPDirective CSP_ContentTypeToDirective(nsContentPolicyType aType) { return nsIContentSecurityPolicy::DEFAULT_SRC_DIRECTIVE; } +already_AddRefed CSP_CreateFromHeader(const nsAString& aHeaderValue, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, + ErrorResult& aRv) { + RefPtr csp = new nsCSPContext(); + // Hard code some default values until we have a use case where we can provide + // something else. + // When inheriting from this CSP, these values will be overwritten anyway. + aRv = csp->SetRequestContextWithPrincipal(aLoadingPrincipal, aSelfURI, + /* aReferrer */ ""_ns, + /* aInnerWindowId */ 0); + if (aRv.Failed()) { + return nullptr; + } + + aRv = CSP_AppendCSPFromHeader(csp, aHeaderValue, /* aReportOnly */ false); + if (aRv.Failed()) { + return nullptr; + } + + return csp.forget(); +} + nsCSPHostSrc* CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI) { // Create the host first nsCString host; diff --git a/dom/security/nsCSPUtils.h b/dom/security/nsCSPUtils.h index f66fc083fba..2c5cbda1fbd 100644 --- a/dom/security/nsCSPUtils.h +++ b/dom/security/nsCSPUtils.h @@ -13,6 +13,7 @@ #include "nsString.h" #include "nsTArray.h" #include "nsUnicharUtils.h" +#include "mozilla/ErrorResult.h" class nsIChannel; @@ -193,6 +194,10 @@ nsresult CSP_AppendCSPFromHeader(nsIContentSecurityPolicy* aCsp, /* =============== Helpers ================== */ +already_AddRefed CSP_CreateFromHeader(const nsAString& aHeaderValue, nsIURI* aSelfURI, + nsIPrincipal* aLoadingPrincipal, + mozilla::ErrorResult& aRv); + class nsCSPHostSrc; nsCSPHostSrc* CSP_CreateHostSrcFromSelfURI(nsIURI* aSelfURI); diff --git a/dom/security/nsContentSecurityUtils.cpp b/dom/security/nsContentSecurityUtils.cpp index 75e03fffc79..f8efeed076f 100644 --- a/dom/security/nsContentSecurityUtils.cpp +++ b/dom/security/nsContentSecurityUtils.cpp @@ -1347,6 +1347,7 @@ static nsLiteralCString sImgSrcDataBlobAllowList[] = { "chrome://browser/content/sidebar/sidebar-syncedtabs.html"_ns, "chrome://browser/content/spotlight.html"_ns, "chrome://browser/content/syncedtabs/sidebar.xhtml"_ns, + "chrome://browser/content/webext-panels.xhtml"_ns, "chrome://devtools/content/application/index.html"_ns, "chrome://devtools/content/framework/browser-toolbox/window.html"_ns, "chrome://devtools/content/framework/toolbox-window.xhtml"_ns, diff --git a/dom/security/test/https-first/browser.toml b/dom/security/test/https-first/browser.toml index 7045ddb6803..523f05db419 100644 --- a/dom/security/test/https-first/browser.toml +++ b/dom/security/test/https-first/browser.toml @@ -28,6 +28,7 @@ support-files = ["file_https_rr_no_downgrade.sjs"] skip-if = [ "os == 'mac' && os_version == '10.15'", "os == 'mac' && os_version == '11.20' && arch == 'aarch64'", # Bug 1950553 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt && socketprocess_networking", # Bug 1950553 ] ["browser_https_telemetry.js"] diff --git a/dom/serviceworkers/test/test_serviceworker_interfaces.js b/dom/serviceworkers/test/test_serviceworker_interfaces.js index d49deba7c4f..478fef56842 100644 --- a/dom/serviceworkers/test/test_serviceworker_interfaces.js +++ b/dom/serviceworkers/test/test_serviceworker_interfaces.js @@ -219,85 +219,85 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! "FormData", // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPU", isEarlyBetaOrEarlier: true }, + { name: "GPU", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapter", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapter", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapterInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapterInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroup", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroup", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroupLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroupLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBufferUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUBufferUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCanvasContext", isEarlyBetaOrEarlier: true }, + { name: "GPUCanvasContext", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUColorWrite", isEarlyBetaOrEarlier: true }, + { name: "GPUColorWrite", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationMessage", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationMessage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePipeline", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDevice", isEarlyBetaOrEarlier: true }, + { name: "GPUDevice", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDeviceLostInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUDeviceLostInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUError", isEarlyBetaOrEarlier: true }, + { name: "GPUError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUExternalTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUExternalTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUInternalError", isEarlyBetaOrEarlier: true }, + { name: "GPUInternalError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUMapMode", isEarlyBetaOrEarlier: true }, + { name: "GPUMapMode", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUOutOfMemoryError", isEarlyBetaOrEarlier: true }, + { name: "GPUOutOfMemoryError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineError", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQuerySet", isEarlyBetaOrEarlier: true }, + { name: "GPUQuerySet", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQueue", isEarlyBetaOrEarlier: true }, + { name: "GPUQueue", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundle", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundle", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundleEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundleEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPipeline", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSampler", isEarlyBetaOrEarlier: true }, + { name: "GPUSampler", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderModule", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderModule", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderStage", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderStage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedFeatures", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedLimits", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedLimits", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureView", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureView", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUUncapturedErrorEvent", isEarlyBetaOrEarlier: true }, + { name: "GPUUncapturedErrorEvent", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUValidationError", isEarlyBetaOrEarlier: true }, + { name: "GPUValidationError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! "Headers", // IMPORTANT: Do not change this list without review from a DOM peer! @@ -495,7 +495,7 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! "WindowClient", // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "WGSLLanguageFeatures", isEarlyBetaOrEarlier: true }, + { name: "WGSLLanguageFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! "WorkerGlobalScope", // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/svg/DOMSVGLength.cpp b/dom/svg/DOMSVGLength.cpp index 9aecb648dd0..cc3fbf9fb6b 100644 --- a/dom/svg/DOMSVGLength.cpp +++ b/dom/svg/DOMSVGLength.cpp @@ -51,6 +51,7 @@ DOMSVGLength::DOMSVGLength(DOMSVGLengthList* aList, uint8_t aAttrEnum, mListIndex(aListIndex), mAttrEnum(aAttrEnum), mIsAnimValItem(aIsAnimValItem), + mIsInTearoffTable(false), mUnit(SVGLength_Binding::SVG_LENGTHTYPE_NUMBER) { MOZ_ASSERT(aList, "bad arg"); MOZ_ASSERT(mAttrEnum == aAttrEnum, "bitfield too small"); @@ -63,6 +64,7 @@ DOMSVGLength::DOMSVGLength() mListIndex(0), mAttrEnum(0), mIsAnimValItem(false), + mIsInTearoffTable(false), mUnit(SVGLength_Binding::SVG_LENGTHTYPE_NUMBER) {} DOMSVGLength::DOMSVGLength(SVGAnimatedLength* aVal, SVGElement* aSVGElement, @@ -71,6 +73,7 @@ DOMSVGLength::DOMSVGLength(SVGAnimatedLength* aVal, SVGElement* aSVGElement, mListIndex(0), mAttrEnum(aVal->mAttrEnum), mIsAnimValItem(aAnimVal), + mIsInTearoffTable(false), mUnit(SVGLength_Binding::SVG_LENGTHTYPE_NUMBER) { MOZ_ASSERT(aVal, "bad arg"); MOZ_ASSERT(mAttrEnum == aVal->mAttrEnum, "bitfield too small"); @@ -88,22 +91,33 @@ void DOMSVGLength::CleanupWeakRefs() { // Similarly, we must update the tearoff table to remove its (non-owning) // pointer to mVal. - if (nsCOMPtr svg = do_QueryInterface(mOwner)) { - auto& table = mIsAnimValItem ? sAnimSVGLengthTearOffTable - : sBaseSVGLengthTearOffTable; - table.RemoveTearoff(svg->GetAnimatedLength(mAttrEnum)); + if (mIsInTearoffTable) { + nsCOMPtr svg = do_QueryInterface(mOwner); + MOZ_ASSERT(svg, + "We need our svgElement reference in order to remove " + "ourselves from tearoff table..."); + if (MOZ_LIKELY(svg)) { + auto& table = mIsAnimValItem ? sAnimSVGLengthTearOffTable + : sBaseSVGLengthTearOffTable; + table.RemoveTearoff(svg->GetAnimatedLength(mAttrEnum)); + mIsInTearoffTable = false; + } } } already_AddRefed DOMSVGLength::GetTearOff(SVGAnimatedLength* aVal, SVGElement* aSVGElement, bool aAnimVal) { + MOZ_ASSERT(aVal && aSVGElement, "Expecting non-null aVal and aSVGElement"); + MOZ_ASSERT(aVal == aSVGElement->GetAnimatedLength(aVal->mAttrEnum), + "Mismatched aVal/SVGElement?"); auto& table = aAnimVal ? sAnimSVGLengthTearOffTable : sBaseSVGLengthTearOffTable; RefPtr domLength = table.GetTearoff(aVal); if (!domLength) { domLength = new DOMSVGLength(aVal, aSVGElement, aAnimVal); table.AddTearoff(aVal, domLength); + domLength->mIsInTearoffTable = true; } return domLength.forget(); diff --git a/dom/svg/DOMSVGLength.h b/dom/svg/DOMSVGLength.h index 9dc6096c654..07dad37e817 100644 --- a/dom/svg/DOMSVGLength.h +++ b/dom/svg/DOMSVGLength.h @@ -15,7 +15,7 @@ #include "mozilla/Attributes.h" #include "nsWrapperCache.h" -#define MOZ_SVG_LIST_INDEX_BIT_COUNT 22 // supports > 4 million list items +#define MOZ_SVG_LIST_INDEX_BIT_COUNT 21 // supports > 2 million list items namespace mozilla { @@ -204,6 +204,13 @@ class DOMSVGLength final : public nsWrapperCache { uint32_t mAttrEnum : 4; // supports up to 16 attributes uint32_t mIsAnimValItem : 1; + // Tracks whether we're in the tearoff table. Initialized to false in the + // ctor, but then immediately set to true after we're added to the table + // (unless we're an instance created via 'Copy()'; those never get added to + // the table). Updated to false when we're removed from the table (at which + // point we're being destructed or soon-to-be destructed). + uint32_t mIsInTearoffTable : 1; + // The following members are only used when we're not in a list: uint32_t mUnit : 5; // can handle 31 units (the 10 SVG 1.1 units + rem, vw, // vh, wm, calc + future additions) diff --git a/dom/svg/DOMSVGPoint.cpp b/dom/svg/DOMSVGPoint.cpp index 81be75a03b4..f3743941311 100644 --- a/dom/svg/DOMSVGPoint.cpp +++ b/dom/svg/DOMSVGPoint.cpp @@ -168,6 +168,7 @@ already_AddRefed DOMSVGPoint::GetTranslateTearOff( if (!domPoint) { domPoint = new DOMSVGPoint(aVal, aSVGSVGElement); sSVGTranslateTearOffTable.AddTearoff(aVal, domPoint); + domPoint->mIsInTearoffTable = true; } return domPoint.forget(); @@ -204,12 +205,18 @@ void DOMSVGPoint::CleanupWeakRefs() { pointList->mItems[mListIndex] = nullptr; } + if (mIsInTearoffTable) { + // Similarly, we must update the tearoff table to remove its (non-owning) + // pointer to mVal. + MOZ_ASSERT(mVal && mIsTranslatePoint, + "Tearoff table should only be used for translate-point objects " + "with non-null mVal (see GetTranslateTearOff and its callers)"); + sSVGTranslateTearOffTable.RemoveTearoff(mVal); + mIsInTearoffTable = false; + } + if (mVal) { - if (mIsTranslatePoint) { - // Similarly, we must update the tearoff table to remove its (non-owning) - // pointer to mVal. - sSVGTranslateTearOffTable.RemoveTearoff(mVal); - } else { + if (!mIsTranslatePoint) { // In this case we own mVal delete mVal; } diff --git a/dom/svg/DOMSVGPoint.h b/dom/svg/DOMSVGPoint.h index eeea3d3075d..f36dbc9550d 100644 --- a/dom/svg/DOMSVGPoint.h +++ b/dom/svg/DOMSVGPoint.h @@ -17,7 +17,7 @@ #include "mozilla/dom/SVGSVGElement.h" #include "mozilla/gfx/2D.h" -#define MOZ_SVG_LIST_INDEX_BIT_COUNT 30 +#define MOZ_SVG_LIST_INDEX_BIT_COUNT 29 namespace mozilla::dom { struct DOMMatrix2DInit; @@ -51,7 +51,8 @@ class DOMSVGPoint final : public nsWrapperCache { mOwner(aList), mListIndex(aListIndex), mIsAnimValItem(aIsAnimValItem), - mIsTranslatePoint(false) { + mIsTranslatePoint(false), + mIsInTearoffTable(false) { // These shifts are in sync with the members. MOZ_ASSERT(aList && aListIndex <= MaxListIndex(), "bad arg"); @@ -60,7 +61,10 @@ class DOMSVGPoint final : public nsWrapperCache { // Constructor for unowned points and SVGSVGElement.createSVGPoint explicit DOMSVGPoint(const Point& aPt) - : mListIndex(0), mIsAnimValItem(false), mIsTranslatePoint(false) { + : mListIndex(0), + mIsAnimValItem(false), + mIsTranslatePoint(false), + mIsInTearoffTable(false) { // In this case we own mVal mVal = new SVGPoint(aPt.x, aPt.y); } @@ -72,7 +76,8 @@ class DOMSVGPoint final : public nsWrapperCache { mOwner(ToSupports(aSVGSVGElement)), mListIndex(0), mIsAnimValItem(false), - mIsTranslatePoint(true) {} + mIsTranslatePoint(true), + mIsInTearoffTable(false) {} virtual ~DOMSVGPoint() { CleanupWeakRefs(); } @@ -178,6 +183,12 @@ class DOMSVGPoint final : public nsWrapperCache { uint32_t mListIndex : MOZ_SVG_LIST_INDEX_BIT_COUNT; uint32_t mIsAnimValItem : 1; // True if We're the animated value of a list uint32_t mIsTranslatePoint : 1; // true iff our owner is a SVGSVGElement + + // Tracks whether we're in the tearoff table. Initialized to false in the + // ctor, but then immediately set to true if/when we're added to the table + // (not all instances are). Updated to false when we're removed from the + // table (at which point we're being destructed or soon-to-be destructed). + uint32_t mIsInTearoffTable : 1; }; } // namespace mozilla::dom diff --git a/dom/svg/DOMSVGPointList.cpp b/dom/svg/DOMSVGPointList.cpp index a9153998a1e..6e820ae1ae1 100644 --- a/dom/svg/DOMSVGPointList.cpp +++ b/dom/svg/DOMSVGPointList.cpp @@ -90,9 +90,12 @@ void DOMSVGPointList::RemoveFromTearoffTable() { // // There are now no longer any references to us held by script or list items. // Note we must use GetAnimValKey/GetBaseValKey here, NOT InternalList()! - void* key = mIsAnimValList ? InternalAList().GetAnimValKey() - : InternalAList().GetBaseValKey(); - SVGPointListTearoffTable().RemoveTearoff(key); + if (mIsInTearoffTable) { + void* key = mIsAnimValList ? InternalAList().GetAnimValKey() + : InternalAList().GetBaseValKey(); + SVGPointListTearoffTable().RemoveTearoff(key); + mIsInTearoffTable = false; + } } DOMSVGPointList::~DOMSVGPointList() { RemoveFromTearoffTable(); } diff --git a/dom/svg/DOMSVGPointList.h b/dom/svg/DOMSVGPointList.h index af35f25270a..5961d0d8114 100644 --- a/dom/svg/DOMSVGPointList.h +++ b/dom/svg/DOMSVGPointList.h @@ -245,6 +245,12 @@ class DOMSVGPointList final : public nsISupports, public nsWrapperCache { RefPtr mElement; bool mIsAnimValList; + + // Tracks whether we're in the tearoff table. Initialized to true, since all + // new instances are added to the table right after construction. Updated to + // false when we're removed from the table (at which point we're being + // destructed or soon-to-be destructed). + bool mIsInTearoffTable = true; }; NS_DEFINE_STATIC_IID_ACCESSOR(DOMSVGPointList, MOZILLA_DOMSVGPOINTLIST_IID) diff --git a/dom/svg/DOMSVGStringList.cpp b/dom/svg/DOMSVGStringList.cpp index 89484427415..e49218d94cd 100644 --- a/dom/svg/DOMSVGStringList.cpp +++ b/dom/svg/DOMSVGStringList.cpp @@ -91,7 +91,10 @@ already_AddRefed DOMSVGStringList::GetDOMWrapper( void DOMSVGStringList::RemoveFromTearoffTable() { // Script no longer has any references to us. - SVGStringListTearoffTable().RemoveTearoff(&InternalList()); + if (mIsInTearoffTable) { + SVGStringListTearoffTable().RemoveTearoff(&InternalList()); + mIsInTearoffTable = false; + } } DOMSVGStringList::~DOMSVGStringList() { RemoveFromTearoffTable(); } diff --git a/dom/svg/DOMSVGStringList.h b/dom/svg/DOMSVGStringList.h index 5c05294d479..6b43220ec04 100644 --- a/dom/svg/DOMSVGStringList.h +++ b/dom/svg/DOMSVGStringList.h @@ -108,6 +108,12 @@ class DOMSVGStringList final : public nsISupports, public nsWrapperCache { uint8_t mAttrEnum; bool mIsConditionalProcessingAttribute; + + // Tracks whether we're in the tearoff table. Initialized to true, since all + // new instances are added to the table right after construction. Updated to + // false when we're removed from the table (at which point we're being + // destructed or soon-to-be destructed). + bool mIsInTearoffTable = true; }; } // namespace dom diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js index 0f27602f62b..d58160eff80 100644 --- a/dom/tests/mochitest/general/test_interfaces.js +++ b/dom/tests/mochitest/general/test_interfaces.js @@ -504,85 +504,85 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "GeolocationPositionError", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPU", isEarlyBetaOrEarlier: true }, + { name: "GPU", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapter", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapter", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapterInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapterInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroup", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroup", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroupLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroupLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBufferUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUBufferUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCanvasContext", isEarlyBetaOrEarlier: true }, + { name: "GPUCanvasContext", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUColorWrite", isEarlyBetaOrEarlier: true }, + { name: "GPUColorWrite", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationMessage", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationMessage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePipeline", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDevice", isEarlyBetaOrEarlier: true }, + { name: "GPUDevice", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDeviceLostInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUDeviceLostInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUError", isEarlyBetaOrEarlier: true }, + { name: "GPUError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUExternalTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUExternalTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUInternalError", isEarlyBetaOrEarlier: true }, + { name: "GPUInternalError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUMapMode", isEarlyBetaOrEarlier: true }, + { name: "GPUMapMode", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUOutOfMemoryError", isEarlyBetaOrEarlier: true }, + { name: "GPUOutOfMemoryError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineError", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQuerySet", isEarlyBetaOrEarlier: true }, + { name: "GPUQuerySet", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQueue", isEarlyBetaOrEarlier: true }, + { name: "GPUQueue", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundle", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundle", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundleEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundleEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPipeline", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSampler", isEarlyBetaOrEarlier: true }, + { name: "GPUSampler", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderModule", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderModule", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderStage", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderStage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedFeatures", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedLimits", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedLimits", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureView", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureView", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUUncapturedErrorEvent", isEarlyBetaOrEarlier: true }, + { name: "GPUUncapturedErrorEvent", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUValidationError", isEarlyBetaOrEarlier: true }, + { name: "GPUValidationError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "HashChangeEvent", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! @@ -1551,7 +1551,7 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Window", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "WGSLLanguageFeatures", isEarlyBetaOrEarlier: true }, + { name: "WGSLLanguageFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Worker", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/view-transitions/ViewTransition.cpp b/dom/view-transitions/ViewTransition.cpp index 1b238df22c4..1f9e75d4e29 100644 --- a/dom/view-transitions/ViewTransition.cpp +++ b/dom/view-transitions/ViewTransition.cpp @@ -66,6 +66,11 @@ static CSSToCSSMatrix4x4Flagged EffectiveTransform(nsIFrame* aFrame) { float sy = boundingRect.height / untransformedSize.height; matrix = CSSToCSSMatrix4x4Flagged::Scaling(sx, sy, 0.0f); } + auto inkOverflowOffset = aFrame->InkOverflowRectRelativeToSelf().TopLeft(); + if (inkOverflowOffset != nsPoint()) { + auto cssOffset = CSSPoint::FromAppUnits(inkOverflowOffset); + matrix.PostTranslate(cssOffset.x, cssOffset.y, 0.0f); + } if (boundingRect.TopLeft() != CSSPoint()) { matrix.PostTranslate(boundingRect.x, boundingRect.y, 0.0f); } @@ -190,7 +195,7 @@ struct CapturedElementOldState { mTriedImage(true), mSize(aFrame->Style()->IsRootElementStyle() ? aSnapshotContainingBlockSize - : aFrame->GetRect().Size()), + : aFrame->InkOverflowRect().Size()), mTransform(EffectiveTransform(aFrame)), mWritingMode(aFrame->StyleVisibility()->mWritingMode), mDirection(aFrame->StyleVisibility()->mDirection), @@ -825,9 +830,12 @@ bool ViewTransition::UpdatePseudoElementStyles(bool aNeedsInvalidation) { auto* rule = EnsureRule(capturedElement.mGroupRule); // Let newRect be snapshot containing block if capturedElement is the // document element, otherwise, capturedElement’s border box. + // NOTE: Needs ink overflow rect instead to get the correct rendering, see + // https://github.com/w3c/csswg-drafts/issues/12092. + // TODO(emilio, bug 1961139): Maybe revisit this. auto newRect = frame->Style()->IsRootElementStyle() ? SnapshotContainingBlockRect() - : frame->GetRect(); + : frame->InkOverflowRectRelativeToSelf(); auto size = CSSPixel::FromAppUnits(newRect); // NOTE(emilio): Intentionally not short-circuiting. Int cast is needed to // silence warning. diff --git a/dom/webgpu/moz.build b/dom/webgpu/moz.build index 2f81e59df40..76e1a72d4fc 100644 --- a/dom/webgpu/moz.build +++ b/dom/webgpu/moz.build @@ -8,10 +8,10 @@ with Files("**"): BUG_COMPONENT = ("Core", "Graphics: WebGPU") MOCHITEST_MANIFESTS += [ - "mochitest/mochitest-no-pref.toml", - "mochitest/mochitest-resistfingerprinting.toml", - "mochitest/mochitest.toml", - "mochitest/perftest.toml", + "tests/mochitest/mochitest-no-pref.toml", + "tests/mochitest/mochitest-resistfingerprinting.toml", + "tests/mochitest/mochitest.toml", + "tests/mochitest/perftest.toml", ] DIRS += [] diff --git a/dom/webgpu/tests/cts/vendor/Cargo.lock b/dom/webgpu/tests/cts/vendor/Cargo.lock index e41aab35036..901b4a003d4 100644 --- a/dom/webgpu/tests/cts/vendor/Cargo.lock +++ b/dom/webgpu/tests/cts/vendor/Cargo.lock @@ -286,6 +286,12 @@ dependencies = [ "either", ] +[[package]] +name = "joinery" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d8bde02bbf44a562cf068a8ff4a68842df387e302a03a4de4a57fcf82ec377" + [[package]] name = "libc" version = "0.2.171" @@ -688,6 +694,7 @@ dependencies = [ "ezcmd", "format", "itertools", + "joinery", "log", "miette", "regex", diff --git a/dom/webgpu/tests/cts/vendor/Cargo.toml b/dom/webgpu/tests/cts/vendor/Cargo.toml index 30a69839b64..9695c77061f 100644 --- a/dom/webgpu/tests/cts/vendor/Cargo.toml +++ b/dom/webgpu/tests/cts/vendor/Cargo.toml @@ -10,6 +10,7 @@ env_logger = "0.10.0" ezcmd = "0.3.0" format = "0.2.4" itertools = "0.11.0" +joinery = "3.1.0" log = "0.4.17" miette = { version = "7.5.0", features = ["fancy"] } regex = "1.7.1" diff --git a/dom/webgpu/tests/cts/vendor/src/main.rs b/dom/webgpu/tests/cts/vendor/src/main.rs index 0663cf35715..6542d2889e0 100644 --- a/dom/webgpu/tests/cts/vendor/src/main.rs +++ b/dom/webgpu/tests/cts/vendor/src/main.rs @@ -3,12 +3,13 @@ use std::{ collections::{BTreeMap, BTreeSet}, env::set_current_dir, path::PathBuf, - process::ExitCode, + process::{ExitCode, Stdio}, }; use clap::Parser; use ezcmd::EasyCommand; use itertools::Itertools; +use joinery::JoinableIterator; use miette::{ensure, miette, Context, Diagnostic, IntoDiagnostic, Report, SourceSpan}; use regex::Regex; @@ -19,6 +20,7 @@ use crate::{ mod fs; mod process; +mod test_split; /// Vendor WebGPU CTS tests from a local Git checkout of [our `gpuweb/cts` fork]. /// @@ -57,6 +59,8 @@ fn run(args: CliArgs) -> miette::Result<()> { let npm_bin = which("npm", "NPM binary")?; + let node_bin = which("node", "Node.js binary")?; + set_current_dir(&*cts_ckt) .into_diagnostic() .wrap_err("failed to change working directory to CTS checkout")?; @@ -260,6 +264,54 @@ fn run(args: CliArgs) -> miette::Result<()> { log::info!(" …found {} test cases", cts_cases.len()); } + let test_listing_buf; + let mut tests_to_split = { + log::info!("generating index of tests to split…"); + + let test_split_config = { + use test_split::*; + [( + "webgpu:api,operation,command_buffer,image_copy:mip_levels", + Config { + new_sibling_basename: "image_copy__mip_levels", + split_by: SplitBy::first_param( + "initMethod", + SplitParamsTo::SeparateTestsInSameFile, + ), + }, + )] + }; + + let mut tests_to_split = test_split_config + .into_iter() + .map(|(test_path, config)| (test_path, test_split::Entry::from_config(config))) + .collect::>(); + + let mut cmd = EasyCommand::new_with(&node_bin, |cmd| { + cmd.args(["tools/run_node", "--list", "webgpu:*"]) + .stderr(Stdio::inherit()) + }); + log::info!(" requesting exhaustive list of tests using {cmd}…"); + test_listing_buf = { + let stdout = cmd.output().into_diagnostic()?.stdout; + String::from_utf8(stdout) + .into_diagnostic() + .context("failed to read output of exhaustive test listing command")? + }; + + log::info!(" building index from list of tests…"); + for full_path in test_listing_buf.lines() { + let (subtest_path, params) = split_at_nth_colon(2, full_path) + .wrap_err_with(|| "failed to parse configured split entry")?; + if let Some(entry) = tests_to_split.get_mut(subtest_path) { + entry.process_listing_line(params)?; + } + } + test_split::assert_seen(tests_to_split.iter(), |seen| &seen.listing); + + tests_to_split + }; + cts_ckt.regen_dir(out_wpt_dir.join("cts"), |cts_tests_dir| { log::info!("re-distributing tests into single file per test path…"); let mut failed_writing = false; @@ -303,11 +355,50 @@ fn run(args: CliArgs) -> miette::Result<()> { } }; let (test_group_path, _test_name) = test_path.rsplit_once(':').unwrap(); + let test_group_path_components = test_group_path.split([':', ',']); - let slashed = test_group_path.replace([':', ','], "/"); - insert!(&slashed, meta.into()); + if let Some(entry) = tests_to_split.get_mut(test_path) { + let test_split::Entry { seen, ref config } = entry; + let test_split::Config { + new_sibling_basename, + split_by, + } = config; + + let file_path = test_group_path_components + .chain([*new_sibling_basename]) + .join_with("/") + .to_string(); + + seen.wpt_files = true; + + match split_by { + test_split::SplitBy::FirstParam { + expected_name, + split_to, + observed_values, + } => match split_to { + test_split::SplitParamsTo::SeparateTestsInSameFile => { + for value in observed_values { + let new_meta = meta.replace( + &*path, + &format!("{test_path}:{expected_name}={value};*"), + ); + assert_ne!(meta, new_meta); + insert!(&file_path, new_meta.into()); + } + } + }, + } + } else { + insert!( + &test_group_path_components.join_with("/").to_string(), + meta.into() + ) + }; } + test_split::assert_seen(tests_to_split.iter(), |seen| &seen.wpt_files); + struct WptEntry<'a> { cases: BTreeSet>, timeout_length: TimeoutLength, diff --git a/dom/webgpu/tests/cts/vendor/src/test_split.rs b/dom/webgpu/tests/cts/vendor/src/test_split.rs new file mode 100644 index 00000000000..772560690c1 --- /dev/null +++ b/dom/webgpu/tests/cts/vendor/src/test_split.rs @@ -0,0 +1,202 @@ +//! Functionality for splitting CTS tests at certain paths into more tests and files in +//! [`crate::main`]. + +use std::collections::BTreeSet; + +/// The value portion of a key-value pair used in [`crate::main`] to split tests into more tests or +/// files. +#[derive(Debug)] +pub(crate) struct Config { + /// The new base name used for the sibling directory that this entry will split off from the + /// original CTS test. + /// + /// Chunking WPT tests happens at a directory level in Firefox's CI. If we split into a child + /// directory, instead of a sibling directory, then we would actually cause the child test to + /// be run in multiple chunks. Therefore, it's required to split tests into siblings. + pub new_sibling_basename: &'static str, + /// How to split the test this entry refers to. + pub split_by: SplitBy, +} + +impl Config { + pub fn map_observed_values(self, f: impl FnOnce(O) -> T) -> Config { + let Self { + new_sibling_basename, + split_by, + } = self; + Config { + new_sibling_basename, + split_by: split_by.map_observed_values(f), + } + } +} + +/// A [`Config::split_by`] value. +#[derive(Debug)] +pub(crate) enum SplitBy { + FirstParam { + /// The name of the first parameter in the test, to be used as validation that we are + /// actually pointing to the correct test. + expected_name: &'static str, + /// The method by which a test should be divided. + split_to: SplitParamsTo, + /// Values collected during [`Entry::process`], corresponding to a new test entry each. + observed_values: O, + }, +} + +impl SplitBy<()> { + /// Convenience for constructing [`SplitBy::FirstParam`]. + pub fn first_param(name: &'static str, split_to: SplitParamsTo) -> Self { + Self::FirstParam { + expected_name: name, + split_to, + observed_values: (), + } + } +} + +impl SplitBy { + pub fn map_observed_values(self, f: impl FnOnce(O) -> T) -> SplitBy { + match self { + Self::FirstParam { + expected_name, + split_to, + observed_values, + } => { + let observed_values = f(observed_values); + SplitBy::FirstParam { + expected_name, + split_to, + observed_values, + } + } + } + } +} + +/// A [SplitBy::FirstParam::split_to]. +#[derive(Debug)] +pub(crate) enum SplitParamsTo { + /// Place new test entries as siblings in the same file. + SeparateTestsInSameFile, +} + +#[derive(Debug)] +pub(crate) struct Entry<'a> { + /// Whether this + pub seen: SeenIn, + pub config: Config>, +} + +impl Entry<'_> { + pub fn from_config(config: Config<()>) -> Self { + Self { + seen: SeenIn::nowhere(), + config: config.map_observed_values(|()| BTreeSet::new()), + } + } +} + +/// An [`Entry::seen`]. +#[derive(Debug, Default)] +pub(crate) struct SeenIn { + pub listing: bool, + pub wpt_files: bool, +} + +impl SeenIn { + /// Default value: all seen locations set to `false`. + pub fn nowhere() -> Self { + Self::default() + } +} + +impl<'a> Entry<'a> { + /// Accumulates a line from the test listing script in upstream CTS. + /// + /// Line is expected to have a full CTS test path, including at least one case parameter, i.e.: + /// + /// ``` + /// webgpu:path,to,test,group:test:param1="value1";… + /// ``` + /// + /// Note that `;…` is not strictly necessary, when there is only a single case parameter for + /// the test. + /// + /// See [`crate::main`] for more details on how upstream CTS' listing script is invoked. + pub(crate) fn process_listing_line( + &mut self, + test_group_and_later_path: &'a str, + ) -> miette::Result<()> { + let rest = test_group_and_later_path; + + let Self { seen, config } = self; + + let Config { + new_sibling_basename: _, + split_by, + } = config; + + match split_by { + SplitBy::FirstParam { + ref expected_name, + split_to: _, + observed_values, + } => { + // NOTE: This only parses strings with no escaped characters. We may need different + // values later, at which point we'll have to consider what to do here. + let (ident, rest) = rest.split_once("=").ok_or_else(|| { + miette::diagnostic!("failed to get start of value of first arg") + })?; + + if ident != *expected_name { + return Err(miette::diagnostic!( + "expected {:?}, got {:?}", + expected_name, + ident + ) + .into()); + } + + let value = rest + .split_once(';') + .map(|(value, _rest)| value) + .unwrap_or(rest); + + // TODO: parse as JSON? + + observed_values.insert(value); + } + } + seen.listing = true; + + Ok(()) + } +} + +/// Iterate over `entries`' [`seen` members](Entry::seen), accumulating one of their fields and +/// panicking if any are `false` +/// +/// Used in [`crate::main`] to check that a specific [`Entry::seen`] fields have been set to `true` +/// for each entry configured. +pub(crate) fn assert_seen<'a>( + entries: impl Iterator)>, + mut in_: impl FnMut(&'a SeenIn) -> &'a bool, +) { + let mut unseen = Vec::new(); + entries.for_each(|(test_path, entry)| { + if !*in_(&entry.seen) { + unseen.push(test_path); + } + }); + if !unseen.is_empty() { + panic!( + concat!( + "did not find the following test split config. entries ", + "in test listing output: {:#?}", + ), + unseen + ); + } +} diff --git a/dom/webgpu/mochitest/mochitest-no-pref.toml b/dom/webgpu/tests/mochitest/mochitest-no-pref.toml similarity index 100% rename from dom/webgpu/mochitest/mochitest-no-pref.toml rename to dom/webgpu/tests/mochitest/mochitest-no-pref.toml diff --git a/dom/webgpu/mochitest/mochitest-resistfingerprinting.toml b/dom/webgpu/tests/mochitest/mochitest-resistfingerprinting.toml similarity index 100% rename from dom/webgpu/mochitest/mochitest-resistfingerprinting.toml rename to dom/webgpu/tests/mochitest/mochitest-resistfingerprinting.toml diff --git a/dom/webgpu/mochitest/mochitest.toml b/dom/webgpu/tests/mochitest/mochitest.toml similarity index 100% rename from dom/webgpu/mochitest/mochitest.toml rename to dom/webgpu/tests/mochitest/mochitest.toml diff --git a/dom/webgpu/mochitest/perftest.toml b/dom/webgpu/tests/mochitest/perftest.toml similarity index 100% rename from dom/webgpu/mochitest/perftest.toml rename to dom/webgpu/tests/mochitest/perftest.toml diff --git a/dom/webgpu/mochitest/test_basic_canvas.worker.html b/dom/webgpu/tests/mochitest/test_basic_canvas.worker.html similarity index 100% rename from dom/webgpu/mochitest/test_basic_canvas.worker.html rename to dom/webgpu/tests/mochitest/test_basic_canvas.worker.html diff --git a/dom/webgpu/mochitest/test_basic_canvas.worker.js b/dom/webgpu/tests/mochitest/test_basic_canvas.worker.js similarity index 100% rename from dom/webgpu/mochitest/test_basic_canvas.worker.js rename to dom/webgpu/tests/mochitest/test_basic_canvas.worker.js diff --git a/dom/webgpu/mochitest/test_buffer_mapping.html b/dom/webgpu/tests/mochitest/test_buffer_mapping.html similarity index 100% rename from dom/webgpu/mochitest/test_buffer_mapping.html rename to dom/webgpu/tests/mochitest/test_buffer_mapping.html diff --git a/dom/webgpu/mochitest/test_buffer_mapping_invalid_device.html b/dom/webgpu/tests/mochitest/test_buffer_mapping_invalid_device.html similarity index 100% rename from dom/webgpu/mochitest/test_buffer_mapping_invalid_device.html rename to dom/webgpu/tests/mochitest/test_buffer_mapping_invalid_device.html diff --git a/dom/webgpu/mochitest/test_buffer_mapping_overlapping_views.html b/dom/webgpu/tests/mochitest/test_buffer_mapping_overlapping_views.html similarity index 100% rename from dom/webgpu/mochitest/test_buffer_mapping_overlapping_views.html rename to dom/webgpu/tests/mochitest/test_buffer_mapping_overlapping_views.html diff --git a/dom/webgpu/mochitest/test_command_buffer_creation.html b/dom/webgpu/tests/mochitest/test_command_buffer_creation.html similarity index 100% rename from dom/webgpu/mochitest/test_command_buffer_creation.html rename to dom/webgpu/tests/mochitest/test_command_buffer_creation.html diff --git a/dom/webgpu/mochitest/test_compilation_message_pos.html b/dom/webgpu/tests/mochitest/test_compilation_message_pos.html similarity index 100% rename from dom/webgpu/mochitest/test_compilation_message_pos.html rename to dom/webgpu/tests/mochitest/test_compilation_message_pos.html diff --git a/dom/webgpu/mochitest/test_context_configure.html b/dom/webgpu/tests/mochitest/test_context_configure.html similarity index 100% rename from dom/webgpu/mochitest/test_context_configure.html rename to dom/webgpu/tests/mochitest/test_context_configure.html diff --git a/dom/webgpu/mochitest/test_core_features_and_limits.html b/dom/webgpu/tests/mochitest/test_core_features_and_limits.html similarity index 100% rename from dom/webgpu/mochitest/test_core_features_and_limits.html rename to dom/webgpu/tests/mochitest/test_core_features_and_limits.html diff --git a/dom/webgpu/mochitest/test_device_creation.html b/dom/webgpu/tests/mochitest/test_device_creation.html similarity index 100% rename from dom/webgpu/mochitest/test_device_creation.html rename to dom/webgpu/tests/mochitest/test_device_creation.html diff --git a/dom/webgpu/mochitest/test_device_lost.html b/dom/webgpu/tests/mochitest/test_device_lost.html similarity index 100% rename from dom/webgpu/mochitest/test_device_lost.html rename to dom/webgpu/tests/mochitest/test_device_lost.html diff --git a/dom/webgpu/mochitest/test_disabled.html b/dom/webgpu/tests/mochitest/test_disabled.html similarity index 100% rename from dom/webgpu/mochitest/test_disabled.html rename to dom/webgpu/tests/mochitest/test_disabled.html diff --git a/dom/webgpu/mochitest/test_double_encoder_finish.html b/dom/webgpu/tests/mochitest/test_double_encoder_finish.html similarity index 100% rename from dom/webgpu/mochitest/test_double_encoder_finish.html rename to dom/webgpu/tests/mochitest/test_double_encoder_finish.html diff --git a/dom/webgpu/mochitest/test_enabled.html b/dom/webgpu/tests/mochitest/test_enabled.html similarity index 100% rename from dom/webgpu/mochitest/test_enabled.html rename to dom/webgpu/tests/mochitest/test_enabled.html diff --git a/dom/webgpu/mochitest/test_encoder_cycle_collection.html b/dom/webgpu/tests/mochitest/test_encoder_cycle_collection.html similarity index 100% rename from dom/webgpu/mochitest/test_encoder_cycle_collection.html rename to dom/webgpu/tests/mochitest/test_encoder_cycle_collection.html diff --git a/dom/webgpu/mochitest/test_error_scope.html b/dom/webgpu/tests/mochitest/test_error_scope.html similarity index 100% rename from dom/webgpu/mochitest/test_error_scope.html rename to dom/webgpu/tests/mochitest/test_error_scope.html diff --git a/dom/webgpu/mochitest/test_insecure_context.html b/dom/webgpu/tests/mochitest/test_insecure_context.html similarity index 100% rename from dom/webgpu/mochitest/test_insecure_context.html rename to dom/webgpu/tests/mochitest/test_insecure_context.html diff --git a/dom/webgpu/mochitest/test_navigator_gpu_not_replaceable.html b/dom/webgpu/tests/mochitest/test_navigator_gpu_not_replaceable.html similarity index 100% rename from dom/webgpu/mochitest/test_navigator_gpu_not_replaceable.html rename to dom/webgpu/tests/mochitest/test_navigator_gpu_not_replaceable.html diff --git a/dom/webgpu/mochitest/test_queue_copyExternalImageToTexture.html b/dom/webgpu/tests/mochitest/test_queue_copyExternalImageToTexture.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_copyExternalImageToTexture.html rename to dom/webgpu/tests/mochitest/test_queue_copyExternalImageToTexture.html diff --git a/dom/webgpu/mochitest/test_queue_write.html b/dom/webgpu/tests/mochitest/test_queue_write.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_write.html rename to dom/webgpu/tests/mochitest/test_queue_write.html diff --git a/dom/webgpu/mochitest/test_queue_write_invalid_device.html b/dom/webgpu/tests/mochitest/test_queue_write_invalid_device.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_write_invalid_device.html rename to dom/webgpu/tests/mochitest/test_queue_write_invalid_device.html diff --git a/dom/webgpu/mochitest/test_queue_write_perf.html b/dom/webgpu/tests/mochitest/test_queue_write_perf.html similarity index 100% rename from dom/webgpu/mochitest/test_queue_write_perf.html rename to dom/webgpu/tests/mochitest/test_queue_write_perf.html diff --git a/dom/webgpu/mochitest/test_rfp_clamp_limits_off.html b/dom/webgpu/tests/mochitest/test_rfp_clamp_limits_off.html similarity index 100% rename from dom/webgpu/mochitest/test_rfp_clamp_limits_off.html rename to dom/webgpu/tests/mochitest/test_rfp_clamp_limits_off.html diff --git a/dom/webgpu/mochitest/test_rfp_clamp_limits_on.html b/dom/webgpu/tests/mochitest/test_rfp_clamp_limits_on.html similarity index 100% rename from dom/webgpu/mochitest/test_rfp_clamp_limits_on.html rename to dom/webgpu/tests/mochitest/test_rfp_clamp_limits_on.html diff --git a/dom/webgpu/mochitest/test_set_bind_group_null.html b/dom/webgpu/tests/mochitest/test_set_bind_group_null.html similarity index 100% rename from dom/webgpu/mochitest/test_set_bind_group_null.html rename to dom/webgpu/tests/mochitest/test_set_bind_group_null.html diff --git a/dom/webgpu/mochitest/test_shared_array_buffer.html b/dom/webgpu/tests/mochitest/test_shared_array_buffer.html similarity index 100% rename from dom/webgpu/mochitest/test_shared_array_buffer.html rename to dom/webgpu/tests/mochitest/test_shared_array_buffer.html diff --git a/dom/webgpu/mochitest/test_submit_compute_empty.html b/dom/webgpu/tests/mochitest/test_submit_compute_empty.html similarity index 100% rename from dom/webgpu/mochitest/test_submit_compute_empty.html rename to dom/webgpu/tests/mochitest/test_submit_compute_empty.html diff --git a/dom/webgpu/mochitest/test_submit_render_empty.html b/dom/webgpu/tests/mochitest/test_submit_render_empty.html similarity index 100% rename from dom/webgpu/mochitest/test_submit_render_empty.html rename to dom/webgpu/tests/mochitest/test_submit_render_empty.html diff --git a/dom/webgpu/mochitest/test_submit_render_empty.worker.html b/dom/webgpu/tests/mochitest/test_submit_render_empty.worker.html similarity index 100% rename from dom/webgpu/mochitest/test_submit_render_empty.worker.html rename to dom/webgpu/tests/mochitest/test_submit_render_empty.worker.html diff --git a/dom/webgpu/mochitest/test_submit_render_empty.worker.js b/dom/webgpu/tests/mochitest/test_submit_render_empty.worker.js similarity index 100% rename from dom/webgpu/mochitest/test_submit_render_empty.worker.js rename to dom/webgpu/tests/mochitest/test_submit_render_empty.worker.js diff --git a/dom/webgpu/mochitest/worker_wrapper.js b/dom/webgpu/tests/mochitest/worker_wrapper.js similarity index 100% rename from dom/webgpu/mochitest/worker_wrapper.js rename to dom/webgpu/tests/mochitest/worker_wrapper.js diff --git a/dom/webidl/Animation.webidl b/dom/webidl/Animation.webidl index 0f60f3e64ce..401fb951f6d 100644 --- a/dom/webidl/Animation.webidl +++ b/dom/webidl/Animation.webidl @@ -56,7 +56,7 @@ interface Animation : EventTarget { [Throws] undefined reverse(); undefined persist(); - [CEReactions, Throws] + [CEReactions, Throws, UseCounter] undefined commitStyles(); }; diff --git a/dom/workers/test/test_worker_interfaces.js b/dom/workers/test/test_worker_interfaces.js index 7afa12b6659..c85ffac738a 100644 --- a/dom/workers/test/test_worker_interfaces.js +++ b/dom/workers/test/test_worker_interfaces.js @@ -231,85 +231,85 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "FormData", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPU", isEarlyBetaOrEarlier: true }, + { name: "GPU", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapter", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapter", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUAdapterInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUAdapterInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroup", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroup", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBindGroupLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUBindGroupLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUBufferUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUBufferUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCanvasContext", isEarlyBetaOrEarlier: true }, + { name: "GPUCanvasContext", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUColorWrite", isEarlyBetaOrEarlier: true }, + { name: "GPUColorWrite", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandBuffer", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandBuffer", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCommandEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUCommandEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUCompilationMessage", isEarlyBetaOrEarlier: true }, + { name: "GPUCompilationMessage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUComputePipeline", isEarlyBetaOrEarlier: true }, + { name: "GPUComputePipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDevice", isEarlyBetaOrEarlier: true }, + { name: "GPUDevice", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUDeviceLostInfo", isEarlyBetaOrEarlier: true }, + { name: "GPUDeviceLostInfo", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUError", isEarlyBetaOrEarlier: true }, + { name: "GPUError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUExternalTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUExternalTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUInternalError", isEarlyBetaOrEarlier: true }, + { name: "GPUInternalError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUMapMode", isEarlyBetaOrEarlier: true }, + { name: "GPUMapMode", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUOutOfMemoryError", isEarlyBetaOrEarlier: true }, + { name: "GPUOutOfMemoryError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineError", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUPipelineLayout", isEarlyBetaOrEarlier: true }, + { name: "GPUPipelineLayout", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQuerySet", isEarlyBetaOrEarlier: true }, + { name: "GPUQuerySet", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUQueue", isEarlyBetaOrEarlier: true }, + { name: "GPUQueue", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundle", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundle", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderBundleEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderBundleEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPassEncoder", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPassEncoder", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPURenderPipeline", isEarlyBetaOrEarlier: true }, + { name: "GPURenderPipeline", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSampler", isEarlyBetaOrEarlier: true }, + { name: "GPUSampler", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderModule", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderModule", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUShaderStage", isEarlyBetaOrEarlier: true }, + { name: "GPUShaderStage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedFeatures", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUSupportedLimits", isEarlyBetaOrEarlier: true }, + { name: "GPUSupportedLimits", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTexture", isEarlyBetaOrEarlier: true }, + { name: "GPUTexture", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureUsage", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureUsage", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUTextureView", isEarlyBetaOrEarlier: true }, + { name: "GPUTextureView", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUUncapturedErrorEvent", isEarlyBetaOrEarlier: true }, + { name: "GPUUncapturedErrorEvent", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "GPUValidationError", isEarlyBetaOrEarlier: true }, + { name: "GPUValidationError", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Headers", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! @@ -524,7 +524,7 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "WebTransportSendStream", insecureContext: false }, // IMPORTANT: Do not change this list without review from a DOM peer! - { name: "WGSLLanguageFeatures", isEarlyBetaOrEarlier: true }, + { name: "WGSLLanguageFeatures", earlyBetaOrEarlier: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Worker", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/editor/libeditor/HTMLEditSubActionHandler.cpp b/editor/libeditor/HTMLEditSubActionHandler.cpp index 95790fe0679..f55e082449c 100644 --- a/editor/libeditor/HTMLEditSubActionHandler.cpp +++ b/editor/libeditor/HTMLEditSubActionHandler.cpp @@ -1199,6 +1199,10 @@ Result HTMLEditor::HandleInsertText( } InsertTextResult insertEmptyTextResult = insertEmptyTextResultOrError.unwrap(); + // InsertTextWithTransaction() doesn not suggest caret position if it's + // called for IME composition. However, for the safety, let's ignore the + // caret position explicitly. + insertEmptyTextResult.IgnoreCaretPointSuggestion(); nsresult rv = EnsureNoFollowingUnnecessaryLineBreak( insertEmptyTextResult.EndOfInsertedTextRef()); if (NS_FAILED(rv)) { @@ -1236,21 +1240,20 @@ Result HTMLEditor::HandleInsertText( if (MOZ_UNLIKELY(insertPaddingBRElementResultOrError.isErr())) { NS_WARNING( "HTMLEditor::InsertPaddingBRElementIfNeeded(eNoStrip) failed"); - insertEmptyTextResult.IgnoreCaretPointSuggestion(); return insertPaddingBRElementResultOrError.propagateErr(); } insertPaddingBRElementResultOrError.unwrap().IgnoreCaretPointSuggestion(); - rv = insertEmptyTextResult.SuggestCaretPointTo( - *this, {SuggestCaret::OnlyIfHasSuggestion, - SuggestCaret::OnlyIfTransactionsAllowedToDoIt, - SuggestCaret::AndIgnoreTrivialError}); - if (NS_FAILED(rv)) { - NS_WARNING("CaretPoint::SuggestCaretPointTo() failed"); - return Err(rv); + // Then, collapse caret after the empty text inserted position, i.e., + // whether the removed composition string was. + if (AllowsTransactionsToChangeSelection()) { + nsresult rv = CollapseSelectionTo(endOfInsertedText); + if (NS_WARN_IF(rv == NS_ERROR_EDITOR_DESTROYED)) { + return Err(rv); + } + NS_WARNING_ASSERTION( + rv != NS_SUCCESS_EDITOR_BUT_IGNORED_TRIVIAL_ERROR, + "CaretPoint::SuggestCaretPointTo() failed, but ignored"); } - NS_WARNING_ASSERTION( - rv != NS_SUCCESS_EDITOR_BUT_IGNORED_TRIVIAL_ERROR, - "CaretPoint::SuggestCaretPointTo() failed, but ignored"); return EditActionResult::HandledResult(); } diff --git a/gfx/angle/targets/libEGL/moz.build b/gfx/angle/targets/libEGL/moz.build index eb8c0494935..263327b57ce 100644 --- a/gfx/angle/targets/libEGL/moz.build +++ b/gfx/angle/targets/libEGL/moz.build @@ -206,4 +206,4 @@ OS_LIBS += [ DEFFILE = "../../checkout/src/libEGL/libEGL_autogen.def" RCFILE = "../../checkout/src/libEGL/libEGL.rc" -GeckoSharedLibrary("libEGL", linkage=None) +GeckoSharedLibrary("libEGL") diff --git a/gfx/angle/targets/libGLESv2/moz.build b/gfx/angle/targets/libGLESv2/moz.build index 18d296d084a..8d824e8ae57 100644 --- a/gfx/angle/targets/libGLESv2/moz.build +++ b/gfx/angle/targets/libGLESv2/moz.build @@ -425,4 +425,4 @@ OS_LIBS += [ DEFFILE = "../../checkout/src/libGLESv2/libGLESv2_autogen.def" RCFILE = "../../checkout/src/libGLESv2/libGLESv2.rc" -GeckoSharedLibrary("libGLESv2", linkage=None) +GeckoSharedLibrary("libGLESv2") diff --git a/gfx/angle/update-angle.py b/gfx/angle/update-angle.py index 99d65f84f6e..e80f1739b9c 100755 --- a/gfx/angle/update-angle.py +++ b/gfx/angle/update-angle.py @@ -522,7 +522,7 @@ def export_target(target_full_name) -> Set[str]: lib_type = desc["type"] if lib_type == "shared_library": - lines.append(f'GeckoSharedLibrary("{name}", linkage=None)') + lines.append(f'GeckoSharedLibrary("{name}")') elif lib_type == "static_library": lines.append(f'Library("{name}")') else: diff --git a/gfx/layers/AnimationInfo.cpp b/gfx/layers/AnimationInfo.cpp index 427c52b5660..2cb5c4e522a 100644 --- a/gfx/layers/AnimationInfo.cpp +++ b/gfx/layers/AnimationInfo.cpp @@ -513,8 +513,7 @@ void AnimationInfo::AddAnimationForProperty( if (readyTime.IsNull()) { // TODO(emilio): This should generally not happen anymore, can we remove // this SetPendingReadyTime call? - readyTime = aFrame->PresContext()->RefreshDriver()->MostRecentRefresh( - /* aEnsureTimerStarted= */ false); + readyTime = aFrame->PresContext()->RefreshDriver()->MostRecentRefresh(); MOZ_ASSERT(!readyTime.IsNull()); aAnimation->SetPendingReadyTime(readyTime); } diff --git a/gfx/layers/apz/public/CompositorScrollUpdate.h b/gfx/layers/apz/public/CompositorScrollUpdate.h index 249cc7a04e7..0ecf4cfa236 100644 --- a/gfx/layers/apz/public/CompositorScrollUpdate.h +++ b/gfx/layers/apz/public/CompositorScrollUpdate.h @@ -19,6 +19,17 @@ namespace layers { * composition time. */ struct CompositorScrollUpdate { + /** + * The compositor state (scroll offset and zoom level) after the update. + */ + struct Metrics { + CSSPoint mVisualScrollOffset; + CSSToParentLayerScale mZoom; + + bool operator==(const Metrics& aOther) const; + bool operator!=(const Metrics& aOther) const { return !(*this == aOther); } + }; + /** * Describes the source of a CompositorScrollUpdate. * @@ -35,8 +46,7 @@ struct CompositorScrollUpdate { Other }; - CSSPoint mVisualScrollOffset; - CSSToParentLayerScale mZoom; + Metrics mMetrics; Source mSource; bool operator==(const CompositorScrollUpdate& aOther) const; diff --git a/gfx/layers/apz/src/APZCTreeManager.cpp b/gfx/layers/apz/src/APZCTreeManager.cpp index c8b51574263..1ac0eb9f035 100644 --- a/gfx/layers/apz/src/APZCTreeManager.cpp +++ b/gfx/layers/apz/src/APZCTreeManager.cpp @@ -891,7 +891,6 @@ void APZCTreeManager::SampleForWebRender(const Maybe& aVsyncId, aTxn.AddMinimapData(scrollId, minimapData); } -#if defined(MOZ_WIDGET_ANDROID) if (apzc->IsRootContent()) { // Send the root frame metrics to java through the UIController if (RefPtr uiController = @@ -902,7 +901,6 @@ void APZCTreeManager::SampleForWebRender(const Maybe& aVsyncId, } } } -#endif } // Now collect all the async transforms needed for the scrollthumbs. diff --git a/gfx/layers/apz/src/AsyncPanZoomController.cpp b/gfx/layers/apz/src/AsyncPanZoomController.cpp index ccfd5a72e4d..38de6f19260 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -561,6 +561,57 @@ UniquePtr PlatformSpecificStateBase::CreateVelocityTracker( return MakeUnique(aAxis); } +// This is a helper class for populating +// AsyncPanZoomController::mUpdatesSinceLastSample when the visual scroll offset +// or zoom level changes. +// +// The class records the current offset and zoom level in its constructor, and +// again in the destructor, and if they have changed, records a compositor +// scroll update with the Source provided in the constructor. +// +// This allows tracking the source of compositor scroll updates in higher-level +// functions such as AttemptScroll or NotifyLayersUpdated, rather than having +// to propagate the source into lower-level functions such as +// SetVisualScrollOffset. +// +// Note however that there is a limit to how far up the call stack this class +// can be used: mRecursiveMutex must be held for the duration of the object's +// lifetime (and to ensure this, the constructor takes a proof-of-lock +// parameter). This is necessary because otherwise, the class could record +// a change to the scroll offset or zoom made by another thread in between +// construction and destruction, for which the source would be incorrect. +class MOZ_STACK_CLASS AsyncPanZoomController::AutoRecordCompositorScrollUpdate + final { + public: + AutoRecordCompositorScrollUpdate( + AsyncPanZoomController* aApzc, CompositorScrollUpdate::Source aSource, + const RecursiveMutexAutoLock& aProofOfApzcLock) + : mApzc(aApzc), + mProofOfApzcLock(aProofOfApzcLock), + mSource(aSource), + mPreviousMetrics(aApzc->GetCurrentMetricsForCompositorScrollUpdate( + aProofOfApzcLock)) {} + ~AutoRecordCompositorScrollUpdate() { + if (!mApzc->IsRootContent()) { + // Compositor scroll updates are only recorded for the root content APZC. + // This check may need to be relaxed in bug 1861329, if we start to allow + // some subframes to move the dynamic toolbar. + return; + } + CompositorScrollUpdate::Metrics newMetrics = + mApzc->GetCurrentMetricsForCompositorScrollUpdate(mProofOfApzcLock); + if (newMetrics != mPreviousMetrics) { + mApzc->mUpdatesSinceLastSample.push_back({newMetrics, mSource}); + } + } + + private: + AsyncPanZoomController* mApzc; + const RecursiveMutexAutoLock& mProofOfApzcLock; + CompositorScrollUpdate::Source mSource; + CompositorScrollUpdate::Metrics mPreviousMetrics; +}; + SampleTime AsyncPanZoomController::GetFrameTime() const { APZCTreeManager* treeManagerLocal = GetApzcTreeManager(); return treeManagerLocal ? treeManagerLocal->GetFrameTime() @@ -1687,6 +1738,10 @@ nsEventStatus AsyncPanZoomController::OnScale(const PinchGestureInput& aEvent) { { RecursiveMutexAutoLock lock(mRecursiveMutex); + + AutoRecordCompositorScrollUpdate csu( + this, CompositorScrollUpdate::Source::UserInteraction, lock); + // Only the root APZC is zoomable, and the root APZC is not allowed to have // different x and y scales. If it did, the calculations in this function // would have to be adjusted (as e.g. it would no longer be valid to take @@ -3772,6 +3827,9 @@ bool AsyncPanZoomController::AttemptScroll( ParentLayerPoint adjustedDisplacement; if (scrollThisApzc) { RecursiveMutexAutoLock lock(mRecursiveMutex); + AutoRecordCompositorScrollUpdate csu( + this, CompositorScrollUpdate::Source::UserInteraction, lock); + bool respectDisregardedDirections = ScrollSourceRespectsDisregardedDirections( aOverscrollHandoffState.mScrollSource); @@ -4916,6 +4974,12 @@ bool AsyncPanZoomController::UpdateAnimation( } if (mAnimation) { + AutoRecordCompositorScrollUpdate csu( + this, + mAnimation->WasTriggeredByScript() + ? CompositorScrollUpdate::Source::Other + : CompositorScrollUpdate::Source::UserInteraction, + aProofOfLock); bool continueAnimation = mAnimation->Sample(Metrics(), sampleTimeDelta); bool wantsRepaints = mAnimation->WantsRepaints(); *aOutDeferredTasks = mAnimation->TakeDeferredTasks(); @@ -5233,8 +5297,10 @@ bool AsyncPanZoomController::SampleCompositedAsyncTransform( const RecursiveMutexAutoLock& aProofOfLock) { MOZ_ASSERT(mSampledState.size() <= 2); bool sampleChanged = (mSampledState.back() != SampledAPZCState(Metrics())); - mSampledState.emplace_back(Metrics(), std::move(mScrollPayload), - mScrollGeneration); + mSampledState.emplace_back( + Metrics(), std::move(mScrollPayload), mScrollGeneration, + // Will consume mUpdatesSinceLastSample and leave it empty + std::move(mUpdatesSinceLastSample)); return sampleChanged; } @@ -5246,7 +5312,10 @@ void AsyncPanZoomController::ResampleCompositedAsyncTransform( if (APZCTreeManager* treeManagerLocal = GetApzcTreeManager()) { mScrollGeneration = treeManagerLocal->NewAPZScrollGeneration(); } - mSampledState.front() = SampledAPZCState(Metrics(), {}, mScrollGeneration); + mSampledState.front() = SampledAPZCState( + Metrics(), {}, mScrollGeneration, + // Will consume mUpdatesSinceLastSample and leave it empty + std::move(mUpdatesSinceLastSample)); } void AsyncPanZoomController::ApplyAsyncTestAttributes( @@ -5499,6 +5568,12 @@ void AsyncPanZoomController::NotifyLayersUpdated( return; } + // FIXME: CompositorScrollUpdate::Source::Other is not accurate for every + // change made by NotifyLayersUpdated. We may need to track different + // sources for different ScrollPositionUpdates. + AutoRecordCompositorScrollUpdate updater( + this, CompositorScrollUpdate::Source::Other, lock); + // If the Metrics scroll offset is different from the last scroll offset // that the main-thread sent us, then we know that the user has been doing // something that triggers a scroll. This check is the APZ equivalent of the @@ -6092,37 +6167,34 @@ const FrameMetrics& AsyncPanZoomController::Metrics() const { return mScrollMetadata.GetMetrics(); } -bool CompositorScrollUpdate::operator==( - const CompositorScrollUpdate& aOther) const { - // Consider two updates to be the same if the scroll offsets are the same +bool CompositorScrollUpdate::Metrics::operator==(const Metrics& aOther) const { + // Consider two metrcs to be the same if the scroll offsets are the same // when rounded to the nearest screen pixel. This avoids spurious updates // due to small rounding errors, which consumers do not care about because // if the scroll offset does not change in screen pixels, what is composited // should not change either. return RoundedToInt(mVisualScrollOffset * mZoom) == RoundedToInt(aOther.mVisualScrollOffset * aOther.mZoom) && - mZoom == aOther.mZoom && mSource == aOther.mSource; + mZoom == aOther.mZoom; +} + +bool CompositorScrollUpdate::operator==( + const CompositorScrollUpdate& aOther) const { + return mMetrics == aOther.mMetrics && mSource == aOther.mSource; } -#ifdef MOZ_WIDGET_ANDROID std::vector AsyncPanZoomController::GetCompositorScrollUpdates() { RecursiveMutexAutoLock lock(mRecursiveMutex); MOZ_ASSERT(Metrics().IsRootContent()); - - // FIXME(bug 1940581): Propagate an accurate source. - CompositorScrollUpdate current{ - GetEffectiveScrollOffset(eForCompositing, lock), - GetEffectiveZoom(eForCompositing, lock), - CompositorScrollUpdate::Source::UserInteraction}; - if (current != mLastCompositorScrollUpdate) { - mLastCompositorScrollUpdate = current; - return {current}; - } - - return {}; + return mSampledState[0].Updates(); +} + +CompositorScrollUpdate::Metrics +AsyncPanZoomController::GetCurrentMetricsForCompositorScrollUpdate( + const RecursiveMutexAutoLock& aProofOfApzcLock) const { + return {Metrics().GetVisualScrollOffset(), Metrics().GetZoom()}; } -#endif // defined(MOZ_WIDGET_ANDROID) wr::MinimapData AsyncPanZoomController::GetMinimapData() const { RecursiveMutexAutoLock lock(mRecursiveMutex); diff --git a/gfx/layers/apz/src/AsyncPanZoomController.h b/gfx/layers/apz/src/AsyncPanZoomController.h index 390b70f5484..d192b18992a 100644 --- a/gfx/layers/apz/src/AsyncPanZoomController.h +++ b/gfx/layers/apz/src/AsyncPanZoomController.h @@ -592,7 +592,7 @@ class AsyncPanZoomController { const FrameMetrics& Metrics() const; FrameMetrics& Metrics(); -#ifdef MOZ_WIDGET_ANDROID + class AutoRecordCompositorScrollUpdate; /** * Get the CompositorScrollUpdates to be sent to consumers for the current * composite. @@ -600,9 +600,13 @@ class AsyncPanZoomController { std::vector GetCompositorScrollUpdates(); private: - // Last CompositorScrollUpdate sent to GeckoView through UIController. - CompositorScrollUpdate mLastCompositorScrollUpdate; -#endif // defined(MOZ_WIDGET_ANDROID) + // Compositor scroll updates since the last time + // SampleCompositedAsyncTransform() was called. + // Access to this field should be protected by mRecursiveMutex. + std::vector mUpdatesSinceLastSample; + + CompositorScrollUpdate::Metrics GetCurrentMetricsForCompositorScrollUpdate( + const RecursiveMutexAutoLock& aProofOfApzcLock) const; public: wr::MinimapData GetMinimapData() const; diff --git a/gfx/layers/apz/src/SampledAPZCState.cpp b/gfx/layers/apz/src/SampledAPZCState.cpp index 8cdd905aba2..a95dd67acd2 100644 --- a/gfx/layers/apz/src/SampledAPZCState.cpp +++ b/gfx/layers/apz/src/SampledAPZCState.cpp @@ -19,20 +19,27 @@ SampledAPZCState::SampledAPZCState(const FrameMetrics& aMetrics) RemoveFractionalAsyncDelta(); } -SampledAPZCState::SampledAPZCState(const FrameMetrics& aMetrics, - Maybe&& aPayload, - APZScrollGeneration aGeneration) +SampledAPZCState::SampledAPZCState( + const FrameMetrics& aMetrics, Maybe&& aPayload, + APZScrollGeneration aGeneration, + std::vector&& aUpdates) : mLayoutViewport(aMetrics.GetLayoutViewport()), mVisualScrollOffset(aMetrics.GetVisualScrollOffset()), mZoom(aMetrics.GetZoom()), mScrollPayload(std::move(aPayload)), - mGeneration(aGeneration) { + mGeneration(aGeneration), + mUpdates(std::move(aUpdates)) { RemoveFractionalAsyncDelta(); } bool SampledAPZCState::operator==(const SampledAPZCState& aOther) const { // The payload doesn't factor into equality, that just comes along for // the ride. + // The compositor scroll updates also do not factor into equality. + // We can think of those as not describing the current state, but the + // process by which we got from the previous state to this one. + // The FrameMetrics constructor of SampledAPZCState does not initialize + // mUpdates, so we can't rely on them always being present. return mLayoutViewport.IsEqualEdges(aOther.mLayoutViewport) && mVisualScrollOffset == aOther.mVisualScrollOffset && mZoom == aOther.mZoom; diff --git a/gfx/layers/apz/src/SampledAPZCState.h b/gfx/layers/apz/src/SampledAPZCState.h index a521eeaf879..572575887ba 100644 --- a/gfx/layers/apz/src/SampledAPZCState.h +++ b/gfx/layers/apz/src/SampledAPZCState.h @@ -10,6 +10,7 @@ #include "FrameMetrics.h" #include "mozilla/Maybe.h" #include "mozilla/ScrollGeneration.h" +#include "mozilla/layers/CompositorScrollUpdate.h" namespace mozilla { namespace layers { @@ -20,7 +21,8 @@ class SampledAPZCState { explicit SampledAPZCState(const FrameMetrics& aMetrics); SampledAPZCState(const FrameMetrics& aMetrics, Maybe&& aPayload, - APZScrollGeneration aGeneration); + APZScrollGeneration aGeneration, + std::vector&& aUpdates); bool operator==(const SampledAPZCState& aOther) const; bool operator!=(const SampledAPZCState& aOther) const; @@ -30,6 +32,7 @@ class SampledAPZCState { CSSToParentLayerScale GetZoom() const { return mZoom; } Maybe TakeScrollPayload(); const APZScrollGeneration& Generation() const { return mGeneration; } + const std::vector Updates() const { return mUpdates; } void UpdateScrollProperties(const FrameMetrics& aMetrics); void UpdateScrollPropertiesWithRelativeDelta(const FrameMetrics& aMetrics, @@ -58,6 +61,8 @@ class SampledAPZCState { // An optional payload that rides along with the sampled state. Maybe mScrollPayload; APZScrollGeneration mGeneration; + // Compositor scroll updates since the last sample. + std::vector mUpdates; void RemoveFractionalAsyncDelta(); // A handy wrapper to call diff --git a/gfx/layers/ipc/LayersMessageUtils.h b/gfx/layers/ipc/LayersMessageUtils.h index 5c245d443b6..96a16cb722f 100644 --- a/gfx/layers/ipc/LayersMessageUtils.h +++ b/gfx/layers/ipc/LayersMessageUtils.h @@ -1188,18 +1188,31 @@ struct ParamTraits mozilla::layers::CompositorScrollUpdate::Source::Other> {}; template <> -struct ParamTraits { - typedef mozilla::layers::CompositorScrollUpdate paramType; +struct ParamTraits { + typedef mozilla::layers::CompositorScrollUpdate::Metrics paramType; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mVisualScrollOffset); WriteParam(aWriter, aParam.mZoom); - WriteParam(aWriter, aParam.mSource); } static bool Read(MessageReader* aReader, paramType* aResult) { return (ReadParam(aReader, &aResult->mVisualScrollOffset) && - ReadParam(aReader, &aResult->mZoom) && + ReadParam(aReader, &aResult->mZoom)); + } +}; + +template <> +struct ParamTraits { + typedef mozilla::layers::CompositorScrollUpdate paramType; + + static void Write(MessageWriter* aWriter, const paramType& aParam) { + WriteParam(aWriter, aParam.mMetrics); + WriteParam(aWriter, aParam.mSource); + } + + static bool Read(MessageReader* aReader, paramType* aResult) { + return (ReadParam(aReader, &aResult->mMetrics) && ReadParam(aReader, &aResult->mSource)); } }; diff --git a/gfx/layers/ipc/UiCompositorControllerChild.cpp b/gfx/layers/ipc/UiCompositorControllerChild.cpp index 15ea55dda82..b0363665422 100644 --- a/gfx/layers/ipc/UiCompositorControllerChild.cpp +++ b/gfx/layers/ipc/UiCompositorControllerChild.cpp @@ -230,11 +230,9 @@ UiCompositorControllerChild::RecvToolbarAnimatorMessageFromCompositor( mozilla::ipc::IPCResult UiCompositorControllerChild::RecvNotifyCompositorScrollUpdate( const CompositorScrollUpdate& aUpdate) { -#if defined(MOZ_WIDGET_ANDROID) if (mWidget) { mWidget->NotifyCompositorScrollUpdate(aUpdate); } -#endif // defined(MOZ_WIDGET_ANDROID) return IPC_OK(); } diff --git a/gfx/layers/ipc/UiCompositorControllerParent.cpp b/gfx/layers/ipc/UiCompositorControllerParent.cpp index b06848e6dcc..8a5e0ffb3cc 100644 --- a/gfx/layers/ipc/UiCompositorControllerParent.cpp +++ b/gfx/layers/ipc/UiCompositorControllerParent.cpp @@ -207,12 +207,10 @@ void UiCompositorControllerParent::NotifyFirstPaint() { void UiCompositorControllerParent::NotifyCompositorScrollUpdate( const CompositorScrollUpdate& aUpdate) { -#if defined(MOZ_WIDGET_ANDROID) CompositorThread()->Dispatch(NewRunnableMethod( "UiCompositorControllerParent::SendNotifyCompositorScrollUpdate", this, &UiCompositorControllerParent::SendNotifyCompositorScrollUpdate, aUpdate)); -#endif } UiCompositorControllerParent::UiCompositorControllerParent( diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index f40a4b08d39..daf108e6611 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -3203,10 +3203,10 @@ void gfxPlatform::InitWebGPUConfig() { feature.Disable(FeatureStatus::Blocklisted, message.get(), failureId); } -#ifdef RELEASE_OR_BETA +#if !(defined(NIGHTLY_BUILD) || (defined(XP_WIN) && defined(EARLY_BETA_OR_EARLIER))) feature.ForceDisable(FeatureStatus::Blocked, - "WebGPU cannot be enabled in release or beta", - "WEBGPU_DISABLE_RELEASE_OR_BETA"_ns); + "WebGPU cannot be enabled unless in Nightly, or Early Beta on Windows.", + "WEBGPU_DISABLE_RELEASE_OR_NON_WINDOWS_EARLY_BETA"_ns); #endif gfxVars::SetAllowWebGPU(feature.IsEnabled()); diff --git a/gfx/wr/Cargo.lock b/gfx/wr/Cargo.lock index 5a6906fe77c..811c44d0ad1 100644 --- a/gfx/wr/Cargo.lock +++ b/gfx/wr/Cargo.lock @@ -982,9 +982,9 @@ dependencies = [ [[package]] name = "glean" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251b9cb685554b96dcf785dba69ce90447006dd6d9229db783336c981c3777e1" +checksum = "95024f4707705270208e36983976cbac235dd7fc33c9f1cb0dee396ec1ce295d" dependencies = [ "crossbeam-channel", "glean-core", @@ -996,9 +996,9 @@ dependencies = [ [[package]] name = "glean-core" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753" +checksum = "5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e" dependencies = [ "android_logger", "bincode", diff --git a/gfx/wr/Cargo.toml b/gfx/wr/Cargo.toml index f3a710877f2..dbb574a052b 100644 --- a/gfx/wr/Cargo.toml +++ b/gfx/wr/Cargo.toml @@ -9,7 +9,7 @@ members = [ resolver = "2" [workspace.dependencies] -glean = "=64.0.1" +glean = "=64.1.1" [profile.release] debug = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 17925ec362b..ffc4b69626c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] # AGP -android-gradle-plugin = "8.9.1" # Keep lint version in sync -lint = "31.9.1" +android-gradle-plugin = "8.9.2" # Keep lint version in sync +lint = "31.9.2" python-envs-plugin = "0.0.31" maven-ant-tasks = "2.1.3" @@ -81,7 +81,7 @@ serialization = "1.8.1" # Mozilla versions apilint = "0.5.4" -mozilla-glean = "64.0.1" +mozilla-glean = "64.1.1" # Testing versions androidx-test = "1.6.1" @@ -101,7 +101,7 @@ adjust = "5.3.0" sentry = "8.8.0" commons-exec = "1.3" -spotless = "6.25.0" +spotless = "7.0.2" tomlj = "1.1.0" [libraries] diff --git a/image/test/reftest/color-management/reftest.list b/image/test/reftest/color-management/reftest.list index 0c758bc2cb4..1b8606ec842 100644 --- a/image/test/reftest/color-management/reftest.list +++ b/image/test/reftest/color-management/reftest.list @@ -7,4 +7,4 @@ == trc-type.html trc-type-ref.html # Bug 1560617 # test for bug 1951423, bt709/bt601/bt2020/bt1886 fuzzy(0-4,0-182740) == 720p-CCWH.png 720p-CCWH_yuv444p_pc-1-13-6.avif -fuzzy(0-16,0-268977) == 720p-CCWH.png 720p-CCWH_yuv444p_tv-1-1-1.avif +fuzzy(0-16,0-282508) == 720p-CCWH.png 720p-CCWH_yuv444p_tv-1-1-1.avif diff --git a/image/test/reftest/downscaling/reftest.list b/image/test/reftest/downscaling/reftest.list index 6b63752f1ae..8952e69193b 100644 --- a/image/test/reftest/downscaling/reftest.list +++ b/image/test/reftest/downscaling/reftest.list @@ -111,7 +111,7 @@ fuzzy(0-1,0-1024) == downscale-32px.html?.jpg downscale-32px-ref.html fuzzy(0-1,0-50) == downscale-orient.html downscale-orient-ref.html # be careful changing fuzzy, the bug this test is testing is if the shade of orange is too dark -fuzzy(0-1,0-144) == 1919368-1.html 1919368-1-ref.html +fuzzy(0-1,0-164) == 1919368-1.html 1919368-1-ref.html @@ -219,7 +219,7 @@ fuzzy(0-4,0-18) == downscale-orient.html downscale-orient-ref.html == huge-1.html?32768x100.jpg,32768,100 huge-1.html?100x100.jpg,32768,100 # be careful changing fuzzy, the bug this test is testing is if the shade of orange is too dark -fuzzy(0-1,0-144) == 1919368-1.html 1919368-1-ref.html +fuzzy(0-1,0-164) == 1919368-1.html 1919368-1-ref.html # Only need to run these with downscaling on != 1421191-1.html about:blank diff --git a/intl/tzdata/GIT-INFO b/intl/tzdata/GIT-INFO index 51179cc0383..e4881798277 100644 --- a/intl/tzdata/GIT-INFO +++ b/intl/tzdata/GIT-INFO @@ -1,5 +1,5 @@ -commit 22428453df80492b31f32da309410d23a23c32b6 -Author: Almaz Mingaleev -Date: Thu Jan 30 19:06:01 2025 +0000 +commit d6a3a85e988251a7e4966035e618c6d203f1bb7c +Author: Almaz +Date: Fri Apr 11 18:26:16 2025 +0100 - ICU-23022 Update ICU data to TZDB 2025a. + ICU-23096 Update ICU data to TZDB 2025b. (#45) diff --git a/intl/tzdata/VERSION b/intl/tzdata/VERSION index 0846b7f265f..ef468adcecf 100644 --- a/intl/tzdata/VERSION +++ b/intl/tzdata/VERSION @@ -1 +1 @@ -2025a +2025b diff --git a/intl/tzdata/source/be/metaZones.res b/intl/tzdata/source/be/metaZones.res index 80ae1508b95..7b1076b17c2 100644 Binary files a/intl/tzdata/source/be/metaZones.res and b/intl/tzdata/source/be/metaZones.res differ diff --git a/intl/tzdata/source/be/timezoneTypes.res b/intl/tzdata/source/be/timezoneTypes.res index fa8cac23ed0..ce05b246cff 100644 Binary files a/intl/tzdata/source/be/timezoneTypes.res and b/intl/tzdata/source/be/timezoneTypes.res differ diff --git a/intl/tzdata/source/be/windowsZones.res b/intl/tzdata/source/be/windowsZones.res index 422ae4861f4..2bd72250689 100644 Binary files a/intl/tzdata/source/be/windowsZones.res and b/intl/tzdata/source/be/windowsZones.res differ diff --git a/intl/tzdata/source/be/zoneinfo64.res b/intl/tzdata/source/be/zoneinfo64.res index 5d70f5b02c0..fdbeb35dd3b 100644 Binary files a/intl/tzdata/source/be/zoneinfo64.res and b/intl/tzdata/source/be/zoneinfo64.res differ diff --git a/intl/tzdata/source/ee/metaZones.res b/intl/tzdata/source/ee/metaZones.res index 18bf0e5f3b2..f568c679cc3 100644 Binary files a/intl/tzdata/source/ee/metaZones.res and b/intl/tzdata/source/ee/metaZones.res differ diff --git a/intl/tzdata/source/ee/timezoneTypes.res b/intl/tzdata/source/ee/timezoneTypes.res index aeaf683cc0e..11f57733d64 100644 Binary files a/intl/tzdata/source/ee/timezoneTypes.res and b/intl/tzdata/source/ee/timezoneTypes.res differ diff --git a/intl/tzdata/source/ee/windowsZones.res b/intl/tzdata/source/ee/windowsZones.res index 05a3eb68e0f..2501ace5f74 100644 Binary files a/intl/tzdata/source/ee/windowsZones.res and b/intl/tzdata/source/ee/windowsZones.res differ diff --git a/intl/tzdata/source/ee/zoneinfo64.res b/intl/tzdata/source/ee/zoneinfo64.res index 6833ece3b46..71128b9c023 100644 Binary files a/intl/tzdata/source/ee/zoneinfo64.res and b/intl/tzdata/source/ee/zoneinfo64.res differ diff --git a/intl/tzdata/source/le/metaZones.res b/intl/tzdata/source/le/metaZones.res index 0cb0bccca1c..f8c4eb7e686 100644 Binary files a/intl/tzdata/source/le/metaZones.res and b/intl/tzdata/source/le/metaZones.res differ diff --git a/intl/tzdata/source/le/timezoneTypes.res b/intl/tzdata/source/le/timezoneTypes.res index 5023ea2b465..7d18d669450 100644 Binary files a/intl/tzdata/source/le/timezoneTypes.res and b/intl/tzdata/source/le/timezoneTypes.res differ diff --git a/intl/tzdata/source/le/windowsZones.res b/intl/tzdata/source/le/windowsZones.res index e8755edba0d..5d8a978952c 100644 Binary files a/intl/tzdata/source/le/windowsZones.res and b/intl/tzdata/source/le/windowsZones.res differ diff --git a/intl/tzdata/source/le/zoneinfo64.res b/intl/tzdata/source/le/zoneinfo64.res index 3d809cf53a3..9b7a5b35a75 100644 Binary files a/intl/tzdata/source/le/zoneinfo64.res and b/intl/tzdata/source/le/zoneinfo64.res differ diff --git a/intl/tzdata/source/metaZones.txt b/intl/tzdata/source/metaZones.txt index 177a62d49f9..93fd931206d 100644 --- a/intl/tzdata/source/metaZones.txt +++ b/intl/tzdata/source/metaZones.txt @@ -1705,6 +1705,13 @@ metaZones:table(nofallback){ "America_Central", } } + "America:Coyhaique"{ + { + "Chile", + "1970-01-01 00:00", + "2025-03-19 21:00", + } + } "America:Creston"{ { "America_Mountain", diff --git a/intl/tzdata/source/timezoneTypes.txt b/intl/tzdata/source/timezoneTypes.txt index 7759a2aaa18..03724013d6a 100644 --- a/intl/tzdata/source/timezoneTypes.txt +++ b/intl/tzdata/source/timezoneTypes.txt @@ -4,7 +4,7 @@ timezoneTypes:table(nofallback){ bcpTypeAlias{ tz{ - aqams{"nzakl"} + aqams{"aqmcm"} aukns{"auhba"} caffs{"cawnp"} camtr{"cator"} @@ -80,7 +80,7 @@ timezoneTypes:table(nofallback){ "America:Thunder_Bay"{"America/Toronto"} "America:Virgin"{"America/St_Thomas"} "America:Yellowknife"{"America/Edmonton"} - "Antarctica:South_Pole"{"Pacific/Auckland"} + "Antarctica:South_Pole"{"Antarctica/McMurdo"} "Asia:Ashkhabad"{"Asia/Ashgabat"} "Asia:Choibalsan"{"Asia/Ulaanbaatar"} "Asia:Chongqing"{"Asia/Shanghai"} @@ -300,6 +300,7 @@ timezoneTypes:table(nofallback){ "America:Coral_Harbour"{"cayzs"} "America:Cordoba"{"arcor"} "America:Costa_Rica"{"crsjo"} + "America:Coyhaique"{"clcxq"} "America:Creston"{"cacfq"} "America:Cuiaba"{"brcgb"} "America:Curacao"{"ancur"} diff --git a/intl/tzdata/source/windowsZones.txt b/intl/tzdata/source/windowsZones.txt index de4f972352c..34c0baa36a4 100644 --- a/intl/tzdata/source/windowsZones.txt +++ b/intl/tzdata/source/windowsZones.txt @@ -362,7 +362,7 @@ windowsZones:table(nofallback){ } "Magallanes Standard Time"{ 001{"America/Punta_Arenas"} - CL{"America/Punta_Arenas"} + CL{"America/Punta_Arenas America/Coyhaique"} } "Marquesas Standard Time"{ 001{"Pacific/Marquesas"} diff --git a/intl/tzdata/source/zoneinfo64.txt b/intl/tzdata/source/zoneinfo64.txt index 4cbc0585131..3054a03b788 100644 --- a/intl/tzdata/source/zoneinfo64.txt +++ b/intl/tzdata/source/zoneinfo64.txt @@ -3,20 +3,20 @@ // License & terms of use: http://www.unicode.org/copyright.html //--------------------------------------------------------- // Build tool: tz2icu -// Build date: Thu Jan 30 14:17:55 2025 +// Build date: Wed Apr 9 14:46:22 2025 // tz database: ftp://ftp.iana.org/tz/ -// tz version: 2025a -// ICU version: 77.0.1 +// tz version: 2025b +// ICU version: 78.0.1 //--------------------------------------------------------- // >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << // >> !!! >>> DO NOT EDIT <<< !!! << //--------------------------------------------------------- zoneinfo64:table(nofallback) { - TZVersion { "2025a" } + TZVersion { "2025b" } Zones:array { - /* ACT */ :int { 357 } //Z#0 - /* AET */ :int { 369 } //Z#1 + /* ACT */ :int { 358 } //Z#0 + /* AET */ :int { 370 } //Z#1 /* AGT */ :int { 64 } //Z#2 /* ART */ :int { 18 } //Z#3 /* AST */ :int { 60 } //Z#4 @@ -24,7 +24,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1830383032 } typeOffsets:intvector { -968, 0, 0, 0 } typeMap:bin { "01" } - links:intvector { 5, 6, 11, 13, 21, 22, 27, 38, 51, 52, 55, 347, 349, 517 } + links:intvector { 5, 6, 11, 13, 21, 22, 27, 38, 51, 52, 55, 348, 350, 518 } } //Z#5 /* Africa/Accra */ :int { 5 } //Z#6 /* Africa/Addis_Ababa */ :int { 48 } //Z#7 @@ -55,7 +55,7 @@ zoneinfo64:table(nofallback) { finalRule { "Egypt" } finalRaw:int { 7200 } finalYear:int { 2024 } - links:intvector { 3, 18, 403 } + links:intvector { 3, 18, 404 } } //Z#18 /* Africa/Casablanca */ :table { trans:intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1557021600, 1560045600, 1587261600, 1590890400, 1618106400, 1621130400, 1648346400, 1651975200, 1679191200, 1682215200, 1710036000, 1713060000, 1740276000, 1743904800, 1771120800, 1774144800, 1801965600, 1804989600, 1832205600, 1835834400, 1863050400, 1866074400, 1893290400, 1896919200, 1924135200, 1927159200, 1954980000, 1958004000, 1985220000, 1988848800, 2016064800, 2019088800, 2046304800, 2049933600, 2077149600, 2080778400, 2107994400, 2111018400, 2138234400, 2141863200 } @@ -122,7 +122,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1924999818 } typeOffsets:intvector { 7818, 0, 7200, 0 } typeMap:bin { "01" } - links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 380 } + links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 381 } } //Z#43 /* Africa/Maseru */ :int { 30 } //Z#44 /* Africa/Mbabane */ :int { 30 } //Z#45 @@ -136,7 +136,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1946168836, -1309746600, -1261969200, -1041388200, -865305900 } typeOffsets:intvector { 8836, 0, 9000, 0, 9900, 0, 10800, 0 } typeMap:bin { "0103010203" } - links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 398, 518, 522, 527 } + links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 399, 519, 523, 528 } } //Z#48 /* Africa/Ndjamena */ :table { trans:intvector { -1830387612, 308703600, 321314400 } @@ -158,7 +158,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000, 1352505600, 1364515200, 1382659200 } typeOffsets:intvector { 3164, 0, 3600, 0, 3600, 3600, 7200, 0 } typeMap:bin { "0102010201020103010201020102010201020102010201020103010203010203" } - links:intvector { 56, 535 } + links:intvector { 56, 536 } } //Z#56 /* Africa/Tunis */ :table { transPre32:intvector { -1, 1497764852 } @@ -180,7 +180,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -36000 } finalYear:int { 2008 } - links:intvector { 59, 80, 620 } + links:intvector { 59, 80, 621 } } //Z#59 /* America/Anchorage */ :table { transPre32:intvector { -1, 1069743569, -1, 2106016072 } @@ -190,10 +190,10 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - links:intvector { 4, 60, 619 } + links:intvector { 4, 60, 620 } } //Z#60 - /* America/Anguilla */ :int { 191 } //Z#61 - /* America/Antigua */ :int { 191 } //Z#62 + /* America/Anguilla */ :int { 192 } //Z#61 + /* America/Antigua */ :int { 192 } //Z#62 /* America/Araguaina */ :table { trans:intvector { -1767214032, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1350788400, 1361066400 } typeOffsets:intvector { -11568, 0, -10800, 0, -10800, 3600 } @@ -218,14 +218,14 @@ zoneinfo64:table(nofallback) { trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800, 1224385200, 1237082400 } typeOffsets:intvector { -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020103040304030403040104030403020304030403" } - links:intvector { 67, 102, 199 } + links:intvector { 67, 102, 200 } } //Z#67 /* America/Argentina/Jujuy */ :table { transPre32:intvector { -1, 1922870968 } trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 657086400, 669178800, 686721600, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800 } typeOffsets:intvector { -15672, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050203020504050403040504" } - links:intvector { 68, 144 } + links:intvector { 68, 145 } } //Z#68 /* America/Argentina/La_Rioja */ :table { transPre32:intvector { -1, 1922871340 } @@ -238,7 +238,7 @@ zoneinfo64:table(nofallback) { trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 655963200, 667796400, 687499200, 699418800, 719380800, 731469600, 938919600, 952052400, 1085281200, 1096171200, 1198983600, 1205632800 } typeOffsets:intvector { -16516, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040502030203020504030402040504" } - links:intvector { 70, 162 } + links:intvector { 70, 163 } } //Z#70 /* America/Argentina/Rio_Gallegos */ :table { transPre32:intvector { -1, 1922871908 } @@ -276,13 +276,13 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { -16392, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030402040504" } } //Z#76 - /* America/Aruba */ :int { 191 } //Z#77 + /* America/Aruba */ :int { 192 } //Z#77 /* America/Asuncion */ :table { trans:intvector { -1206389360, 86760000, 134017200, 181368000, 194497200, 212990400, 226033200, 244526400, 257569200, 276062400, 291783600, 307598400, 323406000, 339220800, 354942000, 370756800, 386478000, 402292800, 418014000, 433828800, 449636400, 465451200, 481172400, 496987200, 512708400, 528523200, 544244400, 560059200, 575866800, 591681600, 607402800, 625032000, 638938800, 654753600, 670474800, 686721600, 699418800, 718257600, 733546800, 749448000, 762318000, 780984000, 793767600, 812520000, 825649200, 844574400, 856666800, 876024000, 888721200, 907473600, 920775600, 938923200, 952225200, 970372800, 983674800, 1002427200, 1018148400, 1030852800, 1049598000, 1062907200, 1081047600, 1097985600, 1110682800, 1129435200, 1142132400, 1160884800, 1173582000, 1192939200, 1205031600, 1224388800, 1236481200, 1255838400, 1270954800, 1286078400, 1302404400, 1317528000, 1333854000, 1349582400, 1364094000, 1381032000, 1395543600, 1412481600, 1426993200, 1443931200, 1459047600, 1475380800, 1490497200, 1506830400, 1521946800, 1538884800, 1553396400, 1570334400, 1584846000, 1601784000, 1616900400, 1633233600, 1648350000, 1664683200, 1679799600, 1696132800, 1711249200, 1728187200, 1728961200 } typeOffsets:intvector { -13840, 0, -14400, 0, -14400, 3600, -10800, 0 } typeMap:bin { "01030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } } //Z#78 - /* America/Atikokan */ :int { 183 } //Z#79 + /* America/Atikokan */ :int { 184 } //Z#79 /* America/Atka */ :int { 59 } //Z#80 /* America/Bahia */ :table { trans:intvector { -1767216356, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1318734000, 1330221600 } @@ -309,7 +309,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { -21168, 0, -21600, 0, -21600, 1800, -21600, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020103010301" } } //Z#85 - /* America/Blanc-Sablon */ :int { 191 } //Z#86 + /* America/Blanc-Sablon */ :int { 192 } //Z#86 /* America/Boa_Vista */ :table { trans:intvector { -1767211040, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 938923200, 951620400, 970977600, 971578800 } typeOffsets:intvector { -14560, 0, -14400, 0, -14400, 3600 } @@ -360,7 +360,7 @@ zoneinfo64:table(nofallback) { typeOffsets:intvector { -12560, 0, -14400, 0, -10800, 0 } typeMap:bin { "0102" } } //Z#96 - /* America/Cayman */ :int { 183 } //Z#97 + /* America/Cayman */ :int { 184 } //Z#97 /* America/Chicago */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1563724800, -1551632400, -1538928000, -1520182800, -1504454400, -1491757200, -1473004800, -1459702800, -1441555200, -1428253200, -1410105600, -1396803600, -1378656000, -1365354000, -1347206400, -1333904400, -1315152000, -1301850000, -1283702400, -1270400400, -1252252800, -1238950800, -1220803200, -1207501200, -1189353600, -1176051600, -1157299200, -1144602000, -1125849600, -1112547600, -1094400000, -1081098000, -1067788800, -1045414800, -1031500800, -1018198800, -1000051200, -986749200, -967996800, -955299600, -936547200, -923245200, -905097600, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -369,7 +369,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 98, 383, 384, 622 } + links:intvector { 98, 384, 385, 623 } } //Z#98 /* America/Chihuahua */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1270371600, 1288512000, 1301821200, 1319961600, 1333270800, 1351411200, 1365325200, 1382860800, 1396774800, 1414310400, 1428224400, 1445760000, 1459674000, 1477814400, 1491123600, 1509264000, 1522573200, 1540713600, 1554627600, 1572163200, 1586077200, 1603612800, 1617526800, 1635667200, 1648976400, 1667116800 } @@ -384,37 +384,43 @@ zoneinfo64:table(nofallback) { finalRaw:int { -25200 } finalYear:int { 2024 } } //Z#100 - /* America/Coral_Harbour */ :int { 183 } //Z#101 + /* America/Coral_Harbour */ :int { 184 } //Z#101 /* America/Cordoba */ :int { 67 } //Z#102 /* America/Costa_Rica */ :table { trans:intvector { -1545071027, 288770400, 297234000, 320220000, 328683600, 664264800, 678344400, 695714400, 700635600 } typeOffsets:intvector { -20173, 0, -21600, 0, -21600, 3600 } typeMap:bin { "010201020102010201" } } //Z#103 - /* America/Creston */ :int { 186 } //Z#104 + /* America/Coyhaique */ :table { + transPre32:intvector { -1, 1770462992 } + trans:intvector { -1892661435, -1688410800, -1619205435, -1593806400, -1335986235, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -736632000, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200, 1586055600, 1599364800, 1617505200, 1630814400, 1648954800, 1662868800, 1680404400, 1693713600, 1712458800, 1725768000, 1742439600 } + typeOffsets:intvector { -17296, 0, -18000, 0, -18000, 3600, -16965, 0, -14400, 0, -14400, 3600, -10800, 0 } + typeMap:bin { "03010304030201020102010201020104010402010405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } + } //Z#104 + /* America/Creston */ :int { 187 } //Z#105 /* America/Cuiaba */ :table { trans:intvector { -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1224388800, 1234666800, 1255838400, 1266721200, 1287288000, 1298170800, 1318737600, 1330225200, 1350792000, 1361070000, 1382241600, 1392519600, 1413691200, 1424574000, 1445140800, 1456023600, 1476590400, 1487473200, 1508040000, 1518922800, 1541304000, 1550372400 } typeOffsets:intvector { -13460, 0, -14400, 0, -14400, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#105 - /* America/Curacao */ :int { 191 } //Z#106 + } //Z#106 + /* America/Curacao */ :int { 192 } //Z#107 /* America/Danmarkshavn */ :table { trans:intvector { -1686091520, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 820465200 } typeOffsets:intvector { -4480, 0, -10800, 0, -10800, 3600, 0, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#107 + } //Z#108 /* America/Dawson */ :table { transPre32:intvector { -1, 2105970356 } trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, 120646800, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800, 1446368400, 1457863200, 1478422800, 1489312800, 1509872400, 1520762400, 1541322000, 1552212000, 1572771600, 1583661600, 1604214000 } typeOffsets:intvector { -33460, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "0102010201020103010405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } - } //Z#108 + } //Z#109 /* America/Dawson_Creek */ :table { transPre32:intvector { -1, 1581085752 } trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 84013200 } typeOffsets:intvector { -28856, 0, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#109 + } //Z#110 /* America/Denver */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -1570374000, -1551628800, -1538924400, -1534089600, -880210800, -765388800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } @@ -423,8 +429,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -25200 } finalYear:int { 2008 } - links:intvector { 110, 206, 539, 547, 628 } - } //Z#110 + links:intvector { 111, 207, 540, 548, 629 } + } //Z#111 /* America/Detroit */ :table { trans:intvector { -2051202469, -1724083200, -880218000, -765396000, -684349200, -671047200, -80506740, -68666400, -52938000, -37216800, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } typeOffsets:intvector { -19931, 0, -21600, 0, -18000, 0, -18000, 3600 } @@ -432,9 +438,9 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 111, 627 } - } //Z#111 - /* America/Dominica */ :int { 191 } //Z#112 + links:intvector { 112, 628 } + } //Z#112 + /* America/Dominica */ :int { 192 } //Z#113 /* America/Edmonton */ :table { trans:intvector { -1998663968, -1632063600, -1615132800, -1600614000, -1596816000, -1567954800, -1551628800, -1536505200, -1523203200, -1504450800, -1491753600, -1473001200, -1459699200, -880210800, -765388800, -715791600, -702489600, 73472400, 89193600, 104922000, 120643200, 136371600, 152092800, 167821200, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } typeOffsets:intvector { -27232, 0, -25200, 0, -25200, 3600 } @@ -442,31 +448,31 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -25200 } finalYear:int { 2008 } - links:intvector { 113, 226, 390 } - } //Z#113 + links:intvector { 114, 227, 391 } + } //Z#114 /* America/Eirunepe */ :table { trans:intvector { -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800, 1214283600, 1384056000 } typeOffsets:intvector { -16768, 0, -18000, 0, -18000, 3600, -14400, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#114 + } //Z#115 /* America/El_Salvador */ :table { trans:intvector { -1546279392, 547020000, 559717200, 578469600, 591166800 } typeOffsets:intvector { -21408, 0, -21600, 0, -21600, 3600 } typeMap:bin { "0102010201" } - } //Z#115 - /* America/Ensenada */ :int { 218 } //Z#116 + } //Z#116 + /* America/Ensenada */ :int { 219 } //Z#117 /* America/Fort_Nelson */ :table { transPre32:intvector { -1, 1581086343 } trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800 } typeOffsets:intvector { -29447, 0, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#117 - /* America/Fort_Wayne */ :int { 132 } //Z#118 + } //Z#118 + /* America/Fort_Wayne */ :int { 133 } //Z#119 /* America/Fortaleza */ :table { trans:intvector { -1767216360, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } typeOffsets:intvector { -9240, 0, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#119 + } //Z#120 /* America/Glace_Bay */ :table { trans:intvector { -2131646412, -1632074400, -1615143600, -880221600, -765399600, -526500000, -513198000, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -14388, 0, -14400, 0, -14400, 3600 } @@ -474,8 +480,8 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#120 - /* America/Godthab */ :int { 181 } //Z#121 + } //Z#121 + /* America/Godthab */ :int { 182 } //Z#122 /* America/Goose_Bay */ :table { transPre32:intvector { -1, 1581071396 } trans:intvector { -1632076148, -1615145348, -1096921748, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -119903400, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544593660, 562129260, 576043260, 594180060, 607492860, 625633260, 638942460, 657082860, 670996860, 688532460, 702446460, 719982060, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173585660, 1194145260, 1205035260, 1225594860, 1236484860, 1257044460, 1268539260, 1289098860, 1299988860, 1320555600, 1331445600, 1352005200 } @@ -484,7 +490,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2013 } - } //Z#122 + } //Z#123 /* America/Grand_Turk */ :table { transPre32:intvector { -1, 1770462768 } trans:intvector { -1827687170, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000, 1205046000, 1225605600, 1236495600, 1257055200, 1268550000, 1289109600, 1299999600, 1320559200, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1520751600, 1541311200 } @@ -493,25 +499,25 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2019 } - } //Z#123 - /* America/Grenada */ :int { 191 } //Z#124 - /* America/Guadeloupe */ :int { 191 } //Z#125 + } //Z#124 + /* America/Grenada */ :int { 192 } //Z#125 + /* America/Guadeloupe */ :int { 192 } //Z#126 /* America/Guatemala */ :table { trans:intvector { -1617040676, 123055200, 130914000, 422344800, 433054800, 669708000, 684219600, 1146376800, 1159678800 } typeOffsets:intvector { -21724, 0, -21600, 0, -21600, 3600 } typeMap:bin { "010201020102010201" } - } //Z#126 + } //Z#127 /* America/Guayaquil */ :table { transPre32:intvector { -1, 1770464856 } trans:intvector { -1230749160, 722926800, 728884800 } typeOffsets:intvector { -19160, 0, -18840, 0, -18000, 0, -18000, 3600 } typeMap:bin { "01020302" } - } //Z#127 + } //Z#128 /* America/Guyana */ :table { trans:intvector { -1843589241, -1730577600, 176096700, 701841600 } typeOffsets:intvector { -13959, 0, -14400, 0, -13500, 0, -10800, 0 } typeMap:bin { "01020301" } - } //Z#128 + } //Z#129 /* America/Halifax */ :table { trans:intvector { -2131645536, -1696276800, -1680469200, -1632074400, -1615143600, -1566763200, -1557090000, -1535486400, -1524949200, -1504468800, -1493413200, -1472414400, -1461963600, -1440964800, -1429390800, -1409515200, -1396731600, -1376856000, -1366491600, -1346616000, -1333832400, -1313956800, -1303678800, -1282507200, -1272661200, -1251057600, -1240088400, -1219608000, -1207429200, -1188763200, -1175979600, -1157313600, -1143925200, -1124049600, -1113771600, -1091390400, -1081026000, -1059854400, -1050786000, -1030910400, -1018126800, -999460800, -986677200, -965592000, -955227600, -935956800, -923173200, -904507200, -891723600, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -431546400, -418244400, -400096800, -386794800, -368647200, -355345200, -337197600, -323895600, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -15264, 0, -14400, 0, -14400, 3600 } @@ -519,8 +525,8 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - links:intvector { 129, 386 } - } //Z#129 + links:intvector { 130, 387 } + } //Z#130 /* America/Havana */ :table { transPre32:intvector { -1, 1770465464 } trans:intvector { -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000, 954651600, 972795600, 986101200, 1004245200, 1018155600, 1035694800, 1049605200, 1067144400, 1080450000, 1162098000, 1173589200, 1193547600, 1205643600, 1224997200, 1236488400, 1256446800, 1268542800, 1288501200, 1300597200, 1321160400, 1333256400, 1352005200, 1362891600, 1383454800 } @@ -529,13 +535,13 @@ zoneinfo64:table(nofallback) { finalRule { "Cuba" } finalRaw:int { -18000 } finalYear:int { 2014 } - links:intvector { 130, 397 } - } //Z#130 + links:intvector { 131, 398 } + } //Z#131 /* America/Hermosillo */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, -873828000, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 } typeOffsets:intvector { -26632, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01030102010301020102010201" } - } //Z#131 + } //Z#132 /* America/Indiana/Indianapolis */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -900259200, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -386787600, -368640000, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -544,8 +550,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 118, 132, 140, 515, 623 } - } //Z#132 + links:intvector { 119, 133, 141, 516, 624 } + } //Z#133 /* America/Indiana/Knox */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -195066000, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 1143961200, 1162105200, 1173600000, 1194159600 } @@ -554,8 +560,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 133, 148, 626 } - } //Z#133 + links:intvector { 134, 149, 627 } + } //Z#134 /* America/Indiana/Marengo */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -589392000, -576090000, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -564,7 +570,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#134 + } //Z#135 /* America/Indiana/Petersburg */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } @@ -573,7 +579,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2009 } - } //Z#135 + } //Z#136 /* America/Indiana/Tell_City */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -68662800, -52934400, -37213200, -21484800, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600 } @@ -582,7 +588,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#136 + } //Z#137 /* America/Indiana/Vevay */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -495043200, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -591,7 +597,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#137 + } //Z#138 /* America/Indiana/Vincennes */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -526492800, -513190800, -495043200, -481741200, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -289414800, -273686400, -260989200, -242236800, -226515600, -210787200, -195066000, -179337600, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } @@ -600,7 +606,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2009 } - } //Z#138 + } //Z#139 /* America/Indiana/Winamac */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194156000, 1205046000, 1225605600 } @@ -609,8 +615,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2009 } - } //Z#139 - /* America/Indianapolis */ :int { 132 } //Z#140 + } //Z#140 + /* America/Indianapolis */ :int { 133 } //Z#141 /* America/Inuvik */ :table { trans:intvector { -536457600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } typeOffsets:intvector { 0, 0, -28800, 0, -28800, 3600, -25200, 0, -25200, 3600 } @@ -618,7 +624,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -25200 } finalYear:int { 2008 } - } //Z#141 + } //Z#142 /* America/Iqaluit */ :table { trans:intvector { -865296000, -765396000, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } @@ -626,15 +632,15 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 142, 184 } - } //Z#142 + links:intvector { 143, 185 } + } //Z#143 /* America/Jamaica */ :table { trans:intvector { -1827687170, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 } typeOffsets:intvector { -18430, 0, -18000, 0, -18000, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - links:intvector { 143, 532 } - } //Z#143 - /* America/Jujuy */ :int { 68 } //Z#144 + links:intvector { 144, 533 } + } //Z#144 + /* America/Jujuy */ :int { 68 } //Z#145 /* America/Juneau */ :table { transPre32:intvector { -1, 1069743569, -1, 2106012357 } trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341402400, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -643,7 +649,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#145 + } //Z#146 /* America/Kentucky/Louisville */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1535904000, -1525280400, -905097600, -891795600, -880214400, -765392400, -747251940, -744224400, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -266432400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -652,8 +658,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 146, 153 } - } //Z#146 + links:intvector { 147, 154 } + } //Z#147 /* America/Kentucky/Monticello */ :table { transPre32:intvector { -1, 1577320096 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -662,20 +668,20 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - } //Z#147 - /* America/Knox_IN */ :int { 133 } //Z#148 - /* America/Kralendijk */ :int { 191 } //Z#149 + } //Z#148 + /* America/Knox_IN */ :int { 134 } //Z#149 + /* America/Kralendijk */ :int { 192 } //Z#150 /* America/La_Paz */ :table { trans:intvector { -1205954844, -1192307244 } typeOffsets:intvector { -16356, 0, -16356, 3600, -14400, 0 } typeMap:bin { "0102" } - } //Z#150 + } //Z#151 /* America/Lima */ :table { transPre32:intvector { -1, 1770464188 } trans:intvector { -1938538284, -1009825200, -1002052800, -986756400, -971035200, -955306800, -939585600, 504939600, 512712000, 536475600, 544248000, 631170000, 638942400, 757400400, 765172800 } typeOffsets:intvector { -18492, 0, -18516, 0, -18000, 0, -18000, 3600 } typeMap:bin { "01020302030203020302030203020302" } - } //Z#151 + } //Z#152 /* America/Los_Angeles */ :table { transPre32:intvector { -1, 1577327296 } trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -687967140, -662655600, -620838000, -608137200, -589388400, -576082800, -557938800, -544633200, -526489200, -513183600, -495039600, -481734000, -463590000, -450284400, -431535600, -418230000, -400086000, -386780400, -368636400, -355330800, -337186800, -323881200, -305737200, -292431600, -273682800, -260982000, -242233200, -226508400, -210783600, -195058800, -179334000, -163609200, -147884400, -131554800, -116434800, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } @@ -684,33 +690,33 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 152, 552, 553, 629, 630 } - } //Z#152 - /* America/Louisville */ :int { 146 } //Z#153 - /* America/Lower_Princes */ :int { 191 } //Z#154 + links:intvector { 153, 553, 554, 630, 631 } + } //Z#153 + /* America/Louisville */ :int { 147 } //Z#154 + /* America/Lower_Princes */ :int { 192 } //Z#155 /* America/Maceio */ :table { trans:intvector { -1767217028, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } typeOffsets:intvector { -8572, 0, -10800, 0, -10800, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#155 + } //Z#156 /* America/Managua */ :table { transPre32:intvector { -1, 1770466404 } trans:intvector { -1121105688, 105084000, 161758800, 290584800, 299134800, 322034400, 330584400, 694260000, 717310800, 725868000, 852094800, 1113112800, 1128229200, 1146384000, 1159682400 } typeOffsets:intvector { -20708, 0, -21600, 0, -21600, 3600, -20712, 0, -18000, 0 } typeMap:bin { "03010401020102010401040102010201" } - } //Z#156 + } //Z#157 /* America/Manaus */ :table { trans:intvector { -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 } typeOffsets:intvector { -14404, 0, -14400, 0, -14400, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 157, 379 } - } //Z#157 - /* America/Marigot */ :int { 191 } //Z#158 + links:intvector { 158, 380 } + } //Z#158 + /* America/Marigot */ :int { 192 } //Z#159 /* America/Martinique */ :table { trans:intvector { -1851537340, 323841600, 338958000 } typeOffsets:intvector { -14660, 0, -14400, 0, -14400, 3600 } typeMap:bin { "010201" } - } //Z#159 + } //Z#160 /* America/Matamoros */ :table { trans:intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1268553600, 1289113200 } typeOffsets:intvector { -23400, 0, -21600, 0, -21600, 3600 } @@ -718,14 +724,14 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2011 } - } //Z#160 + } //Z#161 /* America/Mazatlan */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, -873828000, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1270371600, 1288512000, 1301821200, 1319961600, 1333270800, 1351411200, 1365325200, 1382860800, 1396774800, 1414310400, 1428224400, 1445760000, 1459674000, 1477814400, 1491123600, 1509264000, 1522573200, 1540713600, 1554627600, 1572163200, 1586077200, 1603612800, 1617526800, 1635667200, 1648976400, 1667116800 } typeOffsets:intvector { -25540, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01030102010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 161, 541 } - } //Z#161 - /* America/Mendoza */ :int { 70 } //Z#162 + links:intvector { 162, 542 } + } //Z#162 + /* America/Mendoza */ :int { 70 } //Z#163 /* America/Menominee */ :table { transPre32:intvector { -1, 1635207523 } trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -116438400, -100112400, -21484800, 104914800, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -734,12 +740,12 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#163 + } //Z#164 /* America/Merida */ :table { trans:intvector { -1514743200, 378201600, 405068400, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1428220800, 1445756400, 1459670400, 1477810800, 1491120000, 1509260400, 1522569600, 1540710000, 1554624000, 1572159600, 1586073600, 1603609200, 1617523200, 1635663600, 1648972800, 1667113200 } typeOffsets:intvector { -21508, 0, -21600, 0, -21600, 3600, -18000, 0 } typeMap:bin { "010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#164 + } //Z#165 /* America/Metlakatla */ :table { transPre32:intvector { -1, 1069743569, -1, 2106011674 } trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 1446372000, 1457866800, 1478426400, 1489316400, 1509876000, 1520766000, 1541325600, 1547978400, 1552215600, 1572775200 } @@ -748,13 +754,13 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2020 } - } //Z#165 + } //Z#166 /* America/Mexico_City */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1428220800, 1445756400, 1459670400, 1477810800, 1491120000, 1509260400, 1522569600, 1540710000, 1554624000, 1572159600, 1586073600, 1603609200, 1617523200, 1635663600, 1648972800, 1667113200 } typeOffsets:intvector { -23796, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } typeMap:bin { "0103010201030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - links:intvector { 166, 542 } - } //Z#166 + links:intvector { 167, 543 } + } //Z#167 /* America/Miquelon */ :table { trans:intvector { -1847650520, 326001600, 544597200, 562132800, 576046800, 594187200, 607496400, 625636800, 638946000, 657086400, 671000400, 688536000, 702450000, 719985600, 733899600, 752040000, 765349200, 783489600, 796798800, 814939200, 828853200, 846388800, 860302800, 877838400, 891752400, 909288000, 923202000, 941342400, 954651600, 972792000, 986101200, 1004241600, 1018155600, 1035691200, 1049605200, 1067140800, 1081054800, 1099195200, 1112504400, 1130644800, 1143954000, 1162094400, 1173589200, 1194148800 } typeOffsets:intvector { -13480, 0, -14400, 0, -10800, 0, -10800, 3600 } @@ -762,7 +768,7 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -10800 } finalYear:int { 2008 } - } //Z#167 + } //Z#168 /* America/Moncton */ :table { transPre32:intvector { -1, 1579085244 } trans:intvector { -2131642800, -1632074400, -1615143600, -1153681200, -1145822400, -1122231600, -1114372800, -1090782000, -1082923200, -1059332400, -1051473600, -1027882800, -1020024000, -996433200, -988574400, -965674800, -955396800, -934743600, -923947200, -904503600, -891892800, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -620848800, -608151600, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -463600800, -450298800, -431546400, -418244400, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173592800, 1194152400 } @@ -771,20 +777,20 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#168 + } //Z#169 /* America/Monterrey */ :table { trans:intvector { -1514743200, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1428220800, 1445756400, 1459670400, 1477810800, 1491120000, 1509260400, 1522569600, 1540710000, 1554624000, 1572159600, 1586073600, 1603609200, 1617523200, 1635663600, 1648972800, 1667113200 } typeOffsets:intvector { -24076, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } typeMap:bin { "0103010201030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - } //Z#169 + } //Z#170 /* America/Montevideo */ :table { trans:intvector { -1567455309, -1459627200, -1443819600, -1428006600, -1412283600, -1396470600, -1380747600, -1141590600, -1128286800, -1110141000, -1096837200, -1078691400, -1065387600, -1047241800, -1033938000, -1015187400, -1002488400, -983737800, -971038800, -954707400, -938984400, -920838600, -907534800, -896819400, -853621200, -845847000, -334789200, -319671000, -314226000, -309996000, -149720400, -134604000, -50446800, -34205400, 9860400, 14176800, 72846000, 80100000, 127278000, 132111000, 147234600, 156913200, 165376800, 219812400, 226461600, 250052400, 257911200, 282711600, 289360800, 294202800, 322020000, 566449200, 573012000, 597812400, 605066400, 625633200, 635911200, 656478000, 667965600, 688532400, 699415200, 719377200, 730864800, 1095562800, 1111896000, 1128834000, 1142136000, 1159678800, 1173585600, 1191733200, 1205035200, 1223182800, 1236484800, 1254632400, 1268539200, 1286082000, 1299988800, 1317531600, 1331438400, 1349586000, 1362888000, 1381035600, 1394337600, 1412485200, 1425787200 } typeOffsets:intvector { -13491, 0, -14400, 0, -12600, 0, -12600, 1800, -10800, 0, -10800, 1800, -10800, 3600, -10800, 5400 } typeMap:bin { "01030203020302030203020302030203020302030203020305040504060406040504060406040705040604060406040604060406040604060406040604060406040604060406040604060406040604060406040604" } - } //Z#170 - /* America/Montreal */ :int { 219 } //Z#171 - /* America/Montserrat */ :int { 191 } //Z#172 - /* America/Nassau */ :int { 219 } //Z#173 + } //Z#171 + /* America/Montreal */ :int { 220 } //Z#172 + /* America/Montserrat */ :int { 192 } //Z#173 + /* America/Nassau */ :int { 220 } //Z#174 /* America/New_York */ :table { transPre32:intvector { -1, 1577316496 } trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -1570381200, -1551636000, -1536512400, -1523210400, -1504458000, -1491760800, -1473008400, -1459706400, -1441558800, -1428256800, -1410109200, -1396807200, -1378659600, -1365357600, -1347210000, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1189357200, -1176055200, -1157302800, -1144605600, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -923248800, -905101200, -891799200, -880218000, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -639597600, -620845200, -608148000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -793,9 +799,9 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 174, 402, 624 } - } //Z#174 - /* America/Nipigon */ :int { 219 } //Z#175 + links:intvector { 175, 403, 625 } + } //Z#175 + /* America/Nipigon */ :int { 220 } //Z#176 /* America/Nome */ :table { transPre32:intvector { -1, 1069743569, -1, 2106019794 } trans:intvector { -880196400, -765374400, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -804,13 +810,13 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#176 + } //Z#177 /* America/Noronha */ :table { trans:intvector { -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 } typeOffsets:intvector { -7780, 0, -7200, 0, -7200, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 177, 377 } - } //Z#177 + links:intvector { 178, 378 } + } //Z#178 /* America/North_Dakota/Beulah */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200, 1205053200, 1225612800, 1236502800, 1257062400, 1268557200, 1289116800, 1300003200, 1320562800 } @@ -819,7 +825,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2012 } - } //Z#178 + } //Z#179 /* America/North_Dakota/Center */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -828,7 +834,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#179 + } //Z#180 /* America/North_Dakota/New_Salem */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -837,7 +843,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#180 + } //Z#181 /* America/Nuuk */ :table { trans:intvector { -1686083584, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1477789200, 1490490000, 1509238800, 1521939600, 1540688400, 1553994000, 1572138000, 1585443600, 1603587600, 1616893200, 1635642000, 1648342800, 1667091600, 1679792400, 1711846800, 1729990800 } typeOffsets:intvector { -12416, 0, -10800, 0, -10800, 3600, -7200, 0, -7200, 3600 } @@ -845,8 +851,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -7200 } finalYear:int { 2025 } - links:intvector { 121, 181 } - } //Z#181 + links:intvector { 122, 182 } + } //Z#182 /* America/Ojinaga */ :table { trans:intvector { -1514739600, -1343149200, -1234807200, -1220461200, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1268557200, 1289116800, 1300006800, 1320566400, 1331456400, 1352016000, 1362906000, 1383465600, 1394355600, 1414915200, 1425805200, 1446364800, 1457859600, 1478419200, 1489309200, 1509868800, 1520758800, 1541318400, 1552208400, 1572768000, 1583658000, 1604217600, 1615712400, 1636272000, 1647162000, 1667116800, 1678608000, 1699167600 } typeOffsets:intvector { -25060, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } @@ -854,27 +860,27 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -21600 } finalYear:int { 2024 } - } //Z#182 + } //Z#183 /* America/Panama */ :table { transPre32:intvector { -1, 1770464784 } trans:intvector { -1946918424 } typeOffsets:intvector { -19088, 0, -19176, 0, -18000, 0 } typeMap:bin { "0102" } - links:intvector { 79, 97, 101, 183, 401 } - } //Z#183 - /* America/Pangnirtung */ :int { 142 } //Z#184 + links:intvector { 79, 97, 101, 184, 402 } + } //Z#184 + /* America/Pangnirtung */ :int { 143 } //Z#185 /* America/Paramaribo */ :table { trans:intvector { -1861906760, -1104524348, -765317964, 465449400 } typeOffsets:intvector { -13240, 0, -13252, 0, -13236, 0, -12600, 0, -10800, 0 } typeMap:bin { "01020304" } - } //Z#185 + } //Z#186 /* America/Phoenix */ :table { transPre32:intvector { -1, 1577323696 } trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 } typeOffsets:intvector { -26898, 0, -25200, 0, -25200, 3600 } typeMap:bin { "0102010201020102010201" } - links:intvector { 104, 186, 538, 549, 621 } - } //Z#186 + links:intvector { 105, 187, 539, 550, 622 } + } //Z#187 /* America/Port-au-Prince */ :table { transPre32:intvector { -1, 1770463056 } trans:intvector { -1670483460, 421218000, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200, 546411600, 562132800, 576050400, 594194400, 607500000, 625644000, 638949600, 657093600, 671004000, 688543200, 702453600, 719992800, 733903200, 752047200, 765352800, 783496800, 796802400, 814946400, 828856800, 846396000, 860306400, 877845600, 1112504400, 1130644800, 1143954000, 1162094400, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1446357600, 1489302000, 1509861600 } @@ -883,28 +889,28 @@ zoneinfo64:table(nofallback) { finalRule { "Haiti" } finalRaw:int { -18000 } finalYear:int { 2018 } - } //Z#187 - /* America/Port_of_Spain */ :int { 191 } //Z#188 - /* America/Porto_Acre */ :int { 198 } //Z#189 + } //Z#188 + /* America/Port_of_Spain */ :int { 192 } //Z#189 + /* America/Porto_Acre */ :int { 199 } //Z#190 /* America/Porto_Velho */ :table { trans:intvector { -1767210264, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200 } typeOffsets:intvector { -15336, 0, -14400, 0, -14400, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - } //Z#190 + } //Z#191 /* America/Puerto_Rico */ :table { transPre32:intvector { -1, 2061931961 } trans:intvector { -873057600, -765399600 } typeOffsets:intvector { -15865, 0, -14400, 0, -14400, 3600 } typeMap:bin { "010201" } - links:intvector { 61, 62, 77, 86, 106, 112, 124, 125, 149, 154, 158, 172, 188, 191, 208, 210, 211, 212, 213, 220, 222, 551 } - } //Z#191 + links:intvector { 61, 62, 77, 86, 107, 113, 125, 126, 150, 155, 159, 173, 189, 192, 209, 211, 212, 213, 214, 221, 223, 552 } + } //Z#192 /* America/Punta_Arenas */ :table { transPre32:intvector { -1, 1770462716 } trans:intvector { -1892661435, -1688410800, -1619205435, -1593806400, -1335986235, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -736632000, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1480820400 } typeOffsets:intvector { -17020, 0, -18000, 0, -18000, 3600, -16965, 0, -14400, 0, -14400, 3600, -10800, 0 } typeMap:bin { "030103040302010201020102010201040104020104050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } - } //Z#192 - /* America/Rainy_River */ :int { 224 } //Z#193 + } //Z#193 + /* America/Rainy_River */ :int { 225 } //Z#194 /* America/Rankin_Inlet */ :table { trans:intvector { -410227200, 73468800, 89190000, 104918400, 120639600, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0 } @@ -912,18 +918,18 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#194 + } //Z#195 /* America/Recife */ :table { trans:intvector { -1767217224, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 971575200, 1003028400, 1013911200 } typeOffsets:intvector { -8376, 0, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } - } //Z#195 + } //Z#196 /* America/Regina */ :table { trans:intvector { -2030202084, -1632063600, -1615132800, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 } typeOffsets:intvector { -25116, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - links:intvector { 196, 388, 393 } - } //Z#196 + links:intvector { 197, 389, 394 } + } //Z#197 /* America/Resolute */ :table { trans:intvector { -704937600, 73468800, 89190000, 104918400, 120639600, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0 } @@ -931,20 +937,20 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - } //Z#197 + } //Z#198 /* America/Rio_Branco */ :table { trans:intvector { -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 1214283600, 1384056000 } typeOffsets:intvector { -16272, 0, -18000, 0, -18000, 3600, -14400, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010301" } - links:intvector { 189, 198, 376 } - } //Z#198 - /* America/Rosario */ :int { 67 } //Z#199 - /* America/Santa_Isabel */ :int { 218 } //Z#200 + links:intvector { 190, 199, 377 } + } //Z#199 + /* America/Rosario */ :int { 67 } //Z#200 + /* America/Santa_Isabel */ :int { 219 } //Z#201 /* America/Santarem */ :table { trans:intvector { -1767212472, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 1214280000 } typeOffsets:intvector { -13128, 0, -14400, 0, -14400, 3600, -10800, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020103" } - } //Z#201 + } //Z#202 /* America/Santiago */ :table { trans:intvector { -1892661435, -1688410800, -1619205435, -1593806400, -1335986235, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -740520000, -736635600, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200, 1586055600, 1599364800, 1617505200, 1630814400, 1648954800, 1662868800, 1680404400, 1693713600 } typeOffsets:intvector { -16965, 0, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600 } @@ -952,20 +958,20 @@ zoneinfo64:table(nofallback) { finalRule { "Chile" } finalRaw:int { -14400 } finalYear:int { 2024 } - links:intvector { 202, 395 } - } //Z#202 + links:intvector { 203, 396 } + } //Z#203 /* America/Santo_Domingo */ :table { transPre32:intvector { -1, 1770462472 } trans:intvector { -1159773600, -100119600, -89668800, -5770800, 4422600, 25678800, 33193800, 57733200, 64816200, 89182800, 96438600, 120632400, 127974600, 152082000, 972799200, 975823200 } typeOffsets:intvector { -16776, 0, -18000, 0, -18000, 1800, -18000, 3600, -16800, 0, -14400, 0 } typeMap:bin { "0401030102010201020102010201050105" } - } //Z#203 + } //Z#204 /* America/Sao_Paulo */ :table { trans:intvector { -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400, 1108864800, 1129431600, 1140314400, 1162695600, 1172368800, 1192330800, 1203213600, 1224385200, 1234663200, 1255834800, 1266717600, 1287284400, 1298167200, 1318734000, 1330221600, 1350788400, 1361066400, 1382238000, 1392516000, 1413687600, 1424570400, 1445137200, 1456020000, 1476586800, 1487469600, 1508036400, 1518919200, 1541300400, 1550368800 } typeOffsets:intvector { -11188, 0, -10800, 0, -10800, 3600 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 204, 374, 378 } - } //Z#204 + links:intvector { 205, 375, 379 } + } //Z#205 /* America/Scoresbysund */ :table { trans:intvector { -1686090728, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1477789200, 1490490000, 1509238800, 1521939600, 1540688400, 1553994000, 1572138000, 1585443600, 1603587600, 1616893200, 1635642000, 1648342800, 1667091600, 1679792400, 1698541200, 1711846800, 1729990800 } typeOffsets:intvector { -5272, 0, -7200, 0, -7200, 3600, -3600, 0, -3600, 3600 } @@ -973,8 +979,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -7200 } finalYear:int { 2025 } - } //Z#205 - /* America/Shiprock */ :int { 110 } //Z#206 + } //Z#206 + /* America/Shiprock */ :int { 111 } //Z#207 /* America/Sitka */ :table { transPre32:intvector { -1, 1069743569, -1, 2106012569 } trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -983,8 +989,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#207 - /* America/St_Barthelemy */ :int { 191 } //Z#208 + } //Z#208 + /* America/St_Barthelemy */ :int { 192 } //Z#209 /* America/St_Johns */ :table { trans:intvector { -1664130548, -1650137348, -1632076148, -1615145348, -1598650148, -1590100148, -1567286948, -1551565748, -1535837348, -1520116148, -1503782948, -1488666548, -1472333348, -1457216948, -1440883748, -1425767348, -1409434148, -1394317748, -1377984548, -1362263348, -1346534948, -1330813748, -1314480548, -1299364148, -1283030948, -1267914548, -1251581348, -1236464948, -1220131748, -1205015348, -1188682148, -1172960948, -1156627748, -1141511348, -1125178148, -1110061748, -1096921748, -1093728600, -1078612200, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -116447400, -100121400, -84393000, -68671800, -52943400, -37222200, -21493800, -5772600, 9955800, 25677000, 41405400, 57731400, 73459800, 89181000, 104909400, 120630600, 136359000, 152080200, 167808600, 183529800, 199258200, 215584200, 230707800, 247033800, 262762200, 278483400, 294211800, 309933000, 325661400, 341382600, 357111000, 372832200, 388560600, 404886600, 420010200, 436336200, 452064600, 467785800, 483514200, 499235400, 514963800, 530685000, 544591860, 562127460, 576041460, 594178260, 607491060, 625631460, 638940660, 657081060, 670995060, 688530660, 702444660, 719980260, 733894260, 752034660, 765343860, 783484260, 796793460, 814933860, 828847860, 846383460, 860297460, 877833060, 891747060, 909282660, 923196660, 941337060, 954646260, 972786660, 986095860, 1004236260, 1018150260, 1035685860, 1049599860, 1067135460, 1081049460, 1099189860, 1112499060, 1130639460, 1143948660, 1162089060, 1173583860, 1194143460, 1205033460, 1225593060, 1236483060, 1257042660, 1268537460, 1289097060, 1299987060, 1320553800, 1331443800, 1352003400 } typeOffsets:intvector { -12652, 0, -12652, 3600, -12600, 0, -12600, 3600, -12600, 7200 } @@ -992,22 +998,22 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -12600 } finalYear:int { 2013 } - links:intvector { 209, 382, 391 } - } //Z#209 - /* America/St_Kitts */ :int { 191 } //Z#210 - /* America/St_Lucia */ :int { 191 } //Z#211 - /* America/St_Thomas */ :int { 191 } //Z#212 - /* America/St_Vincent */ :int { 191 } //Z#213 + links:intvector { 210, 383, 392 } + } //Z#210 + /* America/St_Kitts */ :int { 192 } //Z#211 + /* America/St_Lucia */ :int { 192 } //Z#212 + /* America/St_Thomas */ :int { 192 } //Z#213 + /* America/St_Vincent */ :int { 192 } //Z#214 /* America/Swift_Current */ :table { trans:intvector { -2030201320, -1632063600, -1615132800, -880210800, -765388800, -747241200, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -400086000, -384364800, -337186800, -321465600, -305737200, -292435200, -273682800, -260985600, 73472400 } typeOffsets:intvector { -25880, 0, -25200, 0, -25200, 3600, -21600, 0 } typeMap:bin { "01020102010201020102010201020102010201020103" } - } //Z#214 + } //Z#215 /* America/Tegucigalpa */ :table { trans:intvector { -1538503868, 547020000, 559717200, 578469600, 591166800, 1146981600, 1154926800 } typeOffsets:intvector { -20932, 0, -21600, 0, -21600, 3600 } typeMap:bin { "01020102010201" } - } //Z#215 + } //Z#216 /* America/Thule */ :table { trans:intvector { -1686079492, 670399200, 686120400, 701848800, 717570000, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -16508, 0, -14400, 0, -14400, 3600 } @@ -1015,8 +1021,8 @@ zoneinfo64:table(nofallback) { finalRule { "Thule" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#216 - /* America/Thunder_Bay */ :int { 219 } //Z#217 + } //Z#217 + /* America/Thunder_Bay */ :int { 220 } //Z#218 /* America/Tijuana */ :table { trans:intvector { -1514739600, -1451667600, -1343145600, -1234803600, -1222963200, -1207242000, -873820800, -761418000, -686073600, -661539600, -620755200, -608144400, -589384800, -576082800, -557935200, -544633200, -495039600, -481734000, -463590000, -450284400, -431535600, -418230000, -400086000, -386780400, -368636400, -355330800, -337186800, -323881200, -305737200, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1175421600, 1193562000, 1207476000, 1225011600, 1238925600, 1256461200, 1268560800, 1289120400 } typeOffsets:intvector { -28084, 0, -28800, 0, -28800, 3600, -25200, 0 } @@ -1024,8 +1030,8 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -28800 } finalYear:int { 2011 } - links:intvector { 116, 200, 218, 540 } - } //Z#218 + links:intvector { 117, 201, 219, 541 } + } //Z#219 /* America/Toronto */ :table { transPre32:intvector { -1, 1928231148 } trans:intvector { -1632070800, -1615140000, -1601753400, -1583697600, -1567357200, -1554667200, -1534698000, -1524074400, -1503248400, -1492365600, -1471798800, -1460916000, -1440954000, -1428861600, -1409504400, -1397412000, -1378054800, -1365962400, -1346605200, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1188752400, -1176055200, -1157302800, -1144000800, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -634154400, -620845200, -602704800, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } @@ -1034,9 +1040,9 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -18000 } finalYear:int { 2008 } - links:intvector { 171, 173, 175, 217, 219, 389 } - } //Z#219 - /* America/Tortola */ :int { 191 } //Z#220 + links:intvector { 172, 174, 176, 218, 220, 390 } + } //Z#220 + /* America/Tortola */ :int { 192 } //Z#221 /* America/Vancouver */ :table { transPre32:intvector { -1, 1581086444 } trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -747237600, -733935600, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } @@ -1045,16 +1051,16 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -28800 } finalYear:int { 2008 } - links:intvector { 221, 392 } - } //Z#221 - /* America/Virgin */ :int { 191 } //Z#222 + links:intvector { 222, 393 } + } //Z#222 + /* America/Virgin */ :int { 192 } //Z#223 /* America/Whitehorse */ :table { transPre32:intvector { -1, 2105969308 } trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, -121273200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800, 1205056800, 1225616400, 1236506400, 1257066000, 1268560800, 1289120400, 1300010400, 1320570000, 1331460000, 1352019600, 1362909600, 1383469200, 1394359200, 1414918800, 1425808800, 1446368400, 1457863200, 1478422800, 1489312800, 1509872400, 1520762400, 1541322000, 1552212000, 1572771600, 1583661600, 1604214000 } typeOffsets:intvector { -32412, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600, -25200, 0 } typeMap:bin { "0102010201020103010405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040506" } - links:intvector { 223, 394 } - } //Z#223 + links:intvector { 224, 395 } + } //Z#224 /* America/Winnipeg */ :table { transPre32:intvector { -1, 1692709012 } trans:intvector { -1694368800, -1681671600, -1632067200, -1615136400, -1029686400, -1018198800, -880214400, -765392400, -746035200, -732733200, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620755200, -607626000, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -292438800, -210787200, -198090000, -116438400, -100108800, -84384000, -68659200, -52934400, -37209600, -21484800, -5760000, 9964800, 25689600, 41414400, 57744000, 73468800, 89193600, 104918400, 120643200, 136368000, 152092800, 167817600, 183542400, 199267200, 215596800, 230716800, 247046400, 262771200, 278496000, 294220800, 309945600, 325670400, 341395200, 357120000, 372844800, 388569600, 404899200, 420019200, 436348800, 452073600, 467798400, 483523200, 499248000, 514972800, 530697600, 544608000, 562147200, 576057600, 594201600, 607507200, 625651200, 638956800, 657100800, 671011200, 688550400, 702460800, 720000000, 733910400, 752054400, 765360000, 783504000, 796809600, 814953600, 828864000, 846403200, 860313600, 877852800, 891763200, 909302400, 923212800, 941356800, 954662400, 972806400, 986112000, 1004256000, 1018166400, 1035705600, 1049616000, 1067155200, 1081065600, 1099209600, 1112515200, 1130659200, 1143964800, 1162105200, 1173600000, 1194159600 } @@ -1063,8 +1069,8 @@ zoneinfo64:table(nofallback) { finalRule { "Canada" } finalRaw:int { -21600 } finalYear:int { 2008 } - links:intvector { 193, 224, 387 } - } //Z#224 + links:intvector { 194, 225, 388 } + } //Z#225 /* America/Yakutat */ :table { transPre32:intvector { -1, 1069743569, -1, 2106013631 } trans:intvector { -880203600, -765381600, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 152100000, 162385200, 183549600, 199278000, 215604000, 230727600, 247053600, 262782000, 278503200, 294231600, 309952800, 325681200, 341402400, 357130800, 372852000, 388580400, 404906400, 420030000, 436356000, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } @@ -1073,19 +1079,19 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -32400 } finalYear:int { 2008 } - } //Z#225 - /* America/Yellowknife */ :int { 113 } //Z#226 + } //Z#226 + /* America/Yellowknife */ :int { 114 } //Z#227 /* Antarctica/Casey */ :table { trans:intvector { -31536000, 1255802400, 1267714800, 1319738400, 1329843600, 1477065600, 1520701200, 1538856000, 1552752000, 1570129200, 1583596800, 1601740860, 1615640400, 1633190460, 1647090000, 1664640060, 1678291200 } typeOffsets:intvector { 0, 0, 28800, 0, 39600, 0 } typeMap:bin { "0102010201020102010201020102010201" } - } //Z#227 + } //Z#228 /* Antarctica/Davis */ :table { trans:intvector { -409190400, -163062000, -28857600, 1255806000, 1268251200, 1319742000, 1329854400 } typeOffsets:intvector { 0, 0, 18000, 0, 25200, 0 } typeMap:bin { "02000201020102" } - } //Z#228 - /* Antarctica/DumontDUrville */ :int { 587 } //Z#229 + } //Z#229 + /* Antarctica/DumontDUrville */ :int { 588 } //Z#230 /* Antarctica/Macquarie */ :table { transPre32:intvector { -1, 2080708096 } trans:intvector { -1680508800, -1665388800, -1601719200, -687052800, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000, 1238860800, 1254585600, 1301760000, 1317484800 } @@ -1094,25 +1100,25 @@ zoneinfo64:table(nofallback) { finalRule { "AT" } finalRaw:int { 36000 } finalYear:int { 2012 } - } //Z#230 + } //Z#231 /* Antarctica/Mawson */ :table { trans:intvector { -501206400, 1255809600 } typeOffsets:intvector { 0, 0, 18000, 0, 21600, 0 } typeMap:bin { "0201" } - } //Z#231 - /* Antarctica/McMurdo */ :int { 555 } //Z#232 + } //Z#232 + /* Antarctica/McMurdo */ :int { 556 } //Z#233 /* Antarctica/Palmer */ :table { trans:intvector { -157766400, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1480820400 } typeOffsets:intvector { 0, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "02010201020102010201030403010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#233 + } //Z#234 /* Antarctica/Rothera */ :table { trans:intvector { 218246400 } typeOffsets:intvector { 0, 0, -10800, 0 } typeMap:bin { "01" } - } //Z#234 - /* Antarctica/South_Pole */ :int { 555 } //Z#235 - /* Antarctica/Syowa */ :int { 311 } //Z#236 + } //Z#235 + /* Antarctica/South_Pole */ :int { 556 } //Z#236 + /* Antarctica/Syowa */ :int { 312 } //Z#237 /* Antarctica/Troll */ :table { trans:intvector { 1111885200, 1130634000 } typeOffsets:intvector { 0, 0, 0, 7200 } @@ -1120,74 +1126,74 @@ zoneinfo64:table(nofallback) { finalRule { "Troll" } finalRaw:int { 0 } finalYear:int { 2006 } - } //Z#237 + } //Z#238 /* Antarctica/Vostok */ :table { trans:intvector { -380073600, 760035600, 783648000, 1702839600 } typeOffsets:intvector { 0, 0, 18000, 0, 25200, 0 } typeMap:bin { "02000201" } - } //Z#238 - /* Arctic/Longyearbyen */ :int { 447 } //Z#239 - /* Asia/Aden */ :int { 311 } //Z#240 + } //Z#239 + /* Arctic/Longyearbyen */ :int { 448 } //Z#240 + /* Asia/Aden */ :int { 312 } //Z#241 /* Asia/Almaty */ :table { trans:intvector { -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1709229600 } typeOffsets:intvector { 18468, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040301" } - } //Z#241 + } //Z#242 /* Asia/Amman */ :table { trans:intvector { -1230776624, 108165600, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 215643600, 231285600, 244501200, 262735200, 275950800, 481154400, 496962000, 512949600, 528670800, 544399200, 560120400, 575848800, 592174800, 610581600, 623624400, 641167200, 655074000, 671839200, 685918800, 702856800, 717973200, 733701600, 749422800, 765151200, 779662800, 797205600, 811116000, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 930780000, 938124000, 954367200, 970178400, 985816800, 1001628000, 1017352800, 1033077600, 1048802400, 1066946400, 1080252000, 1097791200, 1112306400, 1128031200, 1143756000, 1161900000, 1175205600, 1193349600, 1206655200, 1225404000, 1238104800, 1256853600, 1269554400, 1288303200, 1301608800, 1319752800, 1333058400, 1387486800, 1395957600, 1414706400, 1427407200, 1446156000, 1459461600, 1477605600, 1490911200, 1509055200, 1522360800, 1540504800, 1553810400, 1571954400, 1585260000, 1604008800, 1616709600, 1635458400, 1645740000, 1666908000 } typeOffsets:intvector { 8624, 0, 7200, 0, 7200, 3600, 10800, 0 } typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#242 + } //Z#243 /* Asia/Anadyr */ :table { trans:intvector { -1441194596, -1247572800, 354884400, 370692000, 386420400, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701791200, 717516000, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } typeOffsets:intvector { 42596, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600, 46800, 0, 46800, 3600 } typeMap:bin { "03050605040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#243 + } //Z#244 /* Asia/Aqtau */ :table { trans:intvector { -1441164064, -1247544000, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } typeOffsets:intvector { 12064, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "0103050403040304030403040304030403040304030201030403040304010201020102010201020102010201020102010203" } - } //Z#244 + } //Z#245 /* Asia/Aqtobe */ :table { trans:intvector { -1441165720, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } typeOffsets:intvector { 13720, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010304050403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403" } - } //Z#245 + } //Z#246 /* Asia/Ashgabat */ :table { trans:intvector { -1441166012, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000 } typeOffsets:intvector { 14012, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103" } - links:intvector { 246, 247 } - } //Z#246 - /* Asia/Ashkhabad */ :int { 246 } //Z#247 + links:intvector { 247, 248 } + } //Z#247 + /* Asia/Ashkhabad */ :int { 247 } //Z#248 /* Asia/Atyrau */ :table { trans:intvector { -1441164464, -1247540400, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } typeOffsets:intvector { 12464, 0, 10800, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "0104060504050405040504050405040504050405040302040504050405040504050405040504030203020302030203020304" } - } //Z#248 + } //Z#249 /* Asia/Baghdad */ :table { transPre32:intvector { -1, 1770435036 } trans:intvector { -1641005856, 389048400, 402264000, 417906000, 433800000, 449614800, 465422400, 481150800, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670464000, 686275200, 702086400, 717897600, 733622400, 749433600, 765158400, 780969600, 796694400, 812505600, 828316800, 844128000, 859852800, 875664000, 891388800, 907200000, 922924800, 938736000, 954547200, 970358400, 986083200, 1001894400, 1017619200, 1033430400, 1049155200, 1064966400, 1080777600, 1096588800, 1112313600, 1128124800, 1143849600, 1159660800, 1175385600, 1191196800 } typeOffsets:intvector { 10660, 0, 10656, 0, 10800, 0, 10800, 3600 } typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - } //Z#249 - /* Asia/Bahrain */ :int { 307 } //Z#250 + } //Z#250 + /* Asia/Bahrain */ :int { 308 } //Z#251 /* Asia/Baku */ :table { trans:intvector { -1441163964, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 828234000, 846378000, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1319932800, 1332633600, 1351382400, 1364688000, 1382832000, 1396137600, 1414281600, 1427587200, 1445731200 } typeOffsets:intvector { 11964, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201020304030403040304030403040304030403040304030403040304030403040304030403040304030403" } - } //Z#251 + } //Z#252 /* Asia/Bangkok */ :table { trans:intvector { -1570084924 } typeOffsets:intvector { 24124, 0, 25200, 0 } typeMap:bin { "01" } - links:intvector { 252, 304, 333, 520 } - } //Z#252 + links:intvector { 253, 305, 334, 521 } + } //Z#253 /* Asia/Barnaul */ :table { trans:intvector { -1579844100, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 801590400, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1459022400 } typeOffsets:intvector { 20100, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#253 + } //Z#254 /* Asia/Beirut */ :table { transPre32:intvector { -1, 1454817976 } trans:intvector { -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1473645600, -1460948400, -399866400, -386650800, -368330400, -355114800, -336794400, -323578800, -305172000, -291956400, -273636000, -260420400, 78012000, 86734800, 105055200, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 212965200, 231285600, 244501200, 262735200, 275950800, 452210400, 466722000, 483746400, 498258000, 515282400, 529794000, 546818400, 561330000, 581119200, 592952400, 610754400, 624488400, 641512800, 656024400, 673048800, 687560400, 704671200, 718146000, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 906843600, 922572000, 941317200 } @@ -1196,57 +1202,57 @@ zoneinfo64:table(nofallback) { finalRule { "Lebanon" } finalRaw:int { 7200 } finalYear:int { 2000 } - } //Z#254 + } //Z#255 /* Asia/Bishkek */ :table { trans:intvector { -1441169904, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683582400, 703018800, 717530400, 734468400, 748980000, 765918000, 780429600, 797367600, 811879200, 828817200, 843933600, 859671000, 877811400, 891120600, 909261000, 922570200, 941315400, 954019800, 972765000, 985469400, 1004214600, 1017523800, 1035664200, 1048973400, 1067113800, 1080423000, 1099168200, 1111872600, 1123783200 } typeOffsets:intvector { 17904, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020102010201020102010201020102010201020102010201020102010203" } - } //Z#255 - /* Asia/Brunei */ :int { 291 } //Z#256 - /* Asia/Calcutta */ :int { 288 } //Z#257 + } //Z#256 + /* Asia/Brunei */ :int { 292 } //Z#257 + /* Asia/Calcutta */ :int { 289 } //Z#258 /* Asia/Chita */ :table { trans:intvector { -1579419232, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800, 1459015200 } typeOffsets:intvector { 27232, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050103" } - } //Z#258 - /* Asia/Choibalsan */ :int { 329 } //Z#259 - /* Asia/Chongqing */ :int { 316 } //Z#260 - /* Asia/Chungking */ :int { 316 } //Z#261 + } //Z#259 + /* Asia/Choibalsan */ :int { 330 } //Z#260 + /* Asia/Chongqing */ :int { 317 } //Z#261 + /* Asia/Chungking */ :int { 317 } //Z#262 /* Asia/Colombo */ :table { transPre32:intvector { -1, 1454807332 } trans:intvector { -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400, 1145039400 } typeOffsets:intvector { 19164, 0, 19172, 0, 19800, 0, 19800, 1800, 19800, 3600, 21600, 0, 23400, 0 } typeMap:bin { "0102030402060502" } - } //Z#262 - /* Asia/Dacca */ :int { 265 } //Z#263 + } //Z#263 + /* Asia/Dacca */ :int { 266 } //Z#264 /* Asia/Damascus */ :table { trans:intvector { -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200, 922917600, 938725200, 954540000, 970347600, 986076000, 1001883600, 1017612000, 1033419600, 1049148000, 1064955600, 1080770400, 1096578000, 1112306400, 1128114000, 1143842400, 1158872400, 1175205600, 1193950800, 1207260000, 1225486800, 1238104800, 1256850000, 1270159200, 1288299600, 1301608800, 1319749200, 1333058400, 1351198800, 1364508000, 1382648400, 1395957600, 1414702800, 1427407200, 1446152400, 1458856800, 1477602000, 1490911200, 1509051600, 1522360800, 1540501200, 1553810400, 1571950800, 1585260000, 1604005200, 1616709600, 1635454800, 1648159200, 1666904400 } typeOffsets:intvector { 8712, 0, 7200, 0, 7200, 3600, 10800, 0 } typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } - } //Z#264 + } //Z#265 /* Asia/Dhaka */ :table { transPre32:intvector { -1, 1770423996 } trans:intvector { -891582800, -872058600, -862637400, -576138600, 1245430800, 1262278800 } typeOffsets:intvector { 21700, 0, 19800, 0, 21200, 0, 21600, 0, 21600, 3600, 23400, 0 } typeMap:bin { "02050105030403" } - links:intvector { 263, 265, 375 } - } //Z#265 + links:intvector { 264, 266, 376 } + } //Z#266 /* Asia/Dili */ :table { trans:intvector { -1830412800, -879152400, 199897200, 969120000 } typeOffsets:intvector { 30140, 0, 28800, 0, 32400, 0 } typeMap:bin { "01020102" } - } //Z#266 + } //Z#267 /* Asia/Dubai */ :table { trans:intvector { -1577936472 } typeOffsets:intvector { 13272, 0, 14400, 0 } typeMap:bin { "01" } - links:intvector { 267, 298, 524, 528 } - } //Z#267 + links:intvector { 268, 299, 525, 529 } + } //Z#268 /* Asia/Dushanbe */ :table { trans:intvector { -1441168512, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 684363600 } typeOffsets:intvector { 16512, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#268 + } //Z#269 /* Asia/Famagusta */ :table { trans:intvector { -1518920148, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396141200, 1414285200, 1427590800, 1445734800, 1459040400, 1473282000, 1509238800, 1521939600, 1540688400 } typeOffsets:intvector { 8148, 0, 7200, 0, 7200, 3600, 10800, 0 } @@ -1254,7 +1260,7 @@ zoneinfo64:table(nofallback) { finalRule { "EUAsia" } finalRaw:int { 7200 } finalYear:int { 2019 } - } //Z#269 + } //Z#270 /* Asia/Gaza */ :table { transPre32:intvector { -1, 2109557424 } trans:intvector { -933638400, -923097600, -919036800, -857347200, -844300800, -825811200, -812678400, -794188800, -779846400, -762652800, -748310400, -731116800, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334101600, 337730400, 452642400, 462319200, 482277600, 494370000, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1219957200, 1238104800, 1252015200, 1269640860, 1281474000, 1301608860, 1312146000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445551200, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572037200, 1585346400, 1603490400, 1616796000, 1635458400, 1648332000, 1666998000, 1682726400, 1698447600, 1713571200, 1729897200, 1744416000, 1761346800, 1774656000, 1792796400, 1806105600, 1824850800, 1837555200, 1856300400, 1869004800, 1887750000, 1901059200, 1919199600, 1932508800, 1950649200, 1963958400, 1982703600, 1995408000, 2014153200, 2026857600, 2045602800, 2058307200, 2077052400, 2090361600, 2107897200, 2121811200, 2138742000 } @@ -1264,8 +1270,8 @@ zoneinfo64:table(nofallback) { finalRule { "Palestine" } finalRaw:int { 7200 } finalYear:int { 2088 } - } //Z#270 - /* Asia/Harbin */ :int { 316 } //Z#271 + } //Z#271 + /* Asia/Harbin */ :int { 317 } //Z#272 /* Asia/Hebron */ :table { transPre32:intvector { -1, 2109557273 } trans:intvector { -933638400, -923097600, -919036800, -857347200, -844300800, -825811200, -812678400, -794188800, -779846400, -762652800, -748310400, -731116800, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 334101600, 337730400, 452642400, 462319200, 482277600, 494370000, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445551200, 1458946800, 1477692000, 1490396400, 1509141600, 1521846000, 1540591200, 1553810400, 1572037200, 1585346400, 1603490400, 1616796000, 1635458400, 1648332000, 1666998000, 1682726400, 1698447600, 1713571200, 1729897200, 1744416000, 1761346800, 1774656000, 1792796400, 1806105600, 1824850800, 1837555200, 1856300400, 1869004800, 1887750000, 1901059200, 1919199600, 1932508800, 1950649200, 1963958400, 1982703600, 1995408000, 2014153200, 2026857600, 2045602800, 2058307200, 2077052400, 2090361600, 2107897200, 2121811200, 2138742000 } @@ -1275,40 +1281,40 @@ zoneinfo64:table(nofallback) { finalRule { "Palestine" } finalRaw:int { 7200 } finalYear:int { 2088 } - } //Z#272 + } //Z#273 /* Asia/Ho_Chi_Minh */ :table { trans:intvector { -1851577590, -852105600, -782643600, -767869200, -718095600, -457772400, -315648000, 171820800 } typeOffsets:intvector { 25590, 0, 25200, 0, 28800, 0, 32400, 0 } typeMap:bin { "0102030102010201" } - links:intvector { 273, 312, 634 } - } //Z#273 + links:intvector { 274, 313, 635 } + } //Z#274 /* Asia/Hong_Kong */ :table { trans:intvector { -2056690800, -900910800, -891579600, -884248200, -761209200, -747907200, -728541000, -717049800, -697091400, -683785800, -668061000, -654755400, -636611400, -623305800, -605161800, -591856200, -573712200, -559801800, -541657800, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } typeOffsets:intvector { 27402, 0, 28800, 0, 28800, 1800, 28800, 3600, 32400, 0 } typeMap:bin { "010302040103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301030103010301" } - links:intvector { 274, 514 } - } //Z#274 + links:intvector { 275, 515 } + } //Z#275 /* Asia/Hovd */ :table { trans:intvector { -2032927596, 252439200, 417978000, 433785600, 449600400, 465321600, 481050000, 496771200, 512499600, 528220800, 543949200, 559670400, 575398800, 591120000, 606848400, 622569600, 638298000, 654624000, 670352400, 686073600, 701802000, 717523200, 733251600, 748972800, 764701200, 780422400, 796150800, 811872000, 828205200, 843926400, 859654800, 875376000, 891104400, 906825600, 988398000, 1001700000, 1017428400, 1033149600, 1048878000, 1064599200, 1080327600, 1096048800, 1111777200, 1127498400, 1143226800, 1159552800, 1427482800, 1443196800, 1458932400, 1474646400 } typeOffsets:intvector { 21996, 0, 21600, 0, 25200, 0, 25200, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - } //Z#275 + } //Z#276 /* Asia/Irkutsk */ :table { trans:intvector { -1575874625, -1247554800, 354902400, 370710000, 386438400, 402246000, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686084400, 695761200, 701805600, 717530400, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200, 828208800, 846352800, 859658400, 877802400, 891108000, 909252000, 922557600, 941306400, 954007200, 972756000, 985456800, 1004205600, 1017511200, 1035655200, 1048960800, 1067104800, 1080410400, 1099159200, 1111860000, 1130608800, 1143309600, 1162058400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200, 1256407200, 1269712800, 1288461600, 1301162400, 1414256400 } typeOffsets:intvector { 25025, 0, 25200, 0, 25200, 3600, 28800, 0, 28800, 3600, 32400, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#276 - /* Asia/Istanbul */ :int { 460 } //Z#277 + } //Z#277 + /* Asia/Istanbul */ :int { 461 } //Z#278 /* Asia/Jakarta */ :table { trans:intvector { -1451719200, -1172906400, -876641400, -766054800, -683883000, -620812800, -189415800 } typeOffsets:intvector { 25632, 0, 25200, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "02030503040301" } - } //Z#278 + } //Z#279 /* Asia/Jayapura */ :table { trans:intvector { -1172913768, -799491600, -189423000 } typeOffsets:intvector { 33768, 0, 32400, 0, 34200, 0 } typeMap:bin { "010201" } - } //Z#279 + } //Z#280 /* Asia/Jerusalem */ :table { transPre32:intvector { -1, 1454818042 } trans:intvector { -1641003640, -933638400, -923097600, -919036800, -857347200, -844300800, -825811200, -812678400, -794188800, -779846400, -762652800, -748310400, -731116800, -681955200, -673228800, -667958400, -652320000, -636422400, -622080000, -608947200, -591840000, -572486400, -558576000, -542851200, -527731200, -514425600, -490838400, -482976000, -459388800, -451526400, -428544000, -418262400, -400118400, -387417600, 142380000, 150843600, 167176800, 178664400, 334101600, 337730400, 452642400, 462319200, 482277600, 494370000, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 826840800, 842821200, 858895200, 874184400, 890344800, 905029200, 923011200, 936313200, 955670400, 970783200, 986770800, 1001282400, 1017356400, 1033941600, 1048806000, 1065132000, 1081292400, 1095804000, 1112313600, 1128812400, 1143763200, 1159657200, 1175212800, 1189897200, 1206662400, 1223161200, 1238112000, 1254006000, 1269561600, 1284246000, 1301616000, 1317510000, 1333065600, 1348354800, 1364515200, 1382828400 } @@ -1317,83 +1323,83 @@ zoneinfo64:table(nofallback) { finalRule { "Zion" } finalRaw:int { 7200 } finalYear:int { 2014 } - links:intvector { 280, 323, 530 } - } //Z#280 + links:intvector { 281, 324, 531 } + } //Z#281 /* Asia/Kabul */ :table { transPre32:intvector { -1, 1770429088 } trans:intvector { -788932800 } typeOffsets:intvector { 16608, 0, 14400, 0, 16200, 0 } typeMap:bin { "0102" } - } //Z#281 + } //Z#282 /* Asia/Kamchatka */ :table { trans:intvector { -1487759676, -1247569200, 354888000, 370695600, 386424000, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701791200, 717516000, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } typeOffsets:intvector { 38076, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#282 + } //Z#283 /* Asia/Karachi */ :table { trans:intvector { -1988166492, -862637400, -764145000, -576135000, 1018119600, 1033840800, 1212260400, 1225476000, 1239735600, 1257012000 } typeOffsets:intvector { 16092, 0, 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 } typeMap:bin { "03040301020102010201" } - links:intvector { 283, 548 } - } //Z#283 - /* Asia/Kashgar */ :int { 331 } //Z#284 + links:intvector { 284, 549 } + } //Z#284 + /* Asia/Kashgar */ :int { 332 } //Z#285 /* Asia/Kathmandu */ :table { trans:intvector { -1577943676, 504901800 } typeOffsets:intvector { 20476, 0, 19800, 0, 20700, 0 } typeMap:bin { "0102" } - links:intvector { 285, 286 } - } //Z#285 - /* Asia/Katmandu */ :int { 285 } //Z#286 + links:intvector { 286, 287 } + } //Z#286 + /* Asia/Katmandu */ :int { 286 } //Z#287 /* Asia/Khandyga */ :table { trans:intvector { -1579424533, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1072882800, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1315832400, 1414252800 } typeOffsets:intvector { 32533, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403050605060506050605060506050605070503" } - } //Z#287 + } //Z#288 /* Asia/Kolkata */ :table { transPre32:intvector { -1, 649730088, -1, 1139272496 } trans:intvector { -2019705670, -891581400, -872058600, -862637400, -764145000 } typeOffsets:intvector { 21208, 0, 19270, 0, 19800, 0, 19800, 3600, 21200, 0 } typeMap:bin { "04010203020302" } - links:intvector { 257, 288, 516 } - } //Z#288 + links:intvector { 258, 289, 517 } + } //Z#289 /* Asia/Krasnoyarsk */ :table { trans:intvector { -1577513486, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288465200, 1301166000, 1414260000 } typeOffsets:intvector { 22286, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600, 28800, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#289 - /* Asia/Kuala_Lumpur */ :int { 317 } //Z#290 + } //Z#290 + /* Asia/Kuala_Lumpur */ :int { 318 } //Z#291 /* Asia/Kuching */ :table { trans:intvector { -1383463280, -1167636600, -1082448000, -1074586800, -1050825600, -1042964400, -1019289600, -1011428400, -987753600, -979892400, -956217600, -948356400, -924595200, -916734000, -893059200, -885198000, -879667200, -767005200 } typeOffsets:intvector { 26480, 0, 27000, 0, 28800, 0, 28800, 1200, 32400, 0 } typeMap:bin { "010203020302030203020302030203020402" } - links:intvector { 256, 291 } - } //Z#291 - /* Asia/Kuwait */ :int { 311 } //Z#292 - /* Asia/Macao */ :int { 294 } //Z#293 + links:intvector { 257, 292 } + } //Z#292 + /* Asia/Kuwait */ :int { 312 } //Z#293 + /* Asia/Macao */ :int { 295 } //Z#294 /* Asia/Macau */ :table { trans:intvector { -2056692850, -884509200, -873280800, -855918000, -841744800, -828529200, -765363600, -747046800, -733827600, -716461200, -697021200, -683715600, -667990800, -654771600, -636627600, -623322000, -605178000, -591872400, -573642000, -559818000, -541674000, -528368400, -510224400, -498128400, -478774800, -466678800, -446720400, -435229200, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132820200, -117088200, -101370600, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } typeOffsets:intvector { 27250, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600 } typeMap:bin { "0103040304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 293, 294 } - } //Z#294 + links:intvector { 294, 295 } + } //Z#295 /* Asia/Magadan */ :table { trans:intvector { -1441188192, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600, 1461427200 } typeOffsets:intvector { 36192, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "010304030403040304030403040304030403040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050103" } - } //Z#295 + } //Z#296 /* Asia/Makassar */ :table { trans:intvector { -1172908656, -880272000, -766054800 } typeOffsets:intvector { 28656, 0, 28800, 0, 32400, 0 } typeMap:bin { "010201" } - links:intvector { 296, 328 } - } //Z#296 + links:intvector { 297, 329 } + } //Z#297 /* Asia/Manila */ :table { transPre32:intvector { -1, 350346264, -1, 2075884096 } trans:intvector { -1046678400, -1040115600, -885024000, -880016400, -783594000, -760093200, -496224000, -491562000, 228326400, 243702000, 643219200, 649177200 } typeOffsets:intvector { -57368, 0, 28800, 0, 28800, 3600, 29032, 0, 32400, 0 } typeMap:bin { "0301020102040201020102010201" } - } //Z#297 - /* Asia/Muscat */ :int { 267 } //Z#298 + } //Z#298 + /* Asia/Muscat */ :int { 268 } //Z#299 /* Asia/Nicosia */ :table { trans:intvector { -1518920008, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600 } typeOffsets:intvector { 8008, 0, 7200, 0, 7200, 3600 } @@ -1401,187 +1407,187 @@ zoneinfo64:table(nofallback) { finalRule { "EUAsia" } finalRaw:int { 7200 } finalYear:int { 2000 } - links:intvector { 299, 476 } - } //Z#299 + links:intvector { 300, 477 } + } //Z#300 /* Asia/Novokuznetsk */ :table { trans:intvector { -1441259328, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288468800, 1301169600 } typeOffsets:intvector { 20928, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } - } //Z#300 + } //Z#301 /* Asia/Novosibirsk */ :table { trans:intvector { -1579476700, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 738086400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1469304000 } typeOffsets:intvector { 19900, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#301 + } //Z#302 /* Asia/Omsk */ :table { trans:intvector { -1582088010, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701812800, 717537600, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600 } typeOffsets:intvector { 17610, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600, 25200, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#302 + } //Z#303 /* Asia/Oral */ :table { trans:intvector { -1441164324, -1247540400, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622591200, 638316000, 654645600, 670370400, 686095200, 695772000, 701816400, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600 } typeOffsets:intvector { 12324, 0, 10800, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010405060504050405040504050405040504030203020302040302030203020302030203020302030203020302030203020304" } - } //Z#303 - /* Asia/Phnom_Penh */ :int { 252 } //Z#304 + } //Z#304 + /* Asia/Phnom_Penh */ :int { 253 } //Z#305 /* Asia/Pontianak */ :table { trans:intvector { -1172906240, -881220600, -766054800, -683883000, -620812800, -189415800, 567964800 } typeOffsets:intvector { 26240, 0, 25200, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "02040203020301" } - } //Z#305 + } //Z#306 /* Asia/Pyongyang */ :table { trans:intvector { -1948782180, -1830414600, 1439564400, 1525446000 } typeOffsets:intvector { 30180, 0, 30600, 0, 32400, 0 } typeMap:bin { "01020102" } - } //Z#306 + } //Z#307 /* Asia/Qatar */ :table { trans:intvector { -1577935568, 76190400 } typeOffsets:intvector { 12368, 0, 10800, 0, 14400, 0 } typeMap:bin { "0201" } - links:intvector { 250, 307 } - } //Z#307 + links:intvector { 251, 308 } + } //Z#308 /* Asia/Qostanay */ :table { trans:intvector { -1441167268, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1709229600 } typeOffsets:intvector { 15268, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "01030405040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040503" } - } //Z#308 + } //Z#309 /* Asia/Qyzylorda */ :table { trans:intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695768400, 701812800, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1545328800 } typeOffsets:intvector { 15712, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "01030405040304030403040304030403040304030403020305040304030403040304030403040304030403040304030403040503" } - } //Z#309 - /* Asia/Rangoon */ :int { 336 } //Z#310 + } //Z#310 + /* Asia/Rangoon */ :int { 337 } //Z#311 /* Asia/Riyadh */ :table { trans:intvector { -719636812 } typeOffsets:intvector { 11212, 0, 10800, 0 } typeMap:bin { "01" } - links:intvector { 236, 240, 292, 311 } - } //Z#311 - /* Asia/Saigon */ :int { 273 } //Z#312 + links:intvector { 237, 241, 293, 312 } + } //Z#312 + /* Asia/Saigon */ :int { 274 } //Z#313 /* Asia/Sakhalin */ :table { trans:intvector { -2031039048, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200, 1459008000 } typeOffsets:intvector { 34248, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } typeMap:bin { "010405040504050405040504050405040504050405040302040504050405040504050403020302030203020302030203020302030203020302030203020302040204" } - } //Z#313 + } //Z#314 /* Asia/Samarkand */ :table { trans:intvector { -1441168073, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686091600 } typeOffsets:intvector { 16073, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010203040302030203020302030203020302030203020302" } - } //Z#314 + } //Z#315 /* Asia/Seoul */ :table { trans:intvector { -1948782472, -1830414600, -681210000, -672228000, -654771600, -640864800, -623408400, -609415200, -588848400, -577965600, -498128400, -462702600, -451733400, -429784200, -418296600, -399544200, -387451800, -368094600, -356002200, -336645000, -324552600, -305195400, -293103000, -264933000, 547578000, 560883600, 579027600, 592333200 } typeOffsets:intvector { 30472, 0, 30600, 0, 30600, 3600, 32400, 0, 32400, 3600 } typeMap:bin { "01030403040304030403010201020102010201020102010304030403" } - links:intvector { 315, 601 } - } //Z#315 + links:intvector { 316, 602 } + } //Z#316 /* Asia/Shanghai */ :table { transPre32:intvector { -1, 2117485353 } trans:intvector { -1600675200, -1585904400, -933667200, -922093200, -908870400, -888829200, -881049600, -767869200, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -650019600, 515527200, 527014800, 545162400, 558464400, 577216800, 589914000, 608666400, 621968400, 640116000, 653418000, 671565600, 684867600 } typeOffsets:intvector { 29143, 0, 28800, 0, 28800, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - links:intvector { 260, 261, 271, 316, 385, 550 } - } //Z#316 + links:intvector { 261, 262, 272, 317, 386, 551 } + } //Z#317 /* Asia/Singapore */ :table { trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378662400 } typeOffsets:intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } typeMap:bin { "01020304060405" } - links:intvector { 290, 317, 603 } - } //Z#317 + links:intvector { 291, 318, 604 } + } //Z#318 /* Asia/Srednekolymsk */ :table { trans:intvector { -1441188892, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600 } typeOffsets:intvector { 36892, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#318 + } //Z#319 /* Asia/Taipei */ :table { transPre32:intvector { -1, 1959718936 } trans:intvector { -1017820800, -766224000, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 299606400, 307551600 } typeOffsets:intvector { 29160, 0, 28800, 0, 28800, 3600, 32400, 0 } typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 319, 600 } - } //Z#319 + links:intvector { 320, 601 } + } //Z#320 /* Asia/Tashkent */ :table { trans:intvector { -1441168631, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600 } typeOffsets:intvector { 16631, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } typeMap:bin { "010304030403040304030403040304030403040304030201" } - } //Z#320 + } //Z#321 /* Asia/Tbilisi */ :table { trans:intvector { -1441162751, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800, 828216000, 877806000, 891115200, 909255600, 922564800, 941310000, 954014400, 972759600, 985464000, 1004209200, 1017518400, 1035658800, 1048968000, 1067108400, 1080417600, 1088276400, 1099177200, 1111878000 } typeOffsets:intvector { 10751, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040304030403040302010201020102030403040304030403040304030403040304020103" } - } //Z#321 + } //Z#322 /* Asia/Tehran */ :table { - trans:intvector { -1090466744, 227820600, 246223800, 259617600, 271108800, 283982400, 296598600, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600 } + trans:intvector { -1090466744, 227820600, 246223800, 259617600, 271108800, 279576000, 296598600, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600 } typeOffsets:intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01020304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } - links:intvector { 322, 529 } - } //Z#322 - /* Asia/Tel_Aviv */ :int { 280 } //Z#323 - /* Asia/Thimbu */ :int { 325 } //Z#324 + links:intvector { 323, 530 } + } //Z#323 + /* Asia/Tel_Aviv */ :int { 281 } //Z#324 + /* Asia/Thimbu */ :int { 326 } //Z#325 /* Asia/Thimphu */ :table { trans:intvector { -706341516, 560025000 } typeOffsets:intvector { 21516, 0, 19800, 0, 21600, 0 } typeMap:bin { "0102" } - links:intvector { 324, 325 } - } //Z#325 + links:intvector { 325, 326 } + } //Z#326 /* Asia/Tokyo */ :table { transPre32:intvector { -1, 1707254896 } trans:intvector { -683802000, -672310800, -654771600, -640861200, -620298000, -609411600, -588848400, -577962000 } typeOffsets:intvector { 33539, 0, 32400, 0, 32400, 3600 } typeMap:bin { "010201020102010201" } - links:intvector { 326, 531, 533 } - } //Z#326 + links:intvector { 327, 532, 534 } + } //Z#327 /* Asia/Tomsk */ :table { trans:intvector { -1578807591, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701809200, 717534000, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1020193200, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600, 1464465600 } typeOffsets:intvector { 20391, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304020102010201020102010201020102010201030103" } - } //Z#327 - /* Asia/Ujung_Pandang */ :int { 296 } //Z#328 + } //Z#328 + /* Asia/Ujung_Pandang */ :int { 297 } //Z#329 /* Asia/Ulaanbaatar */ :table { trans:intvector { -2032931252, 252435600, 417974400, 433782000, 449596800, 465318000, 481046400, 496767600, 512496000, 528217200, 543945600, 559666800, 575395200, 591116400, 606844800, 622566000, 638294400, 654620400, 670348800, 686070000, 701798400, 717519600, 733248000, 748969200, 764697600, 780418800, 796147200, 811868400, 828201600, 843922800, 859651200, 875372400, 891100800, 906822000, 988394400, 1001696400, 1017424800, 1033146000, 1048874400, 1064595600, 1080324000, 1096045200, 1111773600, 1127494800, 1143223200, 1159549200, 1427479200, 1443193200, 1458928800, 1474642800 } typeOffsets:intvector { 25652, 0, 25200, 0, 28800, 0, 28800, 3600 } typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } - links:intvector { 259, 329, 330 } - } //Z#329 - /* Asia/Ulan_Bator */ :int { 329 } //Z#330 + links:intvector { 260, 330, 331 } + } //Z#330 + /* Asia/Ulan_Bator */ :int { 330 } //Z#331 /* Asia/Urumqi */ :table { trans:intvector { -1325483420 } typeOffsets:intvector { 21020, 0, 21600, 0 } typeMap:bin { "01" } - links:intvector { 284, 331 } - } //Z#331 + links:intvector { 285, 332 } + } //Z#332 /* Asia/Ust-Nera */ :table { trans:intvector { -1579426374, -1247558400, 354898800, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701794800, 717519600, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1315828800, 1414249200 } typeOffsets:intvector { 34374, 0, 28800, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } typeMap:bin { "010206050605060506050605060506050605060506050403050605060506050605060506050605060506050605060506050605060506050605060506050605070503" } - } //Z#332 - /* Asia/Vientiane */ :int { 252 } //Z#333 + } //Z#333 + /* Asia/Vientiane */ :int { 253 } //Z#334 /* Asia/Vladivostok */ :table { trans:intvector { -1487321251, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701798400, 717523200, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200 } typeOffsets:intvector { 31651, 0, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#334 + } //Z#335 /* Asia/Yakutsk */ :table { trans:intvector { -1579423138, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701802000, 717526800, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800 } typeOffsets:intvector { 31138, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#335 + } //Z#336 /* Asia/Yangon */ :table { trans:intvector { -1577946287, -873268200, -778410000 } typeOffsets:intvector { 23087, 0, 23400, 0, 32400, 0 } typeMap:bin { "010201" } - links:intvector { 310, 336, 521 } - } //Z#336 + links:intvector { 311, 337, 522 } + } //Z#337 /* Asia/Yekaterinburg */ :table { trans:intvector { -1688270553, -1592610305, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701816400, 717541200, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1111870800, 1130619600, 1143320400, 1162069200, 1174770000, 1193518800, 1206824400, 1224968400, 1238274000, 1256418000, 1269723600, 1288472400, 1301173200, 1414267200 } typeOffsets:intvector { 14553, 0, 13505, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } typeMap:bin { "010204050405040504050405040504050405040504050403020405040504050405040504050405040504050405040504050405040504050405040504050405040604" } - } //Z#337 + } //Z#338 /* Asia/Yerevan */ :table { trans:intvector { -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288476000, 1301176800, 1319925600 } typeOffsets:intvector { 10680, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040304030403040302010201020102010203040304030403040304030403040304030403040304030403040304030403" } - links:intvector { 338, 543 } - } //Z#338 + links:intvector { 339, 544 } + } //Z#339 /* Atlantic/Azores */ :table { transPre32:intvector { -1, 1581063056 } trans:intvector { -1830376800, -1689548400, -1677794400, -1667426400, -1647730800, -1635890400, -1616194800, -1604354400, -1584658800, -1572732000, -1553036400, -1541196000, -1521500400, -1442444400, -1427670000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922489200, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -623275200, -607550400, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, -102542400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 725421600, 733280400, 740278800, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1590,7 +1596,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { -3600 } finalYear:int { 1997 } - } //Z#339 + } //Z#340 /* Atlantic/Bermuda */ :table { trans:intvector { -1664307642, -1648932042, -1632080442, -1618692042, -1262281242, -882727200, -858538800, -845229600, -825879600, -814384800, -793825200, -782935200, -762375600, -713988000, -703710000, -681933600, -672865200, -650484000, -641415600, -618429600, -609966000, -586980000, -578516400, -555530400, -546462000, -429127200, -415825200, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } typeOffsets:intvector { -15558, 0, -15558, 3600, -14400, 0, -14400, 3600 } @@ -1598,7 +1604,7 @@ zoneinfo64:table(nofallback) { finalRule { "US" } finalRaw:int { -14400 } finalYear:int { 2008 } - } //Z#340 + } //Z#341 /* Atlantic/Canary */ :table { trans:intvector { -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -3696, 0, -3600, 0, 0, 0, 0, 3600 } @@ -1606,13 +1612,13 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#341 + } //Z#342 /* Atlantic/Cape_Verde */ :table { trans:intvector { -1830376800, -862610400, -764118000, 186120000 } typeOffsets:intvector { -5644, 0, -7200, 0, -7200, 3600, -3600, 0 } typeMap:bin { "01020103" } - } //Z#342 - /* Atlantic/Faeroe */ :int { 344 } //Z#343 + } //Z#343 + /* Atlantic/Faeroe */ :int { 345 } //Z#344 /* Atlantic/Faroe */ :table { trans:intvector { -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -1624, 0, 0, 0, 0, 3600 } @@ -1620,9 +1626,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 343, 344 } - } //Z#344 - /* Atlantic/Jan_Mayen */ :int { 447 } //Z#345 + links:intvector { 344, 345 } + } //Z#345 + /* Atlantic/Jan_Mayen */ :int { 448 } //Z#346 /* Atlantic/Madeira */ :table { trans:intvector { -1830380400, -1689552000, -1677798000, -1667430000, -1647734400, -1635894000, -1616198400, -1604358000, -1584662400, -1572735600, -1553040000, -1541199600, -1521504000, -1442448000, -1427673600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922492800, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -623278800, -607554000, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, -102546000, 386726400, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -4056, 0, -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 } @@ -1630,20 +1636,20 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - } //Z#346 - /* Atlantic/Reykjavik */ :int { 5 } //Z#347 + } //Z#347 + /* Atlantic/Reykjavik */ :int { 5 } //Z#348 /* Atlantic/South_Georgia */ :table { transPre32:intvector { -1, 1770454464 } typeOffsets:intvector { -8768, 0, -7200, 0 } typeMap:bin { "01" } - } //Z#348 - /* Atlantic/St_Helena */ :int { 5 } //Z#349 + } //Z#349 + /* Atlantic/St_Helena */ :int { 5 } //Z#350 /* Atlantic/Stanley */ :table { trans:intvector { -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400, 987310800, 999410400, 1019365200, 1030860000, 1050814800, 1062914400, 1082264400, 1094364000, 1113714000, 1125813600, 1145163600, 1157263200, 1176613200, 1188712800, 1208667600, 1220767200, 1240117200, 1252216800, 1271566800, 1283666400 } typeOffsets:intvector { -13884, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } typeMap:bin { "010201020102010201020102010304030403020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } - } //Z#350 - /* Australia/ACT */ :int { 369 } //Z#351 + } //Z#351 + /* Australia/ACT */ :int { 370 } //Z#352 /* Australia/Adelaide */ :table { transPre32:intvector { -1, 1930857236, -1, 2064778096 } trans:intvector { -1672558200, -1665387000, -883639800, -876123000, -860398200, -844673400, -828343800, -813223800, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200, 796149000, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } @@ -1652,15 +1658,15 @@ zoneinfo64:table(nofallback) { finalRule { "AS" } finalRaw:int { 34200 } finalYear:int { 2009 } - links:intvector { 352, 368 } - } //Z#352 + links:intvector { 353, 369 } + } //Z#353 /* Australia/Brisbane */ :table { transPre32:intvector { -1, 1928175368 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 } typeOffsets:intvector { 36728, 0, 36000, 0, 36000, 3600 } typeMap:bin { "0102010201020102010201020102010201" } - links:intvector { 353, 367 } - } //Z#353 + links:intvector { 354, 368 } + } //Z#354 /* Australia/Broken_Hill */ :table { transPre32:intvector { -1, 1930856548, -1, 1980016096, -1, 2064778096 } trans:intvector { -1672558200, -1665387000, -883639800, -876123000, -860398200, -844673400, -828343800, -813223800, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200, 794334600, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } @@ -1669,23 +1675,23 @@ zoneinfo64:table(nofallback) { finalRule { "AS" } finalRaw:int { 34200 } finalYear:int { 2009 } - links:intvector { 354, 373 } - } //Z#354 - /* Australia/Canberra */ :int { 369 } //Z#355 - /* Australia/Currie */ :int { 359 } //Z#356 + links:intvector { 355, 374 } + } //Z#355 + /* Australia/Canberra */ :int { 370 } //Z#356 + /* Australia/Currie */ :int { 360 } //Z#357 /* Australia/Darwin */ :table { transPre32:intvector { -1, 1930859096, -1, 2064778096 } trans:intvector { -1672558200, -1665387000, -883639800, -876123000, -860398200, -844673400, -828343800, -813223800 } typeOffsets:intvector { 31400, 0, 32400, 0, 34200, 0, 34200, 3600 } typeMap:bin { "01020302030203020302" } - links:intvector { 0, 357, 365 } - } //Z#357 + links:intvector { 0, 358, 366 } + } //Z#358 /* Australia/Eucla */ :table { transPre32:intvector { -1, 1957038768 } trans:intvector { -1672555500, -1665384300, -883637100, -876120300, -860395500, -844670700, 152039700, 162926100, 436295700, 447182100, 690311700, 699383700, 1165079700, 1174756500, 1193505300, 1206810900, 1224954900, 1238260500 } typeOffsets:intvector { 30928, 0, 31500, 0, 31500, 3600 } typeMap:bin { "01020102010201020102010201020102010201" } - } //Z#358 + } //Z#359 /* Australia/Hobart */ :table { transPre32:intvector { -1, 1949171940 } trans:intvector { -1680508800, -1665388800, -1646640000, -1635753600, -1615190400, -1604304000, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } @@ -1694,15 +1700,15 @@ zoneinfo64:table(nofallback) { finalRule { "AT" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 356, 359, 370 } - } //Z#359 - /* Australia/LHI */ :int { 362 } //Z#360 + links:intvector { 357, 360, 371 } + } //Z#360 + /* Australia/LHI */ :int { 363 } //Z#361 /* Australia/Lindeman */ :table { transPre32:intvector { -1, 1928176340 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200 } typeOffsets:intvector { 35756, 0, 36000, 0, 36000, 3600 } typeMap:bin { "010201020102010201020102010201020102010201" } - } //Z#361 + } //Z#362 /* Australia/Lord_Howe */ :table { transPre32:intvector { -1, 1930852316 } trans:intvector { 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800, 985446000, 1004196600, 1017500400, 1035646200, 1048950000, 1067095800, 1080399600, 1099150200, 1111849200, 1130599800, 1143903600, 1162049400, 1174748400, 1193499000, 1207407600, 1223134200 } @@ -1711,8 +1717,8 @@ zoneinfo64:table(nofallback) { finalRule { "LH" } finalRaw:int { 37800 } finalYear:int { 2009 } - links:intvector { 360, 362 } - } //Z#362 + links:intvector { 361, 363 } + } //Z#363 /* Australia/Melbourne */ :table { transPre32:intvector { -1, 1930855704 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } @@ -1721,19 +1727,19 @@ zoneinfo64:table(nofallback) { finalRule { "AV" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 363, 371 } - } //Z#363 - /* Australia/NSW */ :int { 369 } //Z#364 - /* Australia/North */ :int { 357 } //Z#365 + links:intvector { 364, 372 } + } //Z#364 + /* Australia/NSW */ :int { 370 } //Z#365 + /* Australia/North */ :int { 358 } //Z#366 /* Australia/Perth */ :table { transPre32:intvector { -1, 1957041892 } trans:intvector { -1672552800, -1665381600, -883634400, -876117600, -860392800, -844668000, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400, 1165082400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200 } typeOffsets:intvector { 27804, 0, 28800, 0, 28800, 3600 } typeMap:bin { "01020102010201020102010201020102010201" } - links:intvector { 366, 372 } - } //Z#366 - /* Australia/Queensland */ :int { 353 } //Z#367 - /* Australia/South */ :int { 352 } //Z#368 + links:intvector { 367, 373 } + } //Z#367 + /* Australia/Queensland */ :int { 354 } //Z#368 + /* Australia/South */ :int { 353 } //Z#369 /* Australia/Sydney */ :table { transPre32:intvector { -1, 1930854204 } trans:intvector { -1672560000, -1665388800, -883641600, -876124800, -860400000, -844675200, -828345600, -813225600, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } @@ -1742,140 +1748,140 @@ zoneinfo64:table(nofallback) { finalRule { "AN" } finalRaw:int { 36000 } finalYear:int { 2009 } - links:intvector { 1, 351, 355, 364, 369 } - } //Z#369 - /* Australia/Tasmania */ :int { 359 } //Z#370 - /* Australia/Victoria */ :int { 363 } //Z#371 - /* Australia/West */ :int { 366 } //Z#372 - /* Australia/Yancowinna */ :int { 354 } //Z#373 - /* BET */ :int { 204 } //Z#374 - /* BST */ :int { 265 } //Z#375 - /* Brazil/Acre */ :int { 198 } //Z#376 - /* Brazil/DeNoronha */ :int { 177 } //Z#377 - /* Brazil/East */ :int { 204 } //Z#378 - /* Brazil/West */ :int { 157 } //Z#379 - /* CAT */ :int { 43 } //Z#380 - /* CET */ :int { 449 } //Z#381 - /* CNT */ :int { 209 } //Z#382 - /* CST */ :int { 98 } //Z#383 - /* CST6CDT */ :int { 98 } //Z#384 - /* CTT */ :int { 316 } //Z#385 - /* Canada/Atlantic */ :int { 129 } //Z#386 - /* Canada/Central */ :int { 224 } //Z#387 - /* Canada/East-Saskatchewan */ :int { 196 } //Z#388 - /* Canada/Eastern */ :int { 219 } //Z#389 - /* Canada/Mountain */ :int { 113 } //Z#390 - /* Canada/Newfoundland */ :int { 209 } //Z#391 - /* Canada/Pacific */ :int { 221 } //Z#392 - /* Canada/Saskatchewan */ :int { 196 } //Z#393 - /* Canada/Yukon */ :int { 223 } //Z#394 - /* Chile/Continental */ :int { 202 } //Z#395 - /* Chile/EasterIsland */ :int { 559 } //Z#396 - /* Cuba */ :int { 130 } //Z#397 - /* EAT */ :int { 48 } //Z#398 - /* ECT */ :int { 478 } //Z#399 - /* EET */ :int { 444 } //Z#400 - /* EST */ :int { 183 } //Z#401 - /* EST5EDT */ :int { 174 } //Z#402 - /* Egypt */ :int { 18 } //Z#403 - /* Eire */ :int { 455 } //Z#404 + links:intvector { 1, 352, 356, 365, 370 } + } //Z#370 + /* Australia/Tasmania */ :int { 360 } //Z#371 + /* Australia/Victoria */ :int { 364 } //Z#372 + /* Australia/West */ :int { 367 } //Z#373 + /* Australia/Yancowinna */ :int { 355 } //Z#374 + /* BET */ :int { 205 } //Z#375 + /* BST */ :int { 266 } //Z#376 + /* Brazil/Acre */ :int { 199 } //Z#377 + /* Brazil/DeNoronha */ :int { 178 } //Z#378 + /* Brazil/East */ :int { 205 } //Z#379 + /* Brazil/West */ :int { 158 } //Z#380 + /* CAT */ :int { 43 } //Z#381 + /* CET */ :int { 450 } //Z#382 + /* CNT */ :int { 210 } //Z#383 + /* CST */ :int { 98 } //Z#384 + /* CST6CDT */ :int { 98 } //Z#385 + /* CTT */ :int { 317 } //Z#386 + /* Canada/Atlantic */ :int { 130 } //Z#387 + /* Canada/Central */ :int { 225 } //Z#388 + /* Canada/East-Saskatchewan */ :int { 197 } //Z#389 + /* Canada/Eastern */ :int { 220 } //Z#390 + /* Canada/Mountain */ :int { 114 } //Z#391 + /* Canada/Newfoundland */ :int { 210 } //Z#392 + /* Canada/Pacific */ :int { 222 } //Z#393 + /* Canada/Saskatchewan */ :int { 197 } //Z#394 + /* Canada/Yukon */ :int { 224 } //Z#395 + /* Chile/Continental */ :int { 203 } //Z#396 + /* Chile/EasterIsland */ :int { 560 } //Z#397 + /* Cuba */ :int { 131 } //Z#398 + /* EAT */ :int { 48 } //Z#399 + /* ECT */ :int { 479 } //Z#400 + /* EET */ :int { 445 } //Z#401 + /* EST */ :int { 184 } //Z#402 + /* EST5EDT */ :int { 175 } //Z#403 + /* Egypt */ :int { 18 } //Z#404 + /* Eire */ :int { 456 } //Z#405 /* Etc/GMT */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 405, 406, 419, 434, 435, 508, 509, 510, 511, 512 } - } //Z#405 - /* Etc/GMT+0 */ :int { 405 } //Z#406 + links:intvector { 406, 407, 420, 435, 436, 509, 510, 511, 512, 513 } + } //Z#406 + /* Etc/GMT+0 */ :int { 406 } //Z#407 /* Etc/GMT+1 */ :table { typeOffsets:intvector { -3600, 0 } - } //Z#407 + } //Z#408 /* Etc/GMT+10 */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#408 + } //Z#409 /* Etc/GMT+11 */ :table { typeOffsets:intvector { -39600, 0 } - } //Z#409 + } //Z#410 /* Etc/GMT+12 */ :table { typeOffsets:intvector { -43200, 0 } - } //Z#410 + } //Z#411 /* Etc/GMT+2 */ :table { typeOffsets:intvector { -7200, 0 } - } //Z#411 + } //Z#412 /* Etc/GMT+3 */ :table { typeOffsets:intvector { -10800, 0 } - } //Z#412 + } //Z#413 /* Etc/GMT+4 */ :table { typeOffsets:intvector { -14400, 0 } - } //Z#413 + } //Z#414 /* Etc/GMT+5 */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#414 + } //Z#415 /* Etc/GMT+6 */ :table { typeOffsets:intvector { -21600, 0 } - } //Z#415 + } //Z#416 /* Etc/GMT+7 */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#416 + } //Z#417 /* Etc/GMT+8 */ :table { typeOffsets:intvector { -28800, 0 } - } //Z#417 + } //Z#418 /* Etc/GMT+9 */ :table { typeOffsets:intvector { -32400, 0 } - } //Z#418 - /* Etc/GMT-0 */ :int { 405 } //Z#419 + } //Z#419 + /* Etc/GMT-0 */ :int { 406 } //Z#420 /* Etc/GMT-1 */ :table { typeOffsets:intvector { 3600, 0 } - } //Z#420 + } //Z#421 /* Etc/GMT-10 */ :table { typeOffsets:intvector { 36000, 0 } - } //Z#421 + } //Z#422 /* Etc/GMT-11 */ :table { typeOffsets:intvector { 39600, 0 } - } //Z#422 + } //Z#423 /* Etc/GMT-12 */ :table { typeOffsets:intvector { 43200, 0 } - } //Z#423 + } //Z#424 /* Etc/GMT-13 */ :table { typeOffsets:intvector { 46800, 0 } - } //Z#424 + } //Z#425 /* Etc/GMT-14 */ :table { typeOffsets:intvector { 50400, 0 } - } //Z#425 + } //Z#426 /* Etc/GMT-2 */ :table { typeOffsets:intvector { 7200, 0 } - } //Z#426 + } //Z#427 /* Etc/GMT-3 */ :table { typeOffsets:intvector { 10800, 0 } - } //Z#427 + } //Z#428 /* Etc/GMT-4 */ :table { typeOffsets:intvector { 14400, 0 } - } //Z#428 + } //Z#429 /* Etc/GMT-5 */ :table { typeOffsets:intvector { 18000, 0 } - } //Z#429 + } //Z#430 /* Etc/GMT-6 */ :table { typeOffsets:intvector { 21600, 0 } - } //Z#430 + } //Z#431 /* Etc/GMT-7 */ :table { typeOffsets:intvector { 25200, 0 } - } //Z#431 + } //Z#432 /* Etc/GMT-8 */ :table { typeOffsets:intvector { 28800, 0 } - } //Z#432 + } //Z#433 /* Etc/GMT-9 */ :table { typeOffsets:intvector { 32400, 0 } - } //Z#433 - /* Etc/GMT0 */ :int { 405 } //Z#434 - /* Etc/Greenwich */ :int { 405 } //Z#435 - /* Etc/UCT */ :int { 437 } //Z#436 + } //Z#434 + /* Etc/GMT0 */ :int { 406 } //Z#435 + /* Etc/Greenwich */ :int { 406 } //Z#436 + /* Etc/UCT */ :int { 438 } //Z#437 /* Etc/UTC */ :table { typeOffsets:intvector { 0, 0 } - links:intvector { 436, 437, 438, 440, 618, 632, 633, 637 } - } //Z#437 - /* Etc/Universal */ :int { 437 } //Z#438 + links:intvector { 437, 438, 439, 441, 619, 633, 634, 638 } + } //Z#438 + /* Etc/Universal */ :int { 438 } //Z#439 /* Etc/Unknown */ :table { typeOffsets:intvector { 0, 0 } - } //Z#439 - /* Etc/Zulu */ :int { 437 } //Z#440 - /* Europe/Amsterdam */ :int { 449 } //Z#441 + } //Z#440 + /* Etc/Zulu */ :int { 438 } //Z#441 + /* Europe/Amsterdam */ :int { 450 } //Z#442 /* Europe/Andorra */ :table { transPre32:intvector { -1, 2117514132 } trans:intvector { -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1884,12 +1890,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#442 + } //Z#443 /* Europe/Astrakhan */ :table { trans:intvector { -1441249932, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } typeOffsets:intvector { 11532, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403040302010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#443 + } //Z#444 /* Europe/Athens */ :table { trans:intvector { -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5692, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } @@ -1897,9 +1903,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - links:intvector { 400, 444 } - } //Z#444 - /* Europe/Belfast */ :int { 468 } //Z#445 + links:intvector { 401, 445 } + } //Z#445 + /* Europe/Belfast */ :int { 469 } //Z#446 /* Europe/Belgrade */ :table { transPre32:intvector { -1, 1581051976 } trans:intvector { -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1908,8 +1914,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 446, 467, 479, 485, 488, 502 } - } //Z#446 + links:intvector { 447, 468, 480, 486, 489, 503 } + } //Z#447 /* Europe/Berlin */ :table { transPre32:intvector { -1, 1872912888 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717631200, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1918,9 +1924,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 239, 345, 447, 454, 477, 490 } - } //Z#447 - /* Europe/Bratislava */ :int { 480 } //Z#448 + links:intvector { 240, 346, 448, 455, 478, 491 } + } //Z#448 + /* Europe/Bratislava */ :int { 481 } //Z#449 /* Europe/Brussels */ :table { transPre32:intvector { -1, 1843972096 } trans:intvector { -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1929,8 +1935,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 381, 441, 449, 469, 536 } - } //Z#449 + links:intvector { 382, 442, 450, 470, 537 } + } //Z#450 /* Europe/Bucharest */ :table { trans:intvector { -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } typeOffsets:intvector { 6264, 0, 7200, 0, 7200, 3600 } @@ -1938,7 +1944,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - } //Z#450 + } //Z#451 /* Europe/Budapest */ :table { transPre32:intvector { -1, 1796706716 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600470000, -1587250800, -1569711600, -1555196400, -906775200, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762656400, -749689200, -733276800, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -492656400, -481168800, -461199600, -449708400, -428540400, -418258800, -397090800, -386809200, 323823600, 338943600, 354668400, 370393200, 386118000, 401842800, 417567600, 433292400, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1947,8 +1953,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#451 - /* Europe/Busingen */ :int { 504 } //Z#452 + } //Z#452 + /* Europe/Busingen */ :int { 505 } //Z#453 /* Europe/Chisinau */ :table { transPre32:intvector { -1, 1454819576 } trans:intvector { -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 641944800, 654652800, 670377600, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859680000, 877824000 } @@ -1957,9 +1963,9 @@ zoneinfo64:table(nofallback) { finalRule { "Moldova" } finalRaw:int { 7200 } finalYear:int { 1998 } - links:intvector { 453, 493 } - } //Z#453 - /* Europe/Copenhagen */ :int { 447 } //Z#454 + links:intvector { 454, 494 } + } //Z#454 + /* Europe/Copenhagen */ :int { 448 } //Z#455 /* Europe/Dublin */ :table { trans:intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733356000, -719445600, -699487200, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } typeOffsets:intvector { -1521, 0, -1521, 3600, 0, 0, 0, 3600, 3600, 0 } @@ -1967,8 +1973,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 404, 455 } - } //Z#455 + links:intvector { 405, 456 } + } //Z#456 /* Europe/Gibraltar */ :table { transPre32:intvector { -1, 1473317380 } trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -1977,8 +1983,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#456 - /* Europe/Guernsey */ :int { 468 } //Z#457 + } //Z#457 + /* Europe/Guernsey */ :int { 469 } //Z#458 /* Europe/Helsinki */ :table { trans:intvector { -1535938789, -875671200, -859773600, 354672000, 370396800, 386121600, 401846400, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5989, 0, 7200, 0, 7200, 3600 } @@ -1986,29 +1992,29 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1997 } - links:intvector { 458, 472 } - } //Z#458 - /* Europe/Isle_of_Man */ :int { 468 } //Z#459 + links:intvector { 459, 473 } + } //Z#459 + /* Europe/Isle_of_Man */ :int { 469 } //Z#460 /* Europe/Istanbul */ :table { transPre32:intvector { -1, 1454819544 } trans:intvector { -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931053600, -922676400, -917834400, -892436400, -875844000, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -622087200, -606970800, -590032800, -575521200, -235620000, -194842800, -177732000, -165726000, 107910000, 121215600, 133920000, 152665200, 164678400, 184114800, 196214400, 215564400, 228873600, 245804400, 260323200, 267915600, 428454000, 433893600, 468111600, 482799600, 496710000, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686098800, 701823600, 717548400, 733273200, 748998000, 764118000, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301274000, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396227600, 1414285200, 1427590800, 1446944400, 1459040400, 1473195600 } typeOffsets:intvector { 6952, 0, 7016, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030405040203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } - links:intvector { 277, 460, 617 } - } //Z#460 - /* Europe/Jersey */ :int { 468 } //Z#461 + links:intvector { 278, 461, 618 } + } //Z#461 + /* Europe/Jersey */ :int { 469 } //Z#462 /* Europe/Kaliningrad */ :table { transPre32:intvector { -1, 1872911176 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780372000, -778730400, -762663600, -749095200, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1414278000 } typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "0102010201020102010201020102030403050605060506050605060506050605060504030403040304030403040304030403040304030403040304030403040304030403040304030403040304030503" } - } //Z#462 - /* Europe/Kiev */ :int { 465 } //Z#463 + } //Z#463 + /* Europe/Kiev */ :int { 466 } //Z#464 /* Europe/Kirov */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } typeOffsets:intvector { 11928, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "010304030403040304030403040304030403020102010302010201020102010201020102010201020102010201020102010201020102010201020102010301" } - } //Z#464 + } //Z#465 /* Europe/Kyiv */ :table { trans:intvector { -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 646783200, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846378000, 859683600, 877827600 } typeOffsets:intvector { 7324, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2016,8 +2022,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - links:intvector { 463, 465, 495, 503 } - } //Z#465 + links:intvector { 464, 466, 496, 504 } + } //Z#466 /* Europe/Lisbon */ :table { trans:intvector { -1830384000, -1689555600, -1677801600, -1667433600, -1647738000, -1635897600, -1616202000, -1604361600, -1584666000, -1572739200, -1553043600, -1541203200, -1521507600, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922496400, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -623282400, -607557600, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, -102549600, 212544000, 228268800, 243993600, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { -2205, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } @@ -2025,9 +2031,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 466, 599, 636 } - } //Z#466 - /* Europe/Ljubljana */ :int { 446 } //Z#467 + links:intvector { 467, 600, 637 } + } //Z#467 + /* Europe/Ljubljana */ :int { 447 } //Z#468 /* Europe/London */ :table { transPre32:intvector { -1, 442304971 } trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } @@ -2036,9 +2042,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 0 } finalYear:int { 1997 } - links:intvector { 445, 457, 459, 461, 468, 506, 507 } - } //Z#468 - /* Europe/Luxembourg */ :int { 449 } //Z#469 + links:intvector { 446, 458, 460, 462, 469, 507, 508 } + } //Z#469 + /* Europe/Luxembourg */ :int { 450 } //Z#470 /* Europe/Madrid */ :table { transPre32:intvector { -1, 2117514496 } trans:intvector { -1631926800, -1616889600, -1601168400, -1585353600, -1442451600, -1427673600, -1379293200, -1364774400, -1348448400, -1333324800, -1316390400, -1301270400, -1284339600, -1269820800, -1026954000, -1017619200, -1001898000, -999482400, -986090400, -954115200, -940208400, -873079200, -862621200, -842839200, -828320400, -811389600, -796870800, -779940000, -765421200, -748490400, -733971600, -652327200, -639018000, 135122400, 150246000, 166572000, 181695600, 196812000, 212540400, 228866400, 243990000, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2047,7 +2053,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#470 + } //Z#471 /* Europe/Malta */ :table { transPre32:intvector { -1, 1891488612 } trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812588400, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2056,23 +2062,23 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#471 - /* Europe/Mariehamn */ :int { 458 } //Z#472 + } //Z#472 + /* Europe/Mariehamn */ :int { 459 } //Z#473 /* Europe/Minsk */ :table { transPre32:intvector { -1, 1454819880 } trans:intvector { -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000 } typeOffsets:intvector { 6616, 0, 3600, 0, 3600, 3600, 6600, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } typeMap:bin { "0304060201020102060706070607060706070607060706070607060504050405040504050405040504050405040504050405040504050405040504050405040504050406" } - } //Z#473 - /* Europe/Monaco */ :int { 478 } //Z#474 + } //Z#474 + /* Europe/Monaco */ :int { 479 } //Z#475 /* Europe/Moscow */ :table { trans:intvector { -1688265017, -1656819079, -1641353479, -1627965079, -1618716679, -1596429079, -1593820800, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } typeOffsets:intvector { 9017, 0, 7200, 0, 7200, 3600, 9079, 0, 9079, 3600, 9079, 7200, 10800, 0, 10800, 3600, 10800, 7200, 14400, 0 } typeMap:bin { "0304030504050706070807060106070607060706070607060706070607060706070602010607060706070607060706070607060706070607060706070607060706070607060706070607060906" } - links:intvector { 475, 635 } - } //Z#475 - /* Europe/Nicosia */ :int { 299 } //Z#476 - /* Europe/Oslo */ :int { 447 } //Z#477 + links:intvector { 476, 636 } + } //Z#476 + /* Europe/Nicosia */ :int { 300 } //Z#477 + /* Europe/Oslo */ :int { 448 } //Z#478 /* Europe/Paris */ :table { trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 561, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } @@ -2080,9 +2086,9 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 399, 474, 478 } - } //Z#478 - /* Europe/Podgorica */ :int { 446 } //Z#479 + links:intvector { 400, 475, 479 } + } //Z#479 + /* Europe/Podgorica */ :int { 447 } //Z#480 /* Europe/Prague */ :table { transPre32:intvector { -1, 1825565432 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -746578800, -733359600, -728517600, -721260000, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2091,8 +2097,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 448, 480 } - } //Z#480 + links:intvector { 449, 481 } + } //Z#481 /* Europe/Riga */ :table { trans:intvector { -1632008194, -1618702594, -1601681794, -1597275394, -1377308194, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 843955200, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 985482000, 1004230800 } typeOffsets:intvector { 5794, 0, 3600, 0, 3600, 3600, 5794, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2100,7 +2106,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2002 } - } //Z#481 + } //Z#482 /* Europe/Rome */ :table { transPre32:intvector { -1, 1891402096 } trans:intvector { -1690765200, -1680487200, -1664758800, -1648951200, -1635123600, -1616896800, -1604278800, -1585533600, -1571014800, -1555293600, -932432400, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71715600, -50547600, -40266000, -18493200, -8211600, 12956400, 23238000, 43801200, 54687600, 75855600, 86742000, 107910000, 118191600, 138754800, 149641200, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2109,27 +2115,27 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 482, 484, 497 } - } //Z#482 + links:intvector { 483, 485, 498 } + } //Z#483 /* Europe/Samara */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701820000, 717544800, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288479600, 1301180400 } typeOffsets:intvector { 12020, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "02040504050405040504050405040504050403020302010204050405040504050405040504050405040504050405040504050405040504050405040504030204" } - } //Z#483 - /* Europe/San_Marino */ :int { 482 } //Z#484 - /* Europe/Sarajevo */ :int { 446 } //Z#485 + } //Z#484 + /* Europe/San_Marino */ :int { 483 } //Z#485 + /* Europe/Sarajevo */ :int { 447 } //Z#486 /* Europe/Saratov */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1480806000 } typeOffsets:intvector { 11058, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "01030403040304030403040304030403020102010201030201020102010201020102010201020102010201020102010201020102010201020102010201030103" } - } //Z#486 + } //Z#487 /* Europe/Simferopol */ :table { transPre32:intvector { -1, 1454818312 } trans:intvector { -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 701827200, 717552000, 733276800, 749001600, 764726400, 767739600, 780447600, 796172400, 811897200, 828219600, 846374400, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396137600, 1414274400 } typeOffsets:intvector { 8184, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8160, 0, 10800, 0, 10800, 3600, 14400, 0 } typeMap:bin { "050306020102010206070607060706070607060706070607060706030403040304070607060706040304030403040304030403040304030403040304030403040304030403040304030806" } - } //Z#487 - /* Europe/Skopje */ :int { 446 } //Z#488 + } //Z#488 + /* Europe/Skopje */ :int { 447 } //Z#489 /* Europe/Sofia */ :table { transPre32:intvector { -1, 1454820900, -1, 1925440280 } trans:intvector { -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } @@ -2138,8 +2144,8 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 1998 } - } //Z#489 - /* Europe/Stockholm */ :int { 447 } //Z#490 + } //Z#490 + /* Europe/Stockholm */ :int { 448 } //Z#491 /* Europe/Tallinn */ :table { trans:intvector { -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909277200, 922582800, 941331600, 1017536400, 1035680400 } typeOffsets:intvector { 5940, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } @@ -2147,7 +2153,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2003 } - } //Z#491 + } //Z#492 /* Europe/Tirane */ :table { trans:intvector { -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 4760, 0, 3600, 0, 3600, 3600 } @@ -2155,16 +2161,16 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#492 - /* Europe/Tiraspol */ :int { 453 } //Z#493 + } //Z#493 + /* Europe/Tiraspol */ :int { 454 } //Z#494 /* Europe/Ulyanovsk */ :table { trans:intvector { -1593820800, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1459033200 } typeOffsets:intvector { 11616, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "030506050605060506050605060506050605040304030201030403040304030403040304030403040304030403040304030403040304030403040304030403050305" } - } //Z#494 - /* Europe/Uzhgorod */ :int { 465 } //Z#495 - /* Europe/Vaduz */ :int { 504 } //Z#496 - /* Europe/Vatican */ :int { 482 } //Z#497 + } //Z#495 + /* Europe/Uzhgorod */ :int { 466 } //Z#496 + /* Europe/Vaduz */ :int { 505 } //Z#497 + /* Europe/Vatican */ :int { 483 } //Z#498 /* Europe/Vienna */ :table { transPre32:intvector { -1, 1872912175 } trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -748479600, -733273200, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2173,7 +2179,7 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - } //Z#498 + } //Z#499 /* Europe/Vilnius */ :table { transPre32:intvector { -1, 1454820420 } trans:intvector { -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891133200, 909277200, 922582800, 941331600, 1048986000, 1067130000 } @@ -2182,12 +2188,12 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 7200 } finalYear:int { 2004 } - } //Z#499 + } //Z#500 /* Europe/Volgograd */ :table { trans:intvector { -1577761060, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 701820000, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400, 1540681200, 1609020000 } typeOffsets:intvector { 10660, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } typeMap:bin { "0103040304030403040304030403040302010201020103020102010201020102010201020102010201020102010201020102010201020102010201020103010301" } - } //Z#500 + } //Z#501 /* Europe/Warsaw */ :table { trans:intvector { -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796608000, -778726800, -762660000, -748486800, -733273200, -715215600, -701910000, -684975600, -670460400, -654130800, -639010800, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } typeOffsets:intvector { 5040, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } @@ -2195,10 +2201,10 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 501, 598 } - } //Z#501 - /* Europe/Zagreb */ :int { 446 } //Z#502 - /* Europe/Zaporozhye */ :int { 465 } //Z#503 + links:intvector { 502, 599 } + } //Z#502 + /* Europe/Zagreb */ :int { 447 } //Z#503 + /* Europe/Zaporozhye */ :int { 466 } //Z#504 /* Europe/Zurich */ :table { transPre32:intvector { -1, 619768448, -1, 1909720710 } trans:intvector { -904435200, -891129600, -872985600, -859680000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } @@ -2207,79 +2213,79 @@ zoneinfo64:table(nofallback) { finalRule { "EU" } finalRaw:int { 3600 } finalYear:int { 1997 } - links:intvector { 452, 496, 504 } - } //Z#504 + links:intvector { 453, 497, 505 } + } //Z#505 /* Factory */ :table { typeOffsets:intvector { 0, 0 } - } //Z#505 - /* GB */ :int { 468 } //Z#506 - /* GB-Eire */ :int { 468 } //Z#507 - /* GMT */ :int { 405 } //Z#508 - /* GMT+0 */ :int { 405 } //Z#509 - /* GMT-0 */ :int { 405 } //Z#510 - /* GMT0 */ :int { 405 } //Z#511 - /* Greenwich */ :int { 405 } //Z#512 - /* HST */ :int { 569 } //Z#513 - /* Hongkong */ :int { 274 } //Z#514 - /* IET */ :int { 132 } //Z#515 - /* IST */ :int { 288 } //Z#516 - /* Iceland */ :int { 5 } //Z#517 - /* Indian/Antananarivo */ :int { 48 } //Z#518 + } //Z#506 + /* GB */ :int { 469 } //Z#507 + /* GB-Eire */ :int { 469 } //Z#508 + /* GMT */ :int { 406 } //Z#509 + /* GMT+0 */ :int { 406 } //Z#510 + /* GMT-0 */ :int { 406 } //Z#511 + /* GMT0 */ :int { 406 } //Z#512 + /* Greenwich */ :int { 406 } //Z#513 + /* HST */ :int { 570 } //Z#514 + /* Hongkong */ :int { 275 } //Z#515 + /* IET */ :int { 133 } //Z#516 + /* IST */ :int { 289 } //Z#517 + /* Iceland */ :int { 5 } //Z#518 + /* Indian/Antananarivo */ :int { 48 } //Z#519 /* Indian/Chagos */ :table { trans:intvector { -1988167780, 820436400 } typeOffsets:intvector { 17380, 0, 18000, 0, 21600, 0 } typeMap:bin { "0102" } - } //Z#519 - /* Indian/Christmas */ :int { 252 } //Z#520 - /* Indian/Cocos */ :int { 336 } //Z#521 - /* Indian/Comoro */ :int { 48 } //Z#522 - /* Indian/Kerguelen */ :int { 525 } //Z#523 - /* Indian/Mahe */ :int { 267 } //Z#524 + } //Z#520 + /* Indian/Christmas */ :int { 253 } //Z#521 + /* Indian/Cocos */ :int { 337 } //Z#522 + /* Indian/Comoro */ :int { 48 } //Z#523 + /* Indian/Kerguelen */ :int { 526 } //Z#524 + /* Indian/Mahe */ :int { 268 } //Z#525 /* Indian/Maldives */ :table { trans:intvector { -315636840 } typeOffsets:intvector { 17640, 0, 18000, 0 } typeMap:bin { "01" } - links:intvector { 523, 525 } - } //Z#525 + links:intvector { 524, 526 } + } //Z#526 /* Indian/Mauritius */ :table { trans:intvector { -1988164200, 403041600, 417034800, 1224972000, 1238274000 } typeOffsets:intvector { 13800, 0, 14400, 0, 14400, 3600 } typeMap:bin { "0102010201" } - } //Z#526 - /* Indian/Mayotte */ :int { 48 } //Z#527 - /* Indian/Reunion */ :int { 267 } //Z#528 - /* Iran */ :int { 322 } //Z#529 - /* Israel */ :int { 280 } //Z#530 - /* JST */ :int { 326 } //Z#531 - /* Jamaica */ :int { 143 } //Z#532 - /* Japan */ :int { 326 } //Z#533 - /* Kwajalein */ :int { 574 } //Z#534 - /* Libya */ :int { 56 } //Z#535 - /* MET */ :int { 449 } //Z#536 - /* MIT */ :int { 554 } //Z#537 - /* MST */ :int { 186 } //Z#538 - /* MST7MDT */ :int { 110 } //Z#539 - /* Mexico/BajaNorte */ :int { 218 } //Z#540 - /* Mexico/BajaSur */ :int { 161 } //Z#541 - /* Mexico/General */ :int { 166 } //Z#542 - /* NET */ :int { 338 } //Z#543 - /* NST */ :int { 555 } //Z#544 - /* NZ */ :int { 555 } //Z#545 - /* NZ-CHAT */ :int { 557 } //Z#546 - /* Navajo */ :int { 110 } //Z#547 - /* PLT */ :int { 283 } //Z#548 - /* PNT */ :int { 186 } //Z#549 - /* PRC */ :int { 316 } //Z#550 - /* PRT */ :int { 191 } //Z#551 - /* PST */ :int { 152 } //Z#552 - /* PST8PDT */ :int { 152 } //Z#553 + } //Z#527 + /* Indian/Mayotte */ :int { 48 } //Z#528 + /* Indian/Reunion */ :int { 268 } //Z#529 + /* Iran */ :int { 323 } //Z#530 + /* Israel */ :int { 281 } //Z#531 + /* JST */ :int { 327 } //Z#532 + /* Jamaica */ :int { 144 } //Z#533 + /* Japan */ :int { 327 } //Z#534 + /* Kwajalein */ :int { 575 } //Z#535 + /* Libya */ :int { 56 } //Z#536 + /* MET */ :int { 450 } //Z#537 + /* MIT */ :int { 555 } //Z#538 + /* MST */ :int { 187 } //Z#539 + /* MST7MDT */ :int { 111 } //Z#540 + /* Mexico/BajaNorte */ :int { 219 } //Z#541 + /* Mexico/BajaSur */ :int { 162 } //Z#542 + /* Mexico/General */ :int { 167 } //Z#543 + /* NET */ :int { 339 } //Z#544 + /* NST */ :int { 556 } //Z#545 + /* NZ */ :int { 556 } //Z#546 + /* NZ-CHAT */ :int { 558 } //Z#547 + /* Navajo */ :int { 111 } //Z#548 + /* PLT */ :int { 284 } //Z#549 + /* PNT */ :int { 187 } //Z#550 + /* PRC */ :int { 317 } //Z#551 + /* PRT */ :int { 192 } //Z#552 + /* PST */ :int { 153 } //Z#553 + /* PST8PDT */ :int { 153 } //Z#554 /* Pacific/Apia */ :table { transPre32:intvector { -1, 1849542912 } trans:intvector { -1861878784, -631110600, 1285498800, 1301752800, 1316872800, 1325239200, 1333202400, 1348927200, 1365256800, 1380376800, 1396706400, 1411826400, 1428156000, 1443276000, 1459605600, 1474725600, 1491055200, 1506175200, 1522504800, 1538229600, 1554559200, 1569679200, 1586008800, 1601128800, 1617458400 } typeOffsets:intvector { 45184, 0, -41400, 0, -41216, 0, -39600, 0, -39600, 3600, 46800, 0, 46800, 3600 } typeMap:bin { "0201030403040605060506050605060506050605060506050605" } - links:intvector { 537, 554 } - } //Z#554 + links:intvector { 538, 555 } + } //Z#555 /* Pacific/Auckland */ :table { transPre32:intvector { -1, 1102531752 } trans:intvector { -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } @@ -2288,14 +2294,14 @@ zoneinfo64:table(nofallback) { finalRule { "NZ" } finalRaw:int { 43200 } finalYear:int { 2009 } - links:intvector { 232, 235, 544, 545, 555 } - } //Z#555 + links:intvector { 233, 236, 545, 546, 556 } + } //Z#556 /* Pacific/Bougainville */ :table { transPre32:intvector { -1, 1454789160, -1, 1928176784 } trans:intvector { -868010400, -768906000, 1419696000 } typeOffsets:intvector { 37336, 0, 32400, 0, 35312, 0, 36000, 0, 39600, 0 } typeMap:bin { "0203010304" } - } //Z#556 + } //Z#557 /* Pacific/Chatham */ :table { transPre32:intvector { -1, 1102529668 } trans:intvector { -757426500, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } @@ -2304,9 +2310,9 @@ zoneinfo64:table(nofallback) { finalRule { "Chatham" } finalRaw:int { 45900 } finalYear:int { 2009 } - links:intvector { 546, 557 } - } //Z#557 - /* Pacific/Chuuk */ :int { 587 } //Z#558 + links:intvector { 547, 558 } + } //Z#558 + /* Pacific/Chuuk */ :int { 588 } //Z#559 /* Pacific/Easter */ :table { trans:intvector { -1178124152, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1463281200, 1471147200, 1494730800, 1502596800, 1526180400, 1534046400, 1554606000, 1567915200, 1586055600, 1599364800, 1617505200, 1630814400, 1648954800, 1662868800, 1680404400, 1693713600 } typeOffsets:intvector { -26248, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } @@ -2314,99 +2320,99 @@ zoneinfo64:table(nofallback) { finalRule { "Chile" } finalRaw:int { -21600 } finalYear:int { 2024 } - links:intvector { 396, 559 } - } //Z#559 + links:intvector { 397, 560 } + } //Z#560 /* Pacific/Efate */ :table { trans:intvector { -1829387596, 125409600, 133876800, 433256400, 448977600, 464706000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 } typeOffsets:intvector { 40396, 0, 39600, 0, 39600, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201" } - } //Z#560 - /* Pacific/Enderbury */ :int { 571 } //Z#561 + } //Z#561 + /* Pacific/Enderbury */ :int { 572 } //Z#562 /* Pacific/Fakaofo */ :table { transPre32:intvector { -1, 2117555592 } trans:intvector { 1325242800 } typeOffsets:intvector { -41096, 0, -39600, 0, 46800, 0 } typeMap:bin { "0102" } - } //Z#562 + } //Z#563 /* Pacific/Fiji */ :table { trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000, 1452952800, 1478354400, 1484402400, 1509804000, 1515852000, 1541253600, 1547301600, 1573308000, 1578751200, 1608386400, 1610805600 } typeOffsets:intvector { 42944, 0, 43200, 0, 43200, 3600 } typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } - } //Z#563 - /* Pacific/Funafuti */ :int { 592 } //Z#564 + } //Z#564 + /* Pacific/Funafuti */ :int { 593 } //Z#565 /* Pacific/Galapagos */ :table { trans:intvector { -1230746496, 504939600, 722930400, 728888400 } typeOffsets:intvector { -21504, 0, -21600, 0, -21600, 3600, -18000, 0 } typeMap:bin { "03010201" } - } //Z#565 + } //Z#566 /* Pacific/Gambier */ :table { trans:intvector { -1806678012 } typeOffsets:intvector { -32388, 0, -32400, 0 } typeMap:bin { "01" } - } //Z#566 + } //Z#567 /* Pacific/Guadalcanal */ :table { trans:intvector { -1806748788 } typeOffsets:intvector { 38388, 0, 39600, 0 } typeMap:bin { "01" } - links:intvector { 567, 585, 586, 602 } - } //Z#567 + links:intvector { 568, 586, 587, 603 } + } //Z#568 /* Pacific/Guam */ :table { transPre32:intvector { -1, 350340556, -1, 2117479756 } trans:intvector { -885549600, -802256400, -331891200, -281610000, -73728000, -29415540, -16704000, -10659600, 9907200, 21394800, 41356800, 52844400, 124819200, 130863600, 201888000, 209487660, 230659200, 241542000 } typeOffsets:intvector { -51660, 0, 32400, 0, 34740, 0, 36000, 0, 36000, 3600 } typeMap:bin { "0203010304030403040304030403040304030403" } - links:intvector { 568, 589 } - } //Z#568 + links:intvector { 569, 590 } + } //Z#569 /* Pacific/Honolulu */ :table { transPre32:intvector { -1, 1960865982 } trans:intvector { -1157283000, -1155436200, -880198200, -765376200, -712150200 } typeOffsets:intvector { -37886, 0, -37800, 0, -37800, 3600, -36000, 0 } typeMap:bin { "010201020103" } - links:intvector { 513, 569, 570, 625 } - } //Z#569 - /* Pacific/Johnston */ :int { 569 } //Z#570 + links:intvector { 514, 570, 571, 626 } + } //Z#570 + /* Pacific/Johnston */ :int { 570 } //Z#571 /* Pacific/Kanton */ :table { trans:intvector { -1020470400, 307627200, 788871600 } typeOffsets:intvector { 0, 0, -43200, 0, -39600, 0, 46800, 0 } typeMap:bin { "010203" } - links:intvector { 561, 571 } - } //Z#571 + links:intvector { 562, 572 } + } //Z#572 /* Pacific/Kiritimati */ :table { transPre32:intvector { -1, 2117552256 } trans:intvector { 307622400, 788868000 } typeOffsets:intvector { -37760, 0, -38400, 0, -36000, 0, 50400, 0 } typeMap:bin { "010203" } - } //Z#572 + } //Z#573 /* Pacific/Kosrae */ :table { transPre32:intvector { -1, 350336180, -1, 2117475380 } trans:intvector { -1743678000, -1606813200, -1041418800, -907408800, -770634000, -7988400, 915105600 } typeOffsets:intvector { -47284, 0, 32400, 0, 36000, 0, 39116, 0, 39600, 0, 43200, 0 } typeMap:bin { "030401040201040504" } - } //Z#573 + } //Z#574 /* Pacific/Kwajalein */ :table { transPre32:intvector { -1, 2117474336 } trans:intvector { -1041418800, -907408800, -817462800, -7988400, 745934400 } typeOffsets:intvector { 40160, 0, -43200, 0, 32400, 0, 36000, 0, 39600, 0, 43200, 0 } typeMap:bin { "040302040105" } - links:intvector { 534, 574 } - } //Z#574 - /* Pacific/Majuro */ :int { 592 } //Z#575 + links:intvector { 535, 575 } + } //Z#575 + /* Pacific/Majuro */ :int { 593 } //Z#576 /* Pacific/Marquesas */ :table { trans:intvector { -1806676920 } typeOffsets:intvector { -33480, 0, -34200, 0 } typeMap:bin { "01" } - } //Z#576 - /* Pacific/Midway */ :int { 582 } //Z#577 + } //Z#577 + /* Pacific/Midway */ :int { 583 } //Z#578 /* Pacific/Nauru */ :table { trans:intvector { -1545131260, -862918200, -767350800, 287418600 } typeOffsets:intvector { 40060, 0, 32400, 0, 41400, 0, 43200, 0 } typeMap:bin { "02010203" } - } //Z#578 + } //Z#579 /* Pacific/Niue */ :table { trans:intvector { -543069620, -173623200 } typeOffsets:intvector { -40780, 0, -40800, 0, -39600, 0 } typeMap:bin { "0102" } - } //Z#579 + } //Z#580 /* Pacific/Norfolk */ :table { transPre32:intvector { -1, 2117474184 } trans:intvector { -599656320, 152029800, 162916200, 1443882600, 1570287600, 1586012400, 1601737200 } @@ -2415,75 +2421,75 @@ zoneinfo64:table(nofallback) { finalRule { "AN" } finalRaw:int { 39600 } finalYear:int { 2021 } - } //Z#580 + } //Z#581 /* Pacific/Noumea */ :table { trans:intvector { -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 } typeOffsets:intvector { 39948, 0, 39600, 0, 39600, 3600 } typeMap:bin { "01020102010201" } - } //Z#581 + } //Z#582 /* Pacific/Pago_Pago */ :table { transPre32:intvector { -1, 1849542664 } trans:intvector { -1861879032 } typeOffsets:intvector { 45432, 0, -40968, 0, -39600, 0 } typeMap:bin { "0102" } - links:intvector { 577, 582, 590, 631 } - } //Z#582 + links:intvector { 578, 583, 591, 632 } + } //Z#583 /* Pacific/Palau */ :table { transPre32:intvector { -1, 350343020, -1, 2117482220 } typeOffsets:intvector { -54124, 0, 32276, 0, 32400, 0 } typeMap:bin { "0102" } - } //Z#583 + } //Z#584 /* Pacific/Pitcairn */ :table { transPre32:intvector { -1, 2117545716 } trans:intvector { 893665800 } typeOffsets:intvector { -31220, 0, -30600, 0, -28800, 0 } typeMap:bin { "0102" } - } //Z#584 - /* Pacific/Pohnpei */ :int { 567 } //Z#585 - /* Pacific/Ponape */ :int { 567 } //Z#586 + } //Z#585 + /* Pacific/Pohnpei */ :int { 568 } //Z#586 + /* Pacific/Ponape */ :int { 568 } //Z#587 /* Pacific/Port_Moresby */ :table { transPre32:intvector { -1, 1454791176, -1, 1928176784 } typeOffsets:intvector { 35320, 0, 35312, 0, 36000, 0 } typeMap:bin { "0102" } - links:intvector { 229, 558, 587, 594, 597 } - } //Z#587 + links:intvector { 230, 559, 588, 595, 598 } + } //Z#588 /* Pacific/Rarotonga */ :table { transPre32:intvector { -1, 2085412040 } trans:intvector { -543072056, 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 } typeOffsets:intvector { 48056, 0, -38344, 0, -37800, 0, -36000, 0, -36000, 1800 } typeMap:bin { "01020403040304030403040304030403040304030403040304030403" } - } //Z#588 - /* Pacific/Saipan */ :int { 568 } //Z#589 - /* Pacific/Samoa */ :int { 582 } //Z#590 + } //Z#589 + /* Pacific/Saipan */ :int { 569 } //Z#590 + /* Pacific/Samoa */ :int { 583 } //Z#591 /* Pacific/Tahiti */ :table { trans:intvector { -1806674504 } typeOffsets:intvector { -35896, 0, -36000, 0 } typeMap:bin { "01" } - } //Z#591 + } //Z#592 /* Pacific/Tarawa */ :table { transPre32:intvector { -1, 2117472972 } typeOffsets:intvector { 41524, 0, 43200, 0 } typeMap:bin { "01" } - links:intvector { 564, 575, 592, 595, 596 } - } //Z#592 + links:intvector { 565, 576, 593, 596, 597 } + } //Z#593 /* Pacific/Tongatapu */ :table { trans:intvector { -767189952, -284041200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400, 1478350800, 1484398800 } typeOffsets:intvector { 44352, 0, 44400, 0, 46800, 0, 46800, 3600 } typeMap:bin { "01020302030203020302" } - } //Z#593 - /* Pacific/Truk */ :int { 587 } //Z#594 - /* Pacific/Wake */ :int { 592 } //Z#595 - /* Pacific/Wallis */ :int { 592 } //Z#596 - /* Pacific/Yap */ :int { 587 } //Z#597 - /* Poland */ :int { 501 } //Z#598 - /* Portugal */ :int { 466 } //Z#599 - /* ROC */ :int { 319 } //Z#600 - /* ROK */ :int { 315 } //Z#601 - /* SST */ :int { 567 } //Z#602 - /* Singapore */ :int { 317 } //Z#603 + } //Z#594 + /* Pacific/Truk */ :int { 588 } //Z#595 + /* Pacific/Wake */ :int { 593 } //Z#596 + /* Pacific/Wallis */ :int { 593 } //Z#597 + /* Pacific/Yap */ :int { 588 } //Z#598 + /* Poland */ :int { 502 } //Z#599 + /* Portugal */ :int { 467 } //Z#600 + /* ROC */ :int { 320 } //Z#601 + /* ROK */ :int { 316 } //Z#602 + /* SST */ :int { 568 } //Z#603 + /* Singapore */ :int { 318 } //Z#604 /* SystemV/AST4 */ :table { typeOffsets:intvector { -14400, 0 } - } //Z#604 + } //Z#605 /* SystemV/AST4ADT */ :table { trans:intvector { -2135872800, -2120151600, -2104423200, -2088702000, -2072973600, -2056647600, -2040919200, -2025198000, -2009469600, -1993748400, -1978020000, -1962298800, -1946570400, -1930849200, -1915120800, -1898794800, -1883671200, -1867345200, -1851616800, -1835895600, -1820167200, -1804446000, -1788717600, -1772996400, -1757268000, -1741546800, -1725818400, -1709492400, -1693764000, -1678042800, -1662314400, -1646593200, -1630864800, -1615143600, -1599415200, -1583694000, -1567965600, -1551639600, -1536516000, -1520190000, -1504461600, -1488740400, -1473012000, -1457290800, -1441562400, -1425841200, -1410112800, -1394391600, -1378663200, -1362337200, -1347213600, -1330887600, -1315159200, -1299438000, -1283709600, -1267988400, -1252260000, -1236538800, -1220810400, -1205089200, -1189360800, -1173034800, -1157306400, -1141585200, -1125856800, -1110135600, -1094407200, -1078686000, -1062957600, -1047236400, -1031508000, -1015182000, -1000058400, -983732400, -968004000, -952282800, -936554400, -920833200, -905104800, -889383600, -873655200, -857934000, -842205600, -825879600, -810151200, -794430000, -778701600, -762980400, -747252000, -731530800, -715802400, -700081200, -684352800, -668026800, -652903200, -636577200, -620848800, -605127600, -589399200, -573678000, -557949600, -542228400, -526500000, -510778800, -495050400, -478724400, -463600800, -447274800, -431546400, -415825200, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 126684000, 154501200, 162367200, 183531600, 199260000, 215586000 } typeOffsets:intvector { -14400, 0, -14400, 3600 } @@ -2491,10 +2497,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -14400 } finalYear:int { 1977 } - } //Z#605 + } //Z#606 /* SystemV/CST6 */ :table { typeOffsets:intvector { -21600, 0 } - } //Z#606 + } //Z#607 /* SystemV/CST6CDT */ :table { trans:intvector { -2135865600, -2120144400, -2104416000, -2088694800, -2072966400, -2056640400, -2040912000, -2025190800, -2009462400, -1993741200, -1978012800, -1962291600, -1946563200, -1930842000, -1915113600, -1898787600, -1883664000, -1867338000, -1851609600, -1835888400, -1820160000, -1804438800, -1788710400, -1772989200, -1757260800, -1741539600, -1725811200, -1709485200, -1693756800, -1678035600, -1662307200, -1646586000, -1630857600, -1615136400, -1599408000, -1583686800, -1567958400, -1551632400, -1536508800, -1520182800, -1504454400, -1488733200, -1473004800, -1457283600, -1441555200, -1425834000, -1410105600, -1394384400, -1378656000, -1362330000, -1347206400, -1330880400, -1315152000, -1299430800, -1283702400, -1267981200, -1252252800, -1236531600, -1220803200, -1205082000, -1189353600, -1173027600, -1157299200, -1141578000, -1125849600, -1110128400, -1094400000, -1078678800, -1062950400, -1047229200, -1031500800, -1015174800, -1000051200, -983725200, -967996800, -952275600, -936547200, -920826000, -905097600, -889376400, -873648000, -857926800, -842198400, -825872400, -810144000, -794422800, -778694400, -762973200, -747244800, -731523600, -715795200, -700074000, -684345600, -668019600, -652896000, -636570000, -620841600, -605120400, -589392000, -573670800, -557942400, -542221200, -526492800, -510771600, -495043200, -478717200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 154508400, 162374400, 183538800, 199267200, 215593200 } typeOffsets:intvector { -21600, 0, -21600, 3600 } @@ -2502,10 +2508,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -21600 } finalYear:int { 1977 } - } //Z#607 + } //Z#608 /* SystemV/EST5 */ :table { typeOffsets:intvector { -18000, 0 } - } //Z#608 + } //Z#609 /* SystemV/EST5EDT */ :table { trans:intvector { -2135869200, -2120148000, -2104419600, -2088698400, -2072970000, -2056644000, -2040915600, -2025194400, -2009466000, -1993744800, -1978016400, -1962295200, -1946566800, -1930845600, -1915117200, -1898791200, -1883667600, -1867341600, -1851613200, -1835892000, -1820163600, -1804442400, -1788714000, -1772992800, -1757264400, -1741543200, -1725814800, -1709488800, -1693760400, -1678039200, -1662310800, -1646589600, -1630861200, -1615140000, -1599411600, -1583690400, -1567962000, -1551636000, -1536512400, -1520186400, -1504458000, -1488736800, -1473008400, -1457287200, -1441558800, -1425837600, -1410109200, -1394388000, -1378659600, -1362333600, -1347210000, -1330884000, -1315155600, -1299434400, -1283706000, -1267984800, -1252256400, -1236535200, -1220806800, -1205085600, -1189357200, -1173031200, -1157302800, -1141581600, -1125853200, -1110132000, -1094403600, -1078682400, -1062954000, -1047232800, -1031504400, -1015178400, -1000054800, -983728800, -968000400, -952279200, -936550800, -920829600, -905101200, -889380000, -873651600, -857930400, -842202000, -825876000, -810147600, -794426400, -778698000, -762976800, -747248400, -731527200, -715798800, -700077600, -684349200, -668023200, -652899600, -636573600, -620845200, -605124000, -589395600, -573674400, -557946000, -542224800, -526496400, -510775200, -495046800, -478720800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 154504800, 162370800, 183535200, 199263600, 215589600 } typeOffsets:intvector { -18000, 0, -18000, 3600 } @@ -2513,13 +2519,13 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -18000 } finalYear:int { 1977 } - } //Z#609 + } //Z#610 /* SystemV/HST10 */ :table { typeOffsets:intvector { -36000, 0 } - } //Z#610 + } //Z#611 /* SystemV/MST7 */ :table { typeOffsets:intvector { -25200, 0 } - } //Z#611 + } //Z#612 /* SystemV/MST7MDT */ :table { trans:intvector { -2135862000, -2120140800, -2104412400, -2088691200, -2072962800, -2056636800, -2040908400, -2025187200, -2009458800, -1993737600, -1978009200, -1962288000, -1946559600, -1930838400, -1915110000, -1898784000, -1883660400, -1867334400, -1851606000, -1835884800, -1820156400, -1804435200, -1788706800, -1772985600, -1757257200, -1741536000, -1725807600, -1709481600, -1693753200, -1678032000, -1662303600, -1646582400, -1630854000, -1615132800, -1599404400, -1583683200, -1567954800, -1551628800, -1536505200, -1520179200, -1504450800, -1488729600, -1473001200, -1457280000, -1441551600, -1425830400, -1410102000, -1394380800, -1378652400, -1362326400, -1347202800, -1330876800, -1315148400, -1299427200, -1283698800, -1267977600, -1252249200, -1236528000, -1220799600, -1205078400, -1189350000, -1173024000, -1157295600, -1141574400, -1125846000, -1110124800, -1094396400, -1078675200, -1062946800, -1047225600, -1031497200, -1015171200, -1000047600, -983721600, -967993200, -952272000, -936543600, -920822400, -905094000, -889372800, -873644400, -857923200, -842194800, -825868800, -810140400, -794419200, -778690800, -762969600, -747241200, -731520000, -715791600, -700070400, -684342000, -668016000, -652892400, -636566400, -620838000, -605116800, -589388400, -573667200, -557938800, -542217600, -526489200, -510768000, -495039600, -478713600, -463590000, -447264000, -431535600, -415814400, -400086000, -384364800, -368636400, -352915200, -337186800, -321465600, -305737200, -289411200, -273682800, -257961600, -242233200, -226512000, -210783600, -195062400, -179334000, -163612800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 154512000, 162378000, 183542400, 199270800, 215596800 } typeOffsets:intvector { -25200, 0, -25200, 3600 } @@ -2527,10 +2533,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -25200 } finalYear:int { 1977 } - } //Z#612 + } //Z#613 /* SystemV/PST8 */ :table { typeOffsets:intvector { -28800, 0 } - } //Z#613 + } //Z#614 /* SystemV/PST8PDT */ :table { trans:intvector { -2135858400, -2120137200, -2104408800, -2088687600, -2072959200, -2056633200, -2040904800, -2025183600, -2009455200, -1993734000, -1978005600, -1962284400, -1946556000, -1930834800, -1915106400, -1898780400, -1883656800, -1867330800, -1851602400, -1835881200, -1820152800, -1804431600, -1788703200, -1772982000, -1757253600, -1741532400, -1725804000, -1709478000, -1693749600, -1678028400, -1662300000, -1646578800, -1630850400, -1615129200, -1599400800, -1583679600, -1567951200, -1551625200, -1536501600, -1520175600, -1504447200, -1488726000, -1472997600, -1457276400, -1441548000, -1425826800, -1410098400, -1394377200, -1378648800, -1362322800, -1347199200, -1330873200, -1315144800, -1299423600, -1283695200, -1267974000, -1252245600, -1236524400, -1220796000, -1205074800, -1189346400, -1173020400, -1157292000, -1141570800, -1125842400, -1110121200, -1094392800, -1078671600, -1062943200, -1047222000, -1031493600, -1015167600, -1000044000, -983718000, -967989600, -952268400, -936540000, -920818800, -905090400, -889369200, -873640800, -857919600, -842191200, -825865200, -810136800, -794415600, -778687200, -762966000, -747237600, -731516400, -715788000, -700066800, -684338400, -668012400, -652888800, -636562800, -620834400, -605113200, -589384800, -573663600, -557935200, -542214000, -526485600, -510764400, -495036000, -478710000, -463586400, -447260400, -431532000, -415810800, -400082400, -384361200, -368632800, -352911600, -337183200, -321462000, -305733600, -289407600, -273679200, -257958000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 154515600, 162381600, 183546000, 199274400, 215600400 } typeOffsets:intvector { -28800, 0, -28800, 3600 } @@ -2538,10 +2544,10 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -28800 } finalYear:int { 1977 } - } //Z#614 + } //Z#615 /* SystemV/YST9 */ :table { typeOffsets:intvector { -32400, 0 } - } //Z#615 + } //Z#616 /* SystemV/YST9YDT */ :table { trans:intvector { -2135854800, -2120133600, -2104405200, -2088684000, -2072955600, -2056629600, -2040901200, -2025180000, -2009451600, -1993730400, -1978002000, -1962280800, -1946552400, -1930831200, -1915102800, -1898776800, -1883653200, -1867327200, -1851598800, -1835877600, -1820149200, -1804428000, -1788699600, -1772978400, -1757250000, -1741528800, -1725800400, -1709474400, -1693746000, -1678024800, -1662296400, -1646575200, -1630846800, -1615125600, -1599397200, -1583676000, -1567947600, -1551621600, -1536498000, -1520172000, -1504443600, -1488722400, -1472994000, -1457272800, -1441544400, -1425823200, -1410094800, -1394373600, -1378645200, -1362319200, -1347195600, -1330869600, -1315141200, -1299420000, -1283691600, -1267970400, -1252242000, -1236520800, -1220792400, -1205071200, -1189342800, -1173016800, -1157288400, -1141567200, -1125838800, -1110117600, -1094389200, -1078668000, -1062939600, -1047218400, -1031490000, -1015164000, -1000040400, -983714400, -967986000, -952264800, -936536400, -920815200, -905086800, -889365600, -873637200, -857916000, -842187600, -825861600, -810133200, -794412000, -778683600, -762962400, -747234000, -731512800, -715784400, -700063200, -684334800, -668008800, -652885200, -636559200, -620830800, -605109600, -589381200, -573660000, -557931600, -542210400, -526482000, -510760800, -495032400, -478706400, -463582800, -447256800, -431528400, -415807200, -400078800, -384357600, -368629200, -352908000, -337179600, -321458400, -305730000, -289404000, -273675600, -257954400, -242226000, -226504800, -210776400, -195055200, -179326800, -163605600, -147877200, -131551200, -116427600, -100101600, -84373200, -68652000, -52923600, -37202400, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 154519200, 162385200, 183549600, 199278000, 215604000 } typeOffsets:intvector { -32400, 0, -32400, 3600 } @@ -2549,28 +2555,28 @@ zoneinfo64:table(nofallback) { finalRule { "SystemV" } finalRaw:int { -32400 } finalYear:int { 1977 } - } //Z#616 - /* Turkey */ :int { 460 } //Z#617 - /* UCT */ :int { 437 } //Z#618 - /* US/Alaska */ :int { 60 } //Z#619 - /* US/Aleutian */ :int { 59 } //Z#620 - /* US/Arizona */ :int { 186 } //Z#621 - /* US/Central */ :int { 98 } //Z#622 - /* US/East-Indiana */ :int { 132 } //Z#623 - /* US/Eastern */ :int { 174 } //Z#624 - /* US/Hawaii */ :int { 569 } //Z#625 - /* US/Indiana-Starke */ :int { 133 } //Z#626 - /* US/Michigan */ :int { 111 } //Z#627 - /* US/Mountain */ :int { 110 } //Z#628 - /* US/Pacific */ :int { 152 } //Z#629 - /* US/Pacific-New */ :int { 152 } //Z#630 - /* US/Samoa */ :int { 582 } //Z#631 - /* UTC */ :int { 437 } //Z#632 - /* Universal */ :int { 437 } //Z#633 - /* VST */ :int { 273 } //Z#634 - /* W-SU */ :int { 475 } //Z#635 - /* WET */ :int { 466 } //Z#636 - /* Zulu */ :int { 437 } //Z#637 + } //Z#617 + /* Turkey */ :int { 461 } //Z#618 + /* UCT */ :int { 438 } //Z#619 + /* US/Alaska */ :int { 60 } //Z#620 + /* US/Aleutian */ :int { 59 } //Z#621 + /* US/Arizona */ :int { 187 } //Z#622 + /* US/Central */ :int { 98 } //Z#623 + /* US/East-Indiana */ :int { 133 } //Z#624 + /* US/Eastern */ :int { 175 } //Z#625 + /* US/Hawaii */ :int { 570 } //Z#626 + /* US/Indiana-Starke */ :int { 134 } //Z#627 + /* US/Michigan */ :int { 112 } //Z#628 + /* US/Mountain */ :int { 111 } //Z#629 + /* US/Pacific */ :int { 153 } //Z#630 + /* US/Pacific-New */ :int { 153 } //Z#631 + /* US/Samoa */ :int { 583 } //Z#632 + /* UTC */ :int { 438 } //Z#633 + /* Universal */ :int { 438 } //Z#634 + /* VST */ :int { 274 } //Z#635 + /* W-SU */ :int { 476 } //Z#636 + /* WET */ :int { 467 } //Z#637 + /* Zulu */ :int { 438 } //Z#638 } Names { "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6 @@ -2607,158 +2613,158 @@ zoneinfo64:table(nofallback) { ,"America/Catamarca","America/Cayenne","America/Cayman" // 97 ,"America/Chicago","America/Chihuahua","America/Ciudad_Juarez" // 100 ,"America/Coral_Harbour","America/Cordoba","America/Costa_Rica" // 103 - ,"America/Creston","America/Cuiaba","America/Curacao" // 106 - ,"America/Danmarkshavn","America/Dawson","America/Dawson_Creek" // 109 - ,"America/Denver","America/Detroit","America/Dominica" // 112 - ,"America/Edmonton","America/Eirunepe","America/El_Salvador" // 115 - ,"America/Ensenada","America/Fort_Nelson","America/Fort_Wayne" // 118 - ,"America/Fortaleza","America/Glace_Bay","America/Godthab" // 121 - ,"America/Goose_Bay","America/Grand_Turk","America/Grenada" // 124 - ,"America/Guadeloupe","America/Guatemala","America/Guayaquil" // 127 - ,"America/Guyana","America/Halifax","America/Havana" // 130 - ,"America/Hermosillo","America/Indiana/Indianapolis" // 132 - ,"America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg" // 135 - ,"America/Indiana/Tell_City","America/Indiana/Vevay" // 137 - ,"America/Indiana/Vincennes","America/Indiana/Winamac" // 139 - ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 142 - ,"America/Jamaica","America/Jujuy","America/Juneau" // 145 - ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 147 - ,"America/Knox_IN","America/Kralendijk","America/La_Paz" // 150 - ,"America/Lima","America/Los_Angeles","America/Louisville" // 153 - ,"America/Lower_Princes","America/Maceio","America/Managua" // 156 - ,"America/Manaus","America/Marigot","America/Martinique" // 159 - ,"America/Matamoros","America/Mazatlan","America/Mendoza" // 162 - ,"America/Menominee","America/Merida","America/Metlakatla" // 165 - ,"America/Mexico_City","America/Miquelon","America/Moncton" // 168 - ,"America/Monterrey","America/Montevideo","America/Montreal" // 171 - ,"America/Montserrat","America/Nassau","America/New_York" // 174 - ,"America/Nipigon","America/Nome","America/Noronha" // 177 - ,"America/North_Dakota/Beulah","America/North_Dakota/Center" // 179 - ,"America/North_Dakota/New_Salem","America/Nuuk","America/Ojinaga" // 182 - ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 185 - ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 188 - ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 191 - ,"America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet" // 194 - ,"America/Recife","America/Regina","America/Resolute" // 197 - ,"America/Rio_Branco","America/Rosario","America/Santa_Isabel" // 200 - ,"America/Santarem","America/Santiago","America/Santo_Domingo" // 203 - ,"America/Sao_Paulo","America/Scoresbysund","America/Shiprock" // 206 - ,"America/Sitka","America/St_Barthelemy","America/St_Johns" // 209 - ,"America/St_Kitts","America/St_Lucia","America/St_Thomas" // 212 - ,"America/St_Vincent","America/Swift_Current","America/Tegucigalpa" // 215 - ,"America/Thule","America/Thunder_Bay","America/Tijuana" // 218 - ,"America/Toronto","America/Tortola","America/Vancouver" // 221 - ,"America/Virgin","America/Whitehorse","America/Winnipeg" // 224 - ,"America/Yakutat","America/Yellowknife","Antarctica/Casey" // 227 - ,"Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie" // 230 - ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 233 - ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 236 - ,"Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen" // 239 - ,"Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr" // 243 - ,"Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad" // 247 - ,"Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku" // 251 - ,"Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek" // 255 - ,"Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Choibalsan" // 259 - ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 263 - ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 267 - ,"Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Harbin" // 271 - ,"Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong" // 274 - ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 278 - ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 282 - ,"Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu" // 286 - ,"Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk" // 289 - ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 293 - ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 297 - ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 301 - ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 305 - ,"Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda" // 309 - ,"Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin" // 313 - ,"Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore" // 317 - ,"Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent" // 320 - ,"Asia/Tbilisi","Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu" // 324 - ,"Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ujung_Pandang" // 328 - ,"Asia/Ulaanbaatar","Asia/Ulan_Bator","Asia/Urumqi" // 331 - ,"Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok" // 334 - ,"Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 337 - ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 340 - ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 343 - ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 346 - ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 349 - ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 352 - ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 355 - ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 358 - ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 361 - ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 364 - ,"Australia/North","Australia/Perth","Australia/Queensland" // 367 - ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 370 - ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 373 - ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 378 - ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 385 - ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 388 - ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 391 - ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 394 - ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 398 - ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 405 - ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 409 - ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 414 - ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 419 - ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 423 - ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 427 - ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 432 - ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 437 - ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 441 - ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 444 - ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 447 - ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 450 - ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 453 - ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 456 - ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 459 - ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 462 - ,"Europe/Kiev","Europe/Kirov","Europe/Kyiv","Europe/Lisbon" // 466 - ,"Europe/Ljubljana","Europe/London","Europe/Luxembourg" // 469 - ,"Europe/Madrid","Europe/Malta","Europe/Mariehamn" // 472 - ,"Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Nicosia" // 476 - ,"Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague" // 480 - ,"Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino" // 484 - ,"Europe/Sarajevo","Europe/Saratov","Europe/Simferopol" // 487 - ,"Europe/Skopje","Europe/Sofia","Europe/Stockholm" // 490 - ,"Europe/Tallinn","Europe/Tirane","Europe/Tiraspol" // 493 - ,"Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz" // 496 - ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 499 - ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 502 - ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 506 - ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 512 - ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 518 - ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 521 - ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 525 - ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 528 - ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 534 - ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 540 - ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 545 - ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 553 - ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 556 - ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 559 - ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 562 - ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 565 - ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 568 - ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kanton" // 571 - ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 574 - ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 577 - ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 581 - ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 584 - ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 587 - ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 590 - ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 593 - ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 597 - ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 603 - ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 607 - ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 611 - ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 614 - ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 619 - ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 623 - ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 627 - ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 631 - ,"UTC","Universal","VST","W-SU","WET","Zulu" // 637 + ,"America/Coyhaique","America/Creston","America/Cuiaba" // 106 + ,"America/Curacao","America/Danmarkshavn","America/Dawson" // 109 + ,"America/Dawson_Creek","America/Denver","America/Detroit" // 112 + ,"America/Dominica","America/Edmonton","America/Eirunepe" // 115 + ,"America/El_Salvador","America/Ensenada","America/Fort_Nelson" // 118 + ,"America/Fort_Wayne","America/Fortaleza","America/Glace_Bay" // 121 + ,"America/Godthab","America/Goose_Bay","America/Grand_Turk" // 124 + ,"America/Grenada","America/Guadeloupe","America/Guatemala" // 127 + ,"America/Guayaquil","America/Guyana","America/Halifax" // 130 + ,"America/Havana","America/Hermosillo","America/Indiana/Indianapolis" // 133 + ,"America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg" // 136 + ,"America/Indiana/Tell_City","America/Indiana/Vevay" // 138 + ,"America/Indiana/Vincennes","America/Indiana/Winamac" // 140 + ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 143 + ,"America/Jamaica","America/Jujuy","America/Juneau" // 146 + ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 148 + ,"America/Knox_IN","America/Kralendijk","America/La_Paz" // 151 + ,"America/Lima","America/Los_Angeles","America/Louisville" // 154 + ,"America/Lower_Princes","America/Maceio","America/Managua" // 157 + ,"America/Manaus","America/Marigot","America/Martinique" // 160 + ,"America/Matamoros","America/Mazatlan","America/Mendoza" // 163 + ,"America/Menominee","America/Merida","America/Metlakatla" // 166 + ,"America/Mexico_City","America/Miquelon","America/Moncton" // 169 + ,"America/Monterrey","America/Montevideo","America/Montreal" // 172 + ,"America/Montserrat","America/Nassau","America/New_York" // 175 + ,"America/Nipigon","America/Nome","America/Noronha" // 178 + ,"America/North_Dakota/Beulah","America/North_Dakota/Center" // 180 + ,"America/North_Dakota/New_Salem","America/Nuuk","America/Ojinaga" // 183 + ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 186 + ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 189 + ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 192 + ,"America/Punta_Arenas","America/Rainy_River","America/Rankin_Inlet" // 195 + ,"America/Recife","America/Regina","America/Resolute" // 198 + ,"America/Rio_Branco","America/Rosario","America/Santa_Isabel" // 201 + ,"America/Santarem","America/Santiago","America/Santo_Domingo" // 204 + ,"America/Sao_Paulo","America/Scoresbysund","America/Shiprock" // 207 + ,"America/Sitka","America/St_Barthelemy","America/St_Johns" // 210 + ,"America/St_Kitts","America/St_Lucia","America/St_Thomas" // 213 + ,"America/St_Vincent","America/Swift_Current","America/Tegucigalpa" // 216 + ,"America/Thule","America/Thunder_Bay","America/Tijuana" // 219 + ,"America/Toronto","America/Tortola","America/Vancouver" // 222 + ,"America/Virgin","America/Whitehorse","America/Winnipeg" // 225 + ,"America/Yakutat","America/Yellowknife","Antarctica/Casey" // 228 + ,"Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie" // 231 + ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 234 + ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 237 + ,"Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen" // 240 + ,"Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr" // 244 + ,"Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad" // 248 + ,"Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku" // 252 + ,"Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek" // 256 + ,"Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Choibalsan" // 260 + ,"Asia/Chongqing","Asia/Chungking","Asia/Colombo","Asia/Dacca" // 264 + ,"Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai" // 268 + ,"Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Harbin" // 272 + ,"Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong" // 275 + ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 279 + ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 283 + ,"Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu" // 287 + ,"Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk" // 290 + ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 294 + ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 298 + ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 302 + ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 306 + ,"Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda" // 310 + ,"Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin" // 314 + ,"Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore" // 318 + ,"Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent" // 321 + ,"Asia/Tbilisi","Asia/Tehran","Asia/Tel_Aviv","Asia/Thimbu" // 325 + ,"Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ujung_Pandang" // 329 + ,"Asia/Ulaanbaatar","Asia/Ulan_Bator","Asia/Urumqi" // 332 + ,"Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok" // 335 + ,"Asia/Yakutsk","Asia/Yangon","Asia/Yekaterinburg" // 338 + ,"Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda" // 341 + ,"Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe" // 344 + ,"Atlantic/Faroe","Atlantic/Jan_Mayen","Atlantic/Madeira" // 347 + ,"Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena" // 350 + ,"Atlantic/Stanley","Australia/ACT","Australia/Adelaide" // 353 + ,"Australia/Brisbane","Australia/Broken_Hill","Australia/Canberra" // 356 + ,"Australia/Currie","Australia/Darwin","Australia/Eucla" // 359 + ,"Australia/Hobart","Australia/LHI","Australia/Lindeman" // 362 + ,"Australia/Lord_Howe","Australia/Melbourne","Australia/NSW" // 365 + ,"Australia/North","Australia/Perth","Australia/Queensland" // 368 + ,"Australia/South","Australia/Sydney","Australia/Tasmania" // 371 + ,"Australia/Victoria","Australia/West","Australia/Yancowinna" // 374 + ,"BET","BST","Brazil/Acre","Brazil/DeNoronha","Brazil/East" // 379 + ,"Brazil/West","CAT","CET","CNT","CST","CST6CDT","CTT" // 386 + ,"Canada/Atlantic","Canada/Central","Canada/East-Saskatchewan" // 389 + ,"Canada/Eastern","Canada/Mountain","Canada/Newfoundland" // 392 + ,"Canada/Pacific","Canada/Saskatchewan","Canada/Yukon" // 395 + ,"Chile/Continental","Chile/EasterIsland","Cuba","EAT" // 399 + ,"ECT","EET","EST","EST5EDT","Egypt","Eire","Etc/GMT" // 406 + ,"Etc/GMT+0","Etc/GMT+1","Etc/GMT+10","Etc/GMT+11" // 410 + ,"Etc/GMT+12","Etc/GMT+2","Etc/GMT+3","Etc/GMT+4","Etc/GMT+5" // 415 + ,"Etc/GMT+6","Etc/GMT+7","Etc/GMT+8","Etc/GMT+9","Etc/GMT-0" // 420 + ,"Etc/GMT-1","Etc/GMT-10","Etc/GMT-11","Etc/GMT-12" // 424 + ,"Etc/GMT-13","Etc/GMT-14","Etc/GMT-2","Etc/GMT-3" // 428 + ,"Etc/GMT-4","Etc/GMT-5","Etc/GMT-6","Etc/GMT-7","Etc/GMT-8" // 433 + ,"Etc/GMT-9","Etc/GMT0","Etc/Greenwich","Etc/UCT","Etc/UTC" // 438 + ,"Etc/Universal","Etc/Unknown","Etc/Zulu","Europe/Amsterdam" // 442 + ,"Europe/Andorra","Europe/Astrakhan","Europe/Athens" // 445 + ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 448 + ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 451 + ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 454 + ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 457 + ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 460 + ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 463 + ,"Europe/Kiev","Europe/Kirov","Europe/Kyiv","Europe/Lisbon" // 467 + ,"Europe/Ljubljana","Europe/London","Europe/Luxembourg" // 470 + ,"Europe/Madrid","Europe/Malta","Europe/Mariehamn" // 473 + ,"Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Nicosia" // 477 + ,"Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague" // 481 + ,"Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino" // 485 + ,"Europe/Sarajevo","Europe/Saratov","Europe/Simferopol" // 488 + ,"Europe/Skopje","Europe/Sofia","Europe/Stockholm" // 491 + ,"Europe/Tallinn","Europe/Tirane","Europe/Tiraspol" // 494 + ,"Europe/Ulyanovsk","Europe/Uzhgorod","Europe/Vaduz" // 497 + ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 500 + ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 503 + ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 507 + ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 513 + ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 519 + ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 522 + ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 526 + ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 529 + ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 535 + ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 541 + ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 546 + ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 554 + ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 557 + ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 560 + ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 563 + ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 566 + ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 569 + ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kanton" // 572 + ,"Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein" // 575 + ,"Pacific/Majuro","Pacific/Marquesas","Pacific/Midway" // 578 + ,"Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 582 + ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 585 + ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 588 + ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 591 + ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 594 + ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 598 + ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 604 + ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 608 + ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 612 + ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 615 + ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 620 + ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 624 + ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 628 + ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 632 + ,"UTC","Universal","VST","W-SU","WET","Zulu" // 638 } Rules { AN:intvector { @@ -2933,539 +2939,540 @@ zoneinfo64:table(nofallback) { "CA", //Z#101 America/Coral_Harbour "AR", //Z#102 America/Cordoba "CR", //Z#103 America/Costa_Rica - "CA", //Z#104 America/Creston - "BR", //Z#105 America/Cuiaba - "CW", //Z#106 America/Curacao - "GL", //Z#107 America/Danmarkshavn - "CA", //Z#108 America/Dawson - "CA", //Z#109 America/Dawson_Creek - "US", //Z#110 America/Denver - "US", //Z#111 America/Detroit - "DM", //Z#112 America/Dominica - "CA", //Z#113 America/Edmonton - "BR", //Z#114 America/Eirunepe - "SV", //Z#115 America/El_Salvador - "MX", //Z#116 America/Ensenada - "CA", //Z#117 America/Fort_Nelson - "US", //Z#118 America/Fort_Wayne - "BR", //Z#119 America/Fortaleza - "CA", //Z#120 America/Glace_Bay - "GL", //Z#121 America/Godthab - "CA", //Z#122 America/Goose_Bay - "TC", //Z#123 America/Grand_Turk - "GD", //Z#124 America/Grenada - "GP", //Z#125 America/Guadeloupe - "GT", //Z#126 America/Guatemala - "EC", //Z#127 America/Guayaquil - "GY", //Z#128 America/Guyana - "CA", //Z#129 America/Halifax - "CU", //Z#130 America/Havana - "MX", //Z#131 America/Hermosillo - "US", //Z#132 America/Indiana/Indianapolis - "US", //Z#133 America/Indiana/Knox - "US", //Z#134 America/Indiana/Marengo - "US", //Z#135 America/Indiana/Petersburg - "US", //Z#136 America/Indiana/Tell_City - "US", //Z#137 America/Indiana/Vevay - "US", //Z#138 America/Indiana/Vincennes - "US", //Z#139 America/Indiana/Winamac - "US", //Z#140 America/Indianapolis - "CA", //Z#141 America/Inuvik - "CA", //Z#142 America/Iqaluit - "JM", //Z#143 America/Jamaica - "AR", //Z#144 America/Jujuy - "US", //Z#145 America/Juneau - "US", //Z#146 America/Kentucky/Louisville - "US", //Z#147 America/Kentucky/Monticello - "US", //Z#148 America/Knox_IN - "BQ", //Z#149 America/Kralendijk - "BO", //Z#150 America/La_Paz - "PE", //Z#151 America/Lima - "US", //Z#152 America/Los_Angeles - "US", //Z#153 America/Louisville - "SX", //Z#154 America/Lower_Princes - "BR", //Z#155 America/Maceio - "NI", //Z#156 America/Managua - "BR", //Z#157 America/Manaus - "MF", //Z#158 America/Marigot - "MQ", //Z#159 America/Martinique - "MX", //Z#160 America/Matamoros - "MX", //Z#161 America/Mazatlan - "AR", //Z#162 America/Mendoza - "US", //Z#163 America/Menominee - "MX", //Z#164 America/Merida - "US", //Z#165 America/Metlakatla - "MX", //Z#166 America/Mexico_City - "PM", //Z#167 America/Miquelon - "CA", //Z#168 America/Moncton - "MX", //Z#169 America/Monterrey - "UY", //Z#170 America/Montevideo - "CA", //Z#171 America/Montreal - "MS", //Z#172 America/Montserrat - "BS", //Z#173 America/Nassau - "US", //Z#174 America/New_York - "CA", //Z#175 America/Nipigon - "US", //Z#176 America/Nome - "BR", //Z#177 America/Noronha - "US", //Z#178 America/North_Dakota/Beulah - "US", //Z#179 America/North_Dakota/Center - "US", //Z#180 America/North_Dakota/New_Salem - "GL", //Z#181 America/Nuuk - "MX", //Z#182 America/Ojinaga - "PA", //Z#183 America/Panama - "CA", //Z#184 America/Pangnirtung - "SR", //Z#185 America/Paramaribo - "US", //Z#186 America/Phoenix - "HT", //Z#187 America/Port-au-Prince - "TT", //Z#188 America/Port_of_Spain - "BR", //Z#189 America/Porto_Acre - "BR", //Z#190 America/Porto_Velho - "PR", //Z#191 America/Puerto_Rico - "CL", //Z#192 America/Punta_Arenas - "CA", //Z#193 America/Rainy_River - "CA", //Z#194 America/Rankin_Inlet - "BR", //Z#195 America/Recife - "CA", //Z#196 America/Regina - "CA", //Z#197 America/Resolute - "BR", //Z#198 America/Rio_Branco - "AR", //Z#199 America/Rosario - "MX", //Z#200 America/Santa_Isabel - "BR", //Z#201 America/Santarem - "CL", //Z#202 America/Santiago - "DO", //Z#203 America/Santo_Domingo - "BR", //Z#204 America/Sao_Paulo - "GL", //Z#205 America/Scoresbysund - "US", //Z#206 America/Shiprock - "US", //Z#207 America/Sitka - "BL", //Z#208 America/St_Barthelemy - "CA", //Z#209 America/St_Johns - "KN", //Z#210 America/St_Kitts - "LC", //Z#211 America/St_Lucia - "VI", //Z#212 America/St_Thomas - "VC", //Z#213 America/St_Vincent - "CA", //Z#214 America/Swift_Current - "HN", //Z#215 America/Tegucigalpa - "GL", //Z#216 America/Thule - "CA", //Z#217 America/Thunder_Bay - "MX", //Z#218 America/Tijuana - "CA", //Z#219 America/Toronto - "VG", //Z#220 America/Tortola - "CA", //Z#221 America/Vancouver - "VI", //Z#222 America/Virgin - "CA", //Z#223 America/Whitehorse - "CA", //Z#224 America/Winnipeg - "US", //Z#225 America/Yakutat - "CA", //Z#226 America/Yellowknife - "AQ", //Z#227 Antarctica/Casey - "AQ", //Z#228 Antarctica/Davis - "AQ", //Z#229 Antarctica/DumontDUrville - "AU", //Z#230 Antarctica/Macquarie - "AQ", //Z#231 Antarctica/Mawson - "AQ", //Z#232 Antarctica/McMurdo - "AQ", //Z#233 Antarctica/Palmer - "AQ", //Z#234 Antarctica/Rothera - "AQ", //Z#235 Antarctica/South_Pole - "AQ", //Z#236 Antarctica/Syowa - "AQ", //Z#237 Antarctica/Troll - "AQ", //Z#238 Antarctica/Vostok - "SJ", //Z#239 Arctic/Longyearbyen - "YE", //Z#240 Asia/Aden - "KZ", //Z#241 Asia/Almaty - "JO", //Z#242 Asia/Amman - "RU", //Z#243 Asia/Anadyr - "KZ", //Z#244 Asia/Aqtau - "KZ", //Z#245 Asia/Aqtobe - "TM", //Z#246 Asia/Ashgabat - "TM", //Z#247 Asia/Ashkhabad - "KZ", //Z#248 Asia/Atyrau - "IQ", //Z#249 Asia/Baghdad - "BH", //Z#250 Asia/Bahrain - "AZ", //Z#251 Asia/Baku - "TH", //Z#252 Asia/Bangkok - "RU", //Z#253 Asia/Barnaul - "LB", //Z#254 Asia/Beirut - "KG", //Z#255 Asia/Bishkek - "BN", //Z#256 Asia/Brunei - "IN", //Z#257 Asia/Calcutta - "RU", //Z#258 Asia/Chita - "MN", //Z#259 Asia/Choibalsan - "CN", //Z#260 Asia/Chongqing - "CN", //Z#261 Asia/Chungking - "LK", //Z#262 Asia/Colombo - "BD", //Z#263 Asia/Dacca - "SY", //Z#264 Asia/Damascus - "BD", //Z#265 Asia/Dhaka - "TL", //Z#266 Asia/Dili - "AE", //Z#267 Asia/Dubai - "TJ", //Z#268 Asia/Dushanbe - "CY", //Z#269 Asia/Famagusta - "PS", //Z#270 Asia/Gaza - "CN", //Z#271 Asia/Harbin - "PS", //Z#272 Asia/Hebron - "VN", //Z#273 Asia/Ho_Chi_Minh - "HK", //Z#274 Asia/Hong_Kong - "MN", //Z#275 Asia/Hovd - "RU", //Z#276 Asia/Irkutsk - "TR", //Z#277 Asia/Istanbul - "ID", //Z#278 Asia/Jakarta - "ID", //Z#279 Asia/Jayapura - "IL", //Z#280 Asia/Jerusalem - "AF", //Z#281 Asia/Kabul - "RU", //Z#282 Asia/Kamchatka - "PK", //Z#283 Asia/Karachi - "CN", //Z#284 Asia/Kashgar - "NP", //Z#285 Asia/Kathmandu - "NP", //Z#286 Asia/Katmandu - "RU", //Z#287 Asia/Khandyga - "IN", //Z#288 Asia/Kolkata - "RU", //Z#289 Asia/Krasnoyarsk - "MY", //Z#290 Asia/Kuala_Lumpur - "MY", //Z#291 Asia/Kuching - "KW", //Z#292 Asia/Kuwait - "MO", //Z#293 Asia/Macao - "MO", //Z#294 Asia/Macau - "RU", //Z#295 Asia/Magadan - "ID", //Z#296 Asia/Makassar - "PH", //Z#297 Asia/Manila - "OM", //Z#298 Asia/Muscat - "CY", //Z#299 Asia/Nicosia - "RU", //Z#300 Asia/Novokuznetsk - "RU", //Z#301 Asia/Novosibirsk - "RU", //Z#302 Asia/Omsk - "KZ", //Z#303 Asia/Oral - "KH", //Z#304 Asia/Phnom_Penh - "ID", //Z#305 Asia/Pontianak - "KP", //Z#306 Asia/Pyongyang - "QA", //Z#307 Asia/Qatar - "KZ", //Z#308 Asia/Qostanay - "KZ", //Z#309 Asia/Qyzylorda - "MM", //Z#310 Asia/Rangoon - "SA", //Z#311 Asia/Riyadh - "VN", //Z#312 Asia/Saigon - "RU", //Z#313 Asia/Sakhalin - "UZ", //Z#314 Asia/Samarkand - "KR", //Z#315 Asia/Seoul - "CN", //Z#316 Asia/Shanghai - "SG", //Z#317 Asia/Singapore - "RU", //Z#318 Asia/Srednekolymsk - "TW", //Z#319 Asia/Taipei - "UZ", //Z#320 Asia/Tashkent - "GE", //Z#321 Asia/Tbilisi - "IR", //Z#322 Asia/Tehran - "IL", //Z#323 Asia/Tel_Aviv - "BT", //Z#324 Asia/Thimbu - "BT", //Z#325 Asia/Thimphu - "JP", //Z#326 Asia/Tokyo - "RU", //Z#327 Asia/Tomsk - "ID", //Z#328 Asia/Ujung_Pandang - "MN", //Z#329 Asia/Ulaanbaatar - "MN", //Z#330 Asia/Ulan_Bator - "CN", //Z#331 Asia/Urumqi - "RU", //Z#332 Asia/Ust-Nera - "LA", //Z#333 Asia/Vientiane - "RU", //Z#334 Asia/Vladivostok - "RU", //Z#335 Asia/Yakutsk - "MM", //Z#336 Asia/Yangon - "RU", //Z#337 Asia/Yekaterinburg - "AM", //Z#338 Asia/Yerevan - "PT", //Z#339 Atlantic/Azores - "BM", //Z#340 Atlantic/Bermuda - "ES", //Z#341 Atlantic/Canary - "CV", //Z#342 Atlantic/Cape_Verde - "FO", //Z#343 Atlantic/Faeroe - "FO", //Z#344 Atlantic/Faroe - "SJ", //Z#345 Atlantic/Jan_Mayen - "PT", //Z#346 Atlantic/Madeira - "IS", //Z#347 Atlantic/Reykjavik - "GS", //Z#348 Atlantic/South_Georgia - "SH", //Z#349 Atlantic/St_Helena - "FK", //Z#350 Atlantic/Stanley - "AU", //Z#351 Australia/ACT - "AU", //Z#352 Australia/Adelaide - "AU", //Z#353 Australia/Brisbane - "AU", //Z#354 Australia/Broken_Hill - "AU", //Z#355 Australia/Canberra - "AU", //Z#356 Australia/Currie - "AU", //Z#357 Australia/Darwin - "AU", //Z#358 Australia/Eucla - "AU", //Z#359 Australia/Hobart - "AU", //Z#360 Australia/LHI - "AU", //Z#361 Australia/Lindeman - "AU", //Z#362 Australia/Lord_Howe - "AU", //Z#363 Australia/Melbourne - "AU", //Z#364 Australia/NSW - "AU", //Z#365 Australia/North - "AU", //Z#366 Australia/Perth - "AU", //Z#367 Australia/Queensland - "AU", //Z#368 Australia/South - "AU", //Z#369 Australia/Sydney - "AU", //Z#370 Australia/Tasmania - "AU", //Z#371 Australia/Victoria - "AU", //Z#372 Australia/West - "AU", //Z#373 Australia/Yancowinna - "BR", //Z#374 BET - "BD", //Z#375 BST - "BR", //Z#376 Brazil/Acre - "BR", //Z#377 Brazil/DeNoronha - "BR", //Z#378 Brazil/East - "BR", //Z#379 Brazil/West - "MZ", //Z#380 CAT - "BE", //Z#381 CET - "CA", //Z#382 CNT - "US", //Z#383 CST - "US", //Z#384 CST6CDT - "CN", //Z#385 CTT - "CA", //Z#386 Canada/Atlantic - "CA", //Z#387 Canada/Central - "CA", //Z#388 Canada/East-Saskatchewan - "CA", //Z#389 Canada/Eastern - "CA", //Z#390 Canada/Mountain - "CA", //Z#391 Canada/Newfoundland - "CA", //Z#392 Canada/Pacific - "CA", //Z#393 Canada/Saskatchewan - "CA", //Z#394 Canada/Yukon - "CL", //Z#395 Chile/Continental - "CL", //Z#396 Chile/EasterIsland - "CU", //Z#397 Cuba - "KE", //Z#398 EAT - "FR", //Z#399 ECT - "GR", //Z#400 EET - "PA", //Z#401 EST - "US", //Z#402 EST5EDT - "EG", //Z#403 Egypt - "IE", //Z#404 Eire - "001",//Z#405 Etc/GMT - "001",//Z#406 Etc/GMT+0 - "001",//Z#407 Etc/GMT+1 - "001",//Z#408 Etc/GMT+10 - "001",//Z#409 Etc/GMT+11 - "001",//Z#410 Etc/GMT+12 - "001",//Z#411 Etc/GMT+2 - "001",//Z#412 Etc/GMT+3 - "001",//Z#413 Etc/GMT+4 - "001",//Z#414 Etc/GMT+5 - "001",//Z#415 Etc/GMT+6 - "001",//Z#416 Etc/GMT+7 - "001",//Z#417 Etc/GMT+8 - "001",//Z#418 Etc/GMT+9 - "001",//Z#419 Etc/GMT-0 - "001",//Z#420 Etc/GMT-1 - "001",//Z#421 Etc/GMT-10 - "001",//Z#422 Etc/GMT-11 - "001",//Z#423 Etc/GMT-12 - "001",//Z#424 Etc/GMT-13 - "001",//Z#425 Etc/GMT-14 - "001",//Z#426 Etc/GMT-2 - "001",//Z#427 Etc/GMT-3 - "001",//Z#428 Etc/GMT-4 - "001",//Z#429 Etc/GMT-5 - "001",//Z#430 Etc/GMT-6 - "001",//Z#431 Etc/GMT-7 - "001",//Z#432 Etc/GMT-8 - "001",//Z#433 Etc/GMT-9 - "001",//Z#434 Etc/GMT0 - "001",//Z#435 Etc/Greenwich - "001",//Z#436 Etc/UCT - "001",//Z#437 Etc/UTC - "001",//Z#438 Etc/Universal - "001",//Z#439 Etc/Unknown - "001",//Z#440 Etc/Zulu - "NL", //Z#441 Europe/Amsterdam - "AD", //Z#442 Europe/Andorra - "RU", //Z#443 Europe/Astrakhan - "GR", //Z#444 Europe/Athens - "GB", //Z#445 Europe/Belfast - "RS", //Z#446 Europe/Belgrade - "DE", //Z#447 Europe/Berlin - "SK", //Z#448 Europe/Bratislava - "BE", //Z#449 Europe/Brussels - "RO", //Z#450 Europe/Bucharest - "HU", //Z#451 Europe/Budapest - "DE", //Z#452 Europe/Busingen - "MD", //Z#453 Europe/Chisinau - "DK", //Z#454 Europe/Copenhagen - "IE", //Z#455 Europe/Dublin - "GI", //Z#456 Europe/Gibraltar - "GG", //Z#457 Europe/Guernsey - "FI", //Z#458 Europe/Helsinki - "IM", //Z#459 Europe/Isle_of_Man - "TR", //Z#460 Europe/Istanbul - "JE", //Z#461 Europe/Jersey - "RU", //Z#462 Europe/Kaliningrad - "UA", //Z#463 Europe/Kiev - "RU", //Z#464 Europe/Kirov - "UA", //Z#465 Europe/Kyiv - "PT", //Z#466 Europe/Lisbon - "SI", //Z#467 Europe/Ljubljana - "GB", //Z#468 Europe/London - "LU", //Z#469 Europe/Luxembourg - "ES", //Z#470 Europe/Madrid - "MT", //Z#471 Europe/Malta - "AX", //Z#472 Europe/Mariehamn - "BY", //Z#473 Europe/Minsk - "MC", //Z#474 Europe/Monaco - "RU", //Z#475 Europe/Moscow - "CY", //Z#476 Europe/Nicosia - "NO", //Z#477 Europe/Oslo - "FR", //Z#478 Europe/Paris - "ME", //Z#479 Europe/Podgorica - "CZ", //Z#480 Europe/Prague - "LV", //Z#481 Europe/Riga - "IT", //Z#482 Europe/Rome - "RU", //Z#483 Europe/Samara - "SM", //Z#484 Europe/San_Marino - "BA", //Z#485 Europe/Sarajevo - "RU", //Z#486 Europe/Saratov - "UA", //Z#487 Europe/Simferopol - "MK", //Z#488 Europe/Skopje - "BG", //Z#489 Europe/Sofia - "SE", //Z#490 Europe/Stockholm - "EE", //Z#491 Europe/Tallinn - "AL", //Z#492 Europe/Tirane - "MD", //Z#493 Europe/Tiraspol - "RU", //Z#494 Europe/Ulyanovsk - "UA", //Z#495 Europe/Uzhgorod - "LI", //Z#496 Europe/Vaduz - "VA", //Z#497 Europe/Vatican - "AT", //Z#498 Europe/Vienna - "LT", //Z#499 Europe/Vilnius - "RU", //Z#500 Europe/Volgograd - "PL", //Z#501 Europe/Warsaw - "HR", //Z#502 Europe/Zagreb - "UA", //Z#503 Europe/Zaporozhye - "CH", //Z#504 Europe/Zurich - "001",//Z#505 Factory - "GB", //Z#506 GB - "GB", //Z#507 GB-Eire - "001",//Z#508 GMT - "001",//Z#509 GMT+0 - "001",//Z#510 GMT-0 - "001",//Z#511 GMT0 - "001",//Z#512 Greenwich - "US", //Z#513 HST - "HK", //Z#514 Hongkong - "US", //Z#515 IET - "IN", //Z#516 IST - "CI", //Z#517 Iceland - "MG", //Z#518 Indian/Antananarivo - "IO", //Z#519 Indian/Chagos - "CX", //Z#520 Indian/Christmas - "CC", //Z#521 Indian/Cocos - "KM", //Z#522 Indian/Comoro - "TF", //Z#523 Indian/Kerguelen - "SC", //Z#524 Indian/Mahe - "MV", //Z#525 Indian/Maldives - "MU", //Z#526 Indian/Mauritius - "YT", //Z#527 Indian/Mayotte - "RE", //Z#528 Indian/Reunion - "IR", //Z#529 Iran - "IL", //Z#530 Israel - "JP", //Z#531 JST - "JM", //Z#532 Jamaica - "JP", //Z#533 Japan - "MH", //Z#534 Kwajalein - "LY", //Z#535 Libya - "BE", //Z#536 MET - "WS", //Z#537 MIT - "US", //Z#538 MST - "US", //Z#539 MST7MDT - "MX", //Z#540 Mexico/BajaNorte - "MX", //Z#541 Mexico/BajaSur - "MX", //Z#542 Mexico/General - "AM", //Z#543 NET - "NZ", //Z#544 NST - "NZ", //Z#545 NZ - "NZ", //Z#546 NZ-CHAT - "US", //Z#547 Navajo - "PK", //Z#548 PLT - "US", //Z#549 PNT - "CN", //Z#550 PRC - "PR", //Z#551 PRT - "US", //Z#552 PST - "US", //Z#553 PST8PDT - "WS", //Z#554 Pacific/Apia - "NZ", //Z#555 Pacific/Auckland - "PG", //Z#556 Pacific/Bougainville - "NZ", //Z#557 Pacific/Chatham - "FM", //Z#558 Pacific/Chuuk - "CL", //Z#559 Pacific/Easter - "VU", //Z#560 Pacific/Efate - "KI", //Z#561 Pacific/Enderbury - "TK", //Z#562 Pacific/Fakaofo - "FJ", //Z#563 Pacific/Fiji - "TV", //Z#564 Pacific/Funafuti - "EC", //Z#565 Pacific/Galapagos - "PF", //Z#566 Pacific/Gambier - "SB", //Z#567 Pacific/Guadalcanal - "GU", //Z#568 Pacific/Guam - "US", //Z#569 Pacific/Honolulu - "UM", //Z#570 Pacific/Johnston - "KI", //Z#571 Pacific/Kanton - "KI", //Z#572 Pacific/Kiritimati - "FM", //Z#573 Pacific/Kosrae - "MH", //Z#574 Pacific/Kwajalein - "MH", //Z#575 Pacific/Majuro - "PF", //Z#576 Pacific/Marquesas - "UM", //Z#577 Pacific/Midway - "NR", //Z#578 Pacific/Nauru - "NU", //Z#579 Pacific/Niue - "NF", //Z#580 Pacific/Norfolk - "NC", //Z#581 Pacific/Noumea - "AS", //Z#582 Pacific/Pago_Pago - "PW", //Z#583 Pacific/Palau - "PN", //Z#584 Pacific/Pitcairn - "FM", //Z#585 Pacific/Pohnpei - "FM", //Z#586 Pacific/Ponape - "PG", //Z#587 Pacific/Port_Moresby - "CK", //Z#588 Pacific/Rarotonga - "MP", //Z#589 Pacific/Saipan - "AS", //Z#590 Pacific/Samoa - "PF", //Z#591 Pacific/Tahiti - "KI", //Z#592 Pacific/Tarawa - "TO", //Z#593 Pacific/Tongatapu - "FM", //Z#594 Pacific/Truk - "UM", //Z#595 Pacific/Wake - "WF", //Z#596 Pacific/Wallis - "FM", //Z#597 Pacific/Yap - "PL", //Z#598 Poland - "PT", //Z#599 Portugal - "TW", //Z#600 ROC - "KR", //Z#601 ROK - "SB", //Z#602 SST - "SG", //Z#603 Singapore - "001",//Z#604 SystemV/AST4 - "001",//Z#605 SystemV/AST4ADT - "001",//Z#606 SystemV/CST6 - "001",//Z#607 SystemV/CST6CDT - "001",//Z#608 SystemV/EST5 - "001",//Z#609 SystemV/EST5EDT - "001",//Z#610 SystemV/HST10 - "001",//Z#611 SystemV/MST7 - "001",//Z#612 SystemV/MST7MDT - "001",//Z#613 SystemV/PST8 - "001",//Z#614 SystemV/PST8PDT - "001",//Z#615 SystemV/YST9 - "001",//Z#616 SystemV/YST9YDT - "TR", //Z#617 Turkey - "001",//Z#618 UCT - "US", //Z#619 US/Alaska - "US", //Z#620 US/Aleutian - "US", //Z#621 US/Arizona - "US", //Z#622 US/Central - "US", //Z#623 US/East-Indiana - "US", //Z#624 US/Eastern - "US", //Z#625 US/Hawaii - "US", //Z#626 US/Indiana-Starke - "US", //Z#627 US/Michigan - "US", //Z#628 US/Mountain - "US", //Z#629 US/Pacific - "US", //Z#630 US/Pacific-New - "AS", //Z#631 US/Samoa - "001",//Z#632 UTC - "001",//Z#633 Universal - "VN", //Z#634 VST - "RU", //Z#635 W-SU - "PT", //Z#636 WET - "001",//Z#637 Zulu + "CL", //Z#104 America/Coyhaique + "CA", //Z#105 America/Creston + "BR", //Z#106 America/Cuiaba + "CW", //Z#107 America/Curacao + "GL", //Z#108 America/Danmarkshavn + "CA", //Z#109 America/Dawson + "CA", //Z#110 America/Dawson_Creek + "US", //Z#111 America/Denver + "US", //Z#112 America/Detroit + "DM", //Z#113 America/Dominica + "CA", //Z#114 America/Edmonton + "BR", //Z#115 America/Eirunepe + "SV", //Z#116 America/El_Salvador + "MX", //Z#117 America/Ensenada + "CA", //Z#118 America/Fort_Nelson + "US", //Z#119 America/Fort_Wayne + "BR", //Z#120 America/Fortaleza + "CA", //Z#121 America/Glace_Bay + "GL", //Z#122 America/Godthab + "CA", //Z#123 America/Goose_Bay + "TC", //Z#124 America/Grand_Turk + "GD", //Z#125 America/Grenada + "GP", //Z#126 America/Guadeloupe + "GT", //Z#127 America/Guatemala + "EC", //Z#128 America/Guayaquil + "GY", //Z#129 America/Guyana + "CA", //Z#130 America/Halifax + "CU", //Z#131 America/Havana + "MX", //Z#132 America/Hermosillo + "US", //Z#133 America/Indiana/Indianapolis + "US", //Z#134 America/Indiana/Knox + "US", //Z#135 America/Indiana/Marengo + "US", //Z#136 America/Indiana/Petersburg + "US", //Z#137 America/Indiana/Tell_City + "US", //Z#138 America/Indiana/Vevay + "US", //Z#139 America/Indiana/Vincennes + "US", //Z#140 America/Indiana/Winamac + "US", //Z#141 America/Indianapolis + "CA", //Z#142 America/Inuvik + "CA", //Z#143 America/Iqaluit + "JM", //Z#144 America/Jamaica + "AR", //Z#145 America/Jujuy + "US", //Z#146 America/Juneau + "US", //Z#147 America/Kentucky/Louisville + "US", //Z#148 America/Kentucky/Monticello + "US", //Z#149 America/Knox_IN + "BQ", //Z#150 America/Kralendijk + "BO", //Z#151 America/La_Paz + "PE", //Z#152 America/Lima + "US", //Z#153 America/Los_Angeles + "US", //Z#154 America/Louisville + "SX", //Z#155 America/Lower_Princes + "BR", //Z#156 America/Maceio + "NI", //Z#157 America/Managua + "BR", //Z#158 America/Manaus + "MF", //Z#159 America/Marigot + "MQ", //Z#160 America/Martinique + "MX", //Z#161 America/Matamoros + "MX", //Z#162 America/Mazatlan + "AR", //Z#163 America/Mendoza + "US", //Z#164 America/Menominee + "MX", //Z#165 America/Merida + "US", //Z#166 America/Metlakatla + "MX", //Z#167 America/Mexico_City + "PM", //Z#168 America/Miquelon + "CA", //Z#169 America/Moncton + "MX", //Z#170 America/Monterrey + "UY", //Z#171 America/Montevideo + "CA", //Z#172 America/Montreal + "MS", //Z#173 America/Montserrat + "BS", //Z#174 America/Nassau + "US", //Z#175 America/New_York + "CA", //Z#176 America/Nipigon + "US", //Z#177 America/Nome + "BR", //Z#178 America/Noronha + "US", //Z#179 America/North_Dakota/Beulah + "US", //Z#180 America/North_Dakota/Center + "US", //Z#181 America/North_Dakota/New_Salem + "GL", //Z#182 America/Nuuk + "MX", //Z#183 America/Ojinaga + "PA", //Z#184 America/Panama + "CA", //Z#185 America/Pangnirtung + "SR", //Z#186 America/Paramaribo + "US", //Z#187 America/Phoenix + "HT", //Z#188 America/Port-au-Prince + "TT", //Z#189 America/Port_of_Spain + "BR", //Z#190 America/Porto_Acre + "BR", //Z#191 America/Porto_Velho + "PR", //Z#192 America/Puerto_Rico + "CL", //Z#193 America/Punta_Arenas + "CA", //Z#194 America/Rainy_River + "CA", //Z#195 America/Rankin_Inlet + "BR", //Z#196 America/Recife + "CA", //Z#197 America/Regina + "CA", //Z#198 America/Resolute + "BR", //Z#199 America/Rio_Branco + "AR", //Z#200 America/Rosario + "MX", //Z#201 America/Santa_Isabel + "BR", //Z#202 America/Santarem + "CL", //Z#203 America/Santiago + "DO", //Z#204 America/Santo_Domingo + "BR", //Z#205 America/Sao_Paulo + "GL", //Z#206 America/Scoresbysund + "US", //Z#207 America/Shiprock + "US", //Z#208 America/Sitka + "BL", //Z#209 America/St_Barthelemy + "CA", //Z#210 America/St_Johns + "KN", //Z#211 America/St_Kitts + "LC", //Z#212 America/St_Lucia + "VI", //Z#213 America/St_Thomas + "VC", //Z#214 America/St_Vincent + "CA", //Z#215 America/Swift_Current + "HN", //Z#216 America/Tegucigalpa + "GL", //Z#217 America/Thule + "CA", //Z#218 America/Thunder_Bay + "MX", //Z#219 America/Tijuana + "CA", //Z#220 America/Toronto + "VG", //Z#221 America/Tortola + "CA", //Z#222 America/Vancouver + "VI", //Z#223 America/Virgin + "CA", //Z#224 America/Whitehorse + "CA", //Z#225 America/Winnipeg + "US", //Z#226 America/Yakutat + "CA", //Z#227 America/Yellowknife + "AQ", //Z#228 Antarctica/Casey + "AQ", //Z#229 Antarctica/Davis + "AQ", //Z#230 Antarctica/DumontDUrville + "AU", //Z#231 Antarctica/Macquarie + "AQ", //Z#232 Antarctica/Mawson + "AQ", //Z#233 Antarctica/McMurdo + "AQ", //Z#234 Antarctica/Palmer + "AQ", //Z#235 Antarctica/Rothera + "AQ", //Z#236 Antarctica/South_Pole + "AQ", //Z#237 Antarctica/Syowa + "AQ", //Z#238 Antarctica/Troll + "AQ", //Z#239 Antarctica/Vostok + "SJ", //Z#240 Arctic/Longyearbyen + "YE", //Z#241 Asia/Aden + "KZ", //Z#242 Asia/Almaty + "JO", //Z#243 Asia/Amman + "RU", //Z#244 Asia/Anadyr + "KZ", //Z#245 Asia/Aqtau + "KZ", //Z#246 Asia/Aqtobe + "TM", //Z#247 Asia/Ashgabat + "TM", //Z#248 Asia/Ashkhabad + "KZ", //Z#249 Asia/Atyrau + "IQ", //Z#250 Asia/Baghdad + "BH", //Z#251 Asia/Bahrain + "AZ", //Z#252 Asia/Baku + "TH", //Z#253 Asia/Bangkok + "RU", //Z#254 Asia/Barnaul + "LB", //Z#255 Asia/Beirut + "KG", //Z#256 Asia/Bishkek + "BN", //Z#257 Asia/Brunei + "IN", //Z#258 Asia/Calcutta + "RU", //Z#259 Asia/Chita + "MN", //Z#260 Asia/Choibalsan + "CN", //Z#261 Asia/Chongqing + "CN", //Z#262 Asia/Chungking + "LK", //Z#263 Asia/Colombo + "BD", //Z#264 Asia/Dacca + "SY", //Z#265 Asia/Damascus + "BD", //Z#266 Asia/Dhaka + "TL", //Z#267 Asia/Dili + "AE", //Z#268 Asia/Dubai + "TJ", //Z#269 Asia/Dushanbe + "CY", //Z#270 Asia/Famagusta + "PS", //Z#271 Asia/Gaza + "CN", //Z#272 Asia/Harbin + "PS", //Z#273 Asia/Hebron + "VN", //Z#274 Asia/Ho_Chi_Minh + "HK", //Z#275 Asia/Hong_Kong + "MN", //Z#276 Asia/Hovd + "RU", //Z#277 Asia/Irkutsk + "TR", //Z#278 Asia/Istanbul + "ID", //Z#279 Asia/Jakarta + "ID", //Z#280 Asia/Jayapura + "IL", //Z#281 Asia/Jerusalem + "AF", //Z#282 Asia/Kabul + "RU", //Z#283 Asia/Kamchatka + "PK", //Z#284 Asia/Karachi + "CN", //Z#285 Asia/Kashgar + "NP", //Z#286 Asia/Kathmandu + "NP", //Z#287 Asia/Katmandu + "RU", //Z#288 Asia/Khandyga + "IN", //Z#289 Asia/Kolkata + "RU", //Z#290 Asia/Krasnoyarsk + "MY", //Z#291 Asia/Kuala_Lumpur + "MY", //Z#292 Asia/Kuching + "KW", //Z#293 Asia/Kuwait + "MO", //Z#294 Asia/Macao + "MO", //Z#295 Asia/Macau + "RU", //Z#296 Asia/Magadan + "ID", //Z#297 Asia/Makassar + "PH", //Z#298 Asia/Manila + "OM", //Z#299 Asia/Muscat + "CY", //Z#300 Asia/Nicosia + "RU", //Z#301 Asia/Novokuznetsk + "RU", //Z#302 Asia/Novosibirsk + "RU", //Z#303 Asia/Omsk + "KZ", //Z#304 Asia/Oral + "KH", //Z#305 Asia/Phnom_Penh + "ID", //Z#306 Asia/Pontianak + "KP", //Z#307 Asia/Pyongyang + "QA", //Z#308 Asia/Qatar + "KZ", //Z#309 Asia/Qostanay + "KZ", //Z#310 Asia/Qyzylorda + "MM", //Z#311 Asia/Rangoon + "SA", //Z#312 Asia/Riyadh + "VN", //Z#313 Asia/Saigon + "RU", //Z#314 Asia/Sakhalin + "UZ", //Z#315 Asia/Samarkand + "KR", //Z#316 Asia/Seoul + "CN", //Z#317 Asia/Shanghai + "SG", //Z#318 Asia/Singapore + "RU", //Z#319 Asia/Srednekolymsk + "TW", //Z#320 Asia/Taipei + "UZ", //Z#321 Asia/Tashkent + "GE", //Z#322 Asia/Tbilisi + "IR", //Z#323 Asia/Tehran + "IL", //Z#324 Asia/Tel_Aviv + "BT", //Z#325 Asia/Thimbu + "BT", //Z#326 Asia/Thimphu + "JP", //Z#327 Asia/Tokyo + "RU", //Z#328 Asia/Tomsk + "ID", //Z#329 Asia/Ujung_Pandang + "MN", //Z#330 Asia/Ulaanbaatar + "MN", //Z#331 Asia/Ulan_Bator + "CN", //Z#332 Asia/Urumqi + "RU", //Z#333 Asia/Ust-Nera + "LA", //Z#334 Asia/Vientiane + "RU", //Z#335 Asia/Vladivostok + "RU", //Z#336 Asia/Yakutsk + "MM", //Z#337 Asia/Yangon + "RU", //Z#338 Asia/Yekaterinburg + "AM", //Z#339 Asia/Yerevan + "PT", //Z#340 Atlantic/Azores + "BM", //Z#341 Atlantic/Bermuda + "ES", //Z#342 Atlantic/Canary + "CV", //Z#343 Atlantic/Cape_Verde + "FO", //Z#344 Atlantic/Faeroe + "FO", //Z#345 Atlantic/Faroe + "SJ", //Z#346 Atlantic/Jan_Mayen + "PT", //Z#347 Atlantic/Madeira + "IS", //Z#348 Atlantic/Reykjavik + "GS", //Z#349 Atlantic/South_Georgia + "SH", //Z#350 Atlantic/St_Helena + "FK", //Z#351 Atlantic/Stanley + "AU", //Z#352 Australia/ACT + "AU", //Z#353 Australia/Adelaide + "AU", //Z#354 Australia/Brisbane + "AU", //Z#355 Australia/Broken_Hill + "AU", //Z#356 Australia/Canberra + "AU", //Z#357 Australia/Currie + "AU", //Z#358 Australia/Darwin + "AU", //Z#359 Australia/Eucla + "AU", //Z#360 Australia/Hobart + "AU", //Z#361 Australia/LHI + "AU", //Z#362 Australia/Lindeman + "AU", //Z#363 Australia/Lord_Howe + "AU", //Z#364 Australia/Melbourne + "AU", //Z#365 Australia/NSW + "AU", //Z#366 Australia/North + "AU", //Z#367 Australia/Perth + "AU", //Z#368 Australia/Queensland + "AU", //Z#369 Australia/South + "AU", //Z#370 Australia/Sydney + "AU", //Z#371 Australia/Tasmania + "AU", //Z#372 Australia/Victoria + "AU", //Z#373 Australia/West + "AU", //Z#374 Australia/Yancowinna + "BR", //Z#375 BET + "BD", //Z#376 BST + "BR", //Z#377 Brazil/Acre + "BR", //Z#378 Brazil/DeNoronha + "BR", //Z#379 Brazil/East + "BR", //Z#380 Brazil/West + "MZ", //Z#381 CAT + "BE", //Z#382 CET + "CA", //Z#383 CNT + "US", //Z#384 CST + "US", //Z#385 CST6CDT + "CN", //Z#386 CTT + "CA", //Z#387 Canada/Atlantic + "CA", //Z#388 Canada/Central + "CA", //Z#389 Canada/East-Saskatchewan + "CA", //Z#390 Canada/Eastern + "CA", //Z#391 Canada/Mountain + "CA", //Z#392 Canada/Newfoundland + "CA", //Z#393 Canada/Pacific + "CA", //Z#394 Canada/Saskatchewan + "CA", //Z#395 Canada/Yukon + "CL", //Z#396 Chile/Continental + "CL", //Z#397 Chile/EasterIsland + "CU", //Z#398 Cuba + "KE", //Z#399 EAT + "FR", //Z#400 ECT + "GR", //Z#401 EET + "PA", //Z#402 EST + "US", //Z#403 EST5EDT + "EG", //Z#404 Egypt + "IE", //Z#405 Eire + "001",//Z#406 Etc/GMT + "001",//Z#407 Etc/GMT+0 + "001",//Z#408 Etc/GMT+1 + "001",//Z#409 Etc/GMT+10 + "001",//Z#410 Etc/GMT+11 + "001",//Z#411 Etc/GMT+12 + "001",//Z#412 Etc/GMT+2 + "001",//Z#413 Etc/GMT+3 + "001",//Z#414 Etc/GMT+4 + "001",//Z#415 Etc/GMT+5 + "001",//Z#416 Etc/GMT+6 + "001",//Z#417 Etc/GMT+7 + "001",//Z#418 Etc/GMT+8 + "001",//Z#419 Etc/GMT+9 + "001",//Z#420 Etc/GMT-0 + "001",//Z#421 Etc/GMT-1 + "001",//Z#422 Etc/GMT-10 + "001",//Z#423 Etc/GMT-11 + "001",//Z#424 Etc/GMT-12 + "001",//Z#425 Etc/GMT-13 + "001",//Z#426 Etc/GMT-14 + "001",//Z#427 Etc/GMT-2 + "001",//Z#428 Etc/GMT-3 + "001",//Z#429 Etc/GMT-4 + "001",//Z#430 Etc/GMT-5 + "001",//Z#431 Etc/GMT-6 + "001",//Z#432 Etc/GMT-7 + "001",//Z#433 Etc/GMT-8 + "001",//Z#434 Etc/GMT-9 + "001",//Z#435 Etc/GMT0 + "001",//Z#436 Etc/Greenwich + "001",//Z#437 Etc/UCT + "001",//Z#438 Etc/UTC + "001",//Z#439 Etc/Universal + "001",//Z#440 Etc/Unknown + "001",//Z#441 Etc/Zulu + "NL", //Z#442 Europe/Amsterdam + "AD", //Z#443 Europe/Andorra + "RU", //Z#444 Europe/Astrakhan + "GR", //Z#445 Europe/Athens + "GB", //Z#446 Europe/Belfast + "RS", //Z#447 Europe/Belgrade + "DE", //Z#448 Europe/Berlin + "SK", //Z#449 Europe/Bratislava + "BE", //Z#450 Europe/Brussels + "RO", //Z#451 Europe/Bucharest + "HU", //Z#452 Europe/Budapest + "DE", //Z#453 Europe/Busingen + "MD", //Z#454 Europe/Chisinau + "DK", //Z#455 Europe/Copenhagen + "IE", //Z#456 Europe/Dublin + "GI", //Z#457 Europe/Gibraltar + "GG", //Z#458 Europe/Guernsey + "FI", //Z#459 Europe/Helsinki + "IM", //Z#460 Europe/Isle_of_Man + "TR", //Z#461 Europe/Istanbul + "JE", //Z#462 Europe/Jersey + "RU", //Z#463 Europe/Kaliningrad + "UA", //Z#464 Europe/Kiev + "RU", //Z#465 Europe/Kirov + "UA", //Z#466 Europe/Kyiv + "PT", //Z#467 Europe/Lisbon + "SI", //Z#468 Europe/Ljubljana + "GB", //Z#469 Europe/London + "LU", //Z#470 Europe/Luxembourg + "ES", //Z#471 Europe/Madrid + "MT", //Z#472 Europe/Malta + "AX", //Z#473 Europe/Mariehamn + "BY", //Z#474 Europe/Minsk + "MC", //Z#475 Europe/Monaco + "RU", //Z#476 Europe/Moscow + "CY", //Z#477 Europe/Nicosia + "NO", //Z#478 Europe/Oslo + "FR", //Z#479 Europe/Paris + "ME", //Z#480 Europe/Podgorica + "CZ", //Z#481 Europe/Prague + "LV", //Z#482 Europe/Riga + "IT", //Z#483 Europe/Rome + "RU", //Z#484 Europe/Samara + "SM", //Z#485 Europe/San_Marino + "BA", //Z#486 Europe/Sarajevo + "RU", //Z#487 Europe/Saratov + "UA", //Z#488 Europe/Simferopol + "MK", //Z#489 Europe/Skopje + "BG", //Z#490 Europe/Sofia + "SE", //Z#491 Europe/Stockholm + "EE", //Z#492 Europe/Tallinn + "AL", //Z#493 Europe/Tirane + "MD", //Z#494 Europe/Tiraspol + "RU", //Z#495 Europe/Ulyanovsk + "UA", //Z#496 Europe/Uzhgorod + "LI", //Z#497 Europe/Vaduz + "VA", //Z#498 Europe/Vatican + "AT", //Z#499 Europe/Vienna + "LT", //Z#500 Europe/Vilnius + "RU", //Z#501 Europe/Volgograd + "PL", //Z#502 Europe/Warsaw + "HR", //Z#503 Europe/Zagreb + "UA", //Z#504 Europe/Zaporozhye + "CH", //Z#505 Europe/Zurich + "001",//Z#506 Factory + "GB", //Z#507 GB + "GB", //Z#508 GB-Eire + "001",//Z#509 GMT + "001",//Z#510 GMT+0 + "001",//Z#511 GMT-0 + "001",//Z#512 GMT0 + "001",//Z#513 Greenwich + "US", //Z#514 HST + "HK", //Z#515 Hongkong + "US", //Z#516 IET + "IN", //Z#517 IST + "CI", //Z#518 Iceland + "MG", //Z#519 Indian/Antananarivo + "IO", //Z#520 Indian/Chagos + "CX", //Z#521 Indian/Christmas + "CC", //Z#522 Indian/Cocos + "KM", //Z#523 Indian/Comoro + "TF", //Z#524 Indian/Kerguelen + "SC", //Z#525 Indian/Mahe + "MV", //Z#526 Indian/Maldives + "MU", //Z#527 Indian/Mauritius + "YT", //Z#528 Indian/Mayotte + "RE", //Z#529 Indian/Reunion + "IR", //Z#530 Iran + "IL", //Z#531 Israel + "JP", //Z#532 JST + "JM", //Z#533 Jamaica + "JP", //Z#534 Japan + "MH", //Z#535 Kwajalein + "LY", //Z#536 Libya + "BE", //Z#537 MET + "WS", //Z#538 MIT + "US", //Z#539 MST + "US", //Z#540 MST7MDT + "MX", //Z#541 Mexico/BajaNorte + "MX", //Z#542 Mexico/BajaSur + "MX", //Z#543 Mexico/General + "AM", //Z#544 NET + "NZ", //Z#545 NST + "NZ", //Z#546 NZ + "NZ", //Z#547 NZ-CHAT + "US", //Z#548 Navajo + "PK", //Z#549 PLT + "US", //Z#550 PNT + "CN", //Z#551 PRC + "PR", //Z#552 PRT + "US", //Z#553 PST + "US", //Z#554 PST8PDT + "WS", //Z#555 Pacific/Apia + "NZ", //Z#556 Pacific/Auckland + "PG", //Z#557 Pacific/Bougainville + "NZ", //Z#558 Pacific/Chatham + "FM", //Z#559 Pacific/Chuuk + "CL", //Z#560 Pacific/Easter + "VU", //Z#561 Pacific/Efate + "KI", //Z#562 Pacific/Enderbury + "TK", //Z#563 Pacific/Fakaofo + "FJ", //Z#564 Pacific/Fiji + "TV", //Z#565 Pacific/Funafuti + "EC", //Z#566 Pacific/Galapagos + "PF", //Z#567 Pacific/Gambier + "SB", //Z#568 Pacific/Guadalcanal + "GU", //Z#569 Pacific/Guam + "US", //Z#570 Pacific/Honolulu + "UM", //Z#571 Pacific/Johnston + "KI", //Z#572 Pacific/Kanton + "KI", //Z#573 Pacific/Kiritimati + "FM", //Z#574 Pacific/Kosrae + "MH", //Z#575 Pacific/Kwajalein + "MH", //Z#576 Pacific/Majuro + "PF", //Z#577 Pacific/Marquesas + "UM", //Z#578 Pacific/Midway + "NR", //Z#579 Pacific/Nauru + "NU", //Z#580 Pacific/Niue + "NF", //Z#581 Pacific/Norfolk + "NC", //Z#582 Pacific/Noumea + "AS", //Z#583 Pacific/Pago_Pago + "PW", //Z#584 Pacific/Palau + "PN", //Z#585 Pacific/Pitcairn + "FM", //Z#586 Pacific/Pohnpei + "FM", //Z#587 Pacific/Ponape + "PG", //Z#588 Pacific/Port_Moresby + "CK", //Z#589 Pacific/Rarotonga + "MP", //Z#590 Pacific/Saipan + "AS", //Z#591 Pacific/Samoa + "PF", //Z#592 Pacific/Tahiti + "KI", //Z#593 Pacific/Tarawa + "TO", //Z#594 Pacific/Tongatapu + "FM", //Z#595 Pacific/Truk + "UM", //Z#596 Pacific/Wake + "WF", //Z#597 Pacific/Wallis + "FM", //Z#598 Pacific/Yap + "PL", //Z#599 Poland + "PT", //Z#600 Portugal + "TW", //Z#601 ROC + "KR", //Z#602 ROK + "SB", //Z#603 SST + "SG", //Z#604 Singapore + "001",//Z#605 SystemV/AST4 + "001",//Z#606 SystemV/AST4ADT + "001",//Z#607 SystemV/CST6 + "001",//Z#608 SystemV/CST6CDT + "001",//Z#609 SystemV/EST5 + "001",//Z#610 SystemV/EST5EDT + "001",//Z#611 SystemV/HST10 + "001",//Z#612 SystemV/MST7 + "001",//Z#613 SystemV/MST7MDT + "001",//Z#614 SystemV/PST8 + "001",//Z#615 SystemV/PST8PDT + "001",//Z#616 SystemV/YST9 + "001",//Z#617 SystemV/YST9YDT + "TR", //Z#618 Turkey + "001",//Z#619 UCT + "US", //Z#620 US/Alaska + "US", //Z#621 US/Aleutian + "US", //Z#622 US/Arizona + "US", //Z#623 US/Central + "US", //Z#624 US/East-Indiana + "US", //Z#625 US/Eastern + "US", //Z#626 US/Hawaii + "US", //Z#627 US/Indiana-Starke + "US", //Z#628 US/Michigan + "US", //Z#629 US/Mountain + "US", //Z#630 US/Pacific + "US", //Z#631 US/Pacific-New + "AS", //Z#632 US/Samoa + "001",//Z#633 UTC + "001",//Z#634 Universal + "VN", //Z#635 VST + "RU", //Z#636 W-SU + "PT", //Z#637 WET + "001",//Z#638 Zulu } } diff --git a/js/moz.configure b/js/moz.configure index bb00e1acb53..eb4b274105b 100644 --- a/js/moz.configure +++ b/js/moz.configure @@ -1285,6 +1285,30 @@ set_define( depends_if("--enable-wasm-type-reflections")(lambda x: True), ) +# Support for resizable ArrayBuffer in Wasm +# ========================================= + + +@depends(milestone.is_nightly) +def default_wasm_resizable_arraybuffer(is_nightly): + return is_nightly + + +option( + "--enable-wasm-resizable-arraybuffer", + default=default_wasm_resizable_arraybuffer, + help="{Enable|Disable} resizable ArrayBuffer in WASM", +) + +set_config( + "ENABLE_WASM_RESIZABLE_ARRAYBUFFER", + depends_if("--enable-wasm-resizable-arraybuffer")(lambda x: True), +) +set_define( + "ENABLE_WASM_RESIZABLE_ARRAYBUFFER", + depends_if("--enable-wasm-resizable-arraybuffer")(lambda x: True), +) + # Wasi configuration # =================================================== diff --git a/js/public/HeapAPI.h b/js/public/HeapAPI.h index 4a3f087ac73..e712e3481ed 100644 --- a/js/public/HeapAPI.h +++ b/js/public/HeapAPI.h @@ -85,7 +85,6 @@ enum class ChunkKind : uint8_t { Invalid = 0, TenuredArenas, MediumBuffers, - LargeBuffer, NurseryToSpace, NurseryFromSpace }; @@ -138,8 +137,7 @@ class ChunkBase { } bool isTenuredChunk() const { - return kind == ChunkKind::TenuredArenas || - kind == ChunkKind::MediumBuffers || kind == ChunkKind::LargeBuffer; + return kind == ChunkKind::TenuredArenas || kind == ChunkKind::MediumBuffers; } // The store buffer for pointers from tenured things to things in this @@ -332,7 +330,6 @@ class ArenaChunkBase : public ChunkBase { ArenaChunkInfo info; ChunkMarkBitmap markBits; ChunkArenaBitmap freeCommittedArenas; - ChunkArenaBitmap pendingFreeCommittedArenas; ChunkPageBitmap decommittedPages; protected: diff --git a/js/public/friend/ErrorNumbers.msg b/js/public/friend/ErrorNumbers.msg index db9b266ee77..7c542bf699a 100644 --- a/js/public/friend/ErrorNumbers.msg +++ b/js/public/friend/ErrorNumbers.msg @@ -505,6 +505,9 @@ MSG_DEF(JSMSG_WASM_NONSHARED_WAIT, 0, JSEXN_WASMRUNTIMEERROR, "atomic wait o MSG_DEF(JSMSG_WASM_SUPPLY_ONLY_ONE, 2, JSEXN_TYPEERR, "exactly one of {0} and {1} must be supplied") MSG_DEF(JSMSG_WASM_MISSING_REQUIRED, 1, JSEXN_TYPEERR, "Missing required argument {0}") MSG_DEF(JSMSG_WASM_MODIFIED_GC_OBJECT, 0, JSEXN_TYPEERR, "can't modify WebAssembly GC objects") +MSG_DEF(JSMSG_WASM_ARRAYBUFFER_PAGE_MULTIPLE, 0, JSEXN_RANGEERR, "can only grow by WebAssembly page multiples") +MSG_DEF(JSMSG_WASM_ARRAYBUFFER_CANNOT_SHRINK, 0, JSEXN_RANGEERR, "cannot shrink WebAssembly memory") +MSG_DEF(JSMSG_WASM_MEMORY_NOT_RESIZABLE, 0, JSEXN_TYPEERR, "WebAssembly memory non-resizable, maximum length is not provided") // JSPI MSG_DEF(JSMSG_JSPI_ARG_POSITION, 0, JSEXN_TYPEERR, "Invalid argument position value") diff --git a/js/src/aclocal.m4 b/js/src/aclocal.m4 new file mode 100644 index 00000000000..4151cbd8878 --- /dev/null +++ b/js/src/aclocal.m4 @@ -0,0 +1,23 @@ +dnl +dnl Local autoconf macros used with mozilla +dnl The contents of this file are under the Public Domain. +dnl + +builtin(include, ../../build/autoconf/hooks.m4)dnl +builtin(include, ../../build/autoconf/config.status.m4)dnl +builtin(include, ../../build/autoconf/altoptions.m4)dnl + +define([__MOZ_AC_INIT_PREPARE], defn([AC_INIT_PREPARE])) +define([AC_INIT_PREPARE], +[if test -z "$srcdir"; then + srcdir=`dirname "[$]0"` +fi +srcdir="$srcdir/../.." +__MOZ_AC_INIT_PREPARE($1) +]) + +dnl This won't actually read the mozconfig, but data that configure.py +dnl will have placed for us to read. Configure.py takes care of not reading +dnl the mozconfig where appropriate but can still give us some variables +dnl to read. +MOZ_READ_MOZCONFIG(.) diff --git a/js/src/build/moz.build b/js/src/build/moz.build index 0a08b233e15..f40adc434ec 100644 --- a/js/src/build/moz.build +++ b/js/src/build/moz.build @@ -26,7 +26,7 @@ LIBRARY_DEFINES["MOZ_SUPPORT_LEAKCHECKING"] = True # JS shell would like to link to the static library. if CONFIG["JS_SHARED_LIBRARY"]: - GeckoSharedLibrary("js", linkage=None) + GeckoSharedLibrary("js") SHARED_LIBRARY_NAME = CONFIG["JS_LIBRARY_NAME"] # Ensure symbol versions of shared library on Linux do not conflict diff --git a/js/src/builtin/intl/TimeZoneDataGenerated.h b/js/src/builtin/intl/TimeZoneDataGenerated.h index f36ccc82940..3052f86e80f 100644 --- a/js/src/builtin/intl/TimeZoneDataGenerated.h +++ b/js/src/builtin/intl/TimeZoneDataGenerated.h @@ -1,5 +1,5 @@ // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b #ifndef builtin_intl_TimeZoneDataGenerated_h #define builtin_intl_TimeZoneDataGenerated_h @@ -54,7 +54,6 @@ const LinkAndTarget ianaLinksCanonicalizedDifferentlyByICU[] = { { "America/Louisville", "America/Kentucky/Louisville" }, // America/Louisville [backward] { "America/Mendoza", "America/Argentina/Mendoza" }, // America/Mendoza [backward] { "America/Rosario", "America/Argentina/Cordoba" }, // America/Cordoba [backward] - { "Antarctica/South_Pole", "Antarctica/McMurdo" }, // Pacific/Auckland [backward] { "Asia/Calcutta", "Asia/Kolkata" }, // Asia/Calcutta [backward] { "Asia/Katmandu", "Asia/Kathmandu" }, // Asia/Katmandu [backward] { "Asia/Rangoon", "Asia/Yangon" }, // Asia/Rangoon [backward] diff --git a/js/src/configure b/js/src/configure index db41b0e5b10..e2c672e40d1 100755 --- a/js/src/configure +++ b/js/src/configure @@ -6,6 +6,7 @@ SRCDIR=$(dirname $0) TOPSRCDIR="$SRCDIR"/../.. PYTHON3="${PYTHON3:-python3}" +export OLD_CONFIGURE="$SRCDIR"/old-configure set -- "$@" --enable-project=js diff --git a/js/src/devtools/rootAnalysis/mozconfig.common b/js/src/devtools/rootAnalysis/mozconfig.common index 3be4036ada8..c68fb6a26cc 100644 --- a/js/src/devtools/rootAnalysis/mozconfig.common +++ b/js/src/devtools/rootAnalysis/mozconfig.common @@ -32,6 +32,6 @@ ac_add_options --disable-replace-malloc # -Wignored-attributes is very verbose due to attributes being # ignored on template parameters. ANALYSIS_EXTRA_CFLAGS="-Wno-attributes -Wno-ignored-attributes" -export CFLAGS="$CFLAGS $ANALYSIS_EXTRA_CFLAGS" -export CPPFLAGS="$CPPFLAGS $ANALYSIS_EXTRA_CFLAGS" -export CXXFLAGS="$CXXFLAGS $ANALYSIS_EXTRA_CFLAGS" +CFLAGS="$CFLAGS $ANALYSIS_EXTRA_CFLAGS" +CPPFLAGS="$CPPFLAGS $ANALYSIS_EXTRA_CFLAGS" +CXXFLAGS="$CXXFLAGS $ANALYSIS_EXTRA_CFLAGS" diff --git a/js/src/gc/Allocator.h b/js/src/gc/Allocator.h index 6ee2907bc81..e9e2ba574fc 100644 --- a/js/src/gc/Allocator.h +++ b/js/src/gc/Allocator.h @@ -129,15 +129,17 @@ void FreeBuffer(JS::Zone* zone, void* alloc); // cell. Does not work for malloced memory. bool IsBufferAlloc(void* alloc); -bool IsNurseryOwned(void* alloc); +bool IsNurseryOwned(JS::Zone* zone, void* alloc); -size_t GetAllocSize(void* alloc); -JS::Zone* GetAllocZone(void* alloc); +size_t GetAllocSize(JS::Zone* zone, void* alloc); // Buffer allocator GC-internal API. void* AllocBufferInGC(JS::Zone* zone, size_t bytes, bool nurseryOwned); -bool IsBufferAllocMarkedBlack(void* alloc); +bool IsBufferAllocMarkedBlack(JS::Zone* zone, void* alloc); +void TraceBufferEdgeInternal(JSTracer* trc, Cell* owner, void** bufferp, + const char* name); +void MarkTenuredBuffer(JS::Zone* zone, void* alloc); } // namespace gc } // namespace js diff --git a/js/src/gc/BufferAllocator-inl.h b/js/src/gc/BufferAllocator-inl.h index b0dfbe458a3..66154ddabda 100644 --- a/js/src/gc/BufferAllocator-inl.h +++ b/js/src/gc/BufferAllocator-inl.h @@ -45,8 +45,7 @@ inline size_t BufferAllocator::GetGoodAllocSize(size_t requiredBytes) { requiredBytes = std::max(requiredBytes, MinAllocSize); if (IsLargeAllocSize(requiredBytes)) { - size_t headerSize = sizeof(LargeBuffer); - return RoundUp(requiredBytes + headerSize, ChunkSize) - headerSize; + return RoundUp(requiredBytes, ChunkSize); } // Small and medium headers have the same size. @@ -61,10 +60,8 @@ inline size_t BufferAllocator::GetGoodAllocSize(size_t requiredBytes) { size_t BufferAllocator::GetGoodPower2AllocSize(size_t requiredBytes) { requiredBytes = std::max(requiredBytes, MinAllocSize); - size_t headerSize; - if (IsLargeAllocSize(requiredBytes)) { - headerSize = sizeof(LargeBuffer); - } else { + size_t headerSize = 0; + if (!IsLargeAllocSize(requiredBytes)) { // Small and medium headers have the same size. headerSize = sizeof(SmallBuffer); static_assert(sizeof(SmallBuffer) == sizeof(MediumBuffer)); @@ -135,20 +132,26 @@ inline bool IsBufferAlloc(void* alloc) { return BufferAllocator::IsBufferAlloc(alloc); } -inline size_t GetAllocSize(void* alloc) { - return BufferAllocator::GetAllocSize(alloc); +inline size_t GetAllocSize(JS::Zone* zone, void* alloc) { + return zone->bufferAllocator.getAllocSize(alloc); } -inline JS::Zone* GetAllocZone(void* alloc) { - return BufferAllocator::GetAllocZone(alloc); +inline bool IsNurseryOwned(JS::Zone* zone, void* alloc) { + return zone->bufferAllocator.isNurseryOwned(alloc); } -inline bool IsNurseryOwned(void* alloc) { - return BufferAllocator::IsNurseryOwned(alloc); +inline bool IsBufferAllocMarkedBlack(JS::Zone* zone, void* alloc) { + return zone->bufferAllocator.isMarkedBlack(alloc); } -inline bool IsBufferAllocMarkedBlack(void* alloc) { - return BufferAllocator::IsMarkedBlack(alloc); +inline void TraceBufferEdgeInternal(JSTracer* trc, Cell* owner, void** bufferp, + const char* name) { + owner->zoneFromAnyThread()->bufferAllocator.traceEdge(trc, owner, bufferp, + name); +} + +inline void MarkTenuredBuffer(JS::Zone* zone, void* alloc) { + zone->bufferAllocator.markTenuredAlloc(alloc); } } // namespace js::gc diff --git a/js/src/gc/BufferAllocator.cpp b/js/src/gc/BufferAllocator.cpp index 20bed613889..107beaabe7c 100644 --- a/js/src/gc/BufferAllocator.cpp +++ b/js/src/gc/BufferAllocator.cpp @@ -21,12 +21,43 @@ #include "util/Poison.h" #include "gc/Heap-inl.h" +#include "gc/Marking-inl.h" using namespace js; using namespace js::gc; namespace js::gc { +struct alignas(CellAlignBytes) LargeBuffer + : public SlimLinkedListElement { + void* alloc; + size_t bytes; + bool isNurseryOwned; + bool allocatedDuringCollection = false; + +#ifdef DEBUG + uint32_t checkValue = LargeBufferCheckValue; +#endif + + LargeBuffer(void* ptr, size_t bytes, bool nurseryOwned) + : alloc(ptr), bytes(bytes), isNurseryOwned(nurseryOwned) { + MOZ_ASSERT((bytes % ChunkSize) == 0); + } + + inline void check() const; + + inline Cell* headerCell(); + +#ifdef DEBUG + inline Zone* zone(); + inline Zone* zoneFromAnyThread(); +#endif + + void* data() { return alloc; } + size_t allocBytes() const { return bytes; } + bool isPointerWithinAllocation(void* ptr) const; +}; + bool SmallBuffer::isNurseryOwned() const { return header_.get() & NURSERY_OWNED_BIT; } @@ -35,6 +66,10 @@ void SmallBuffer::setNurseryOwned(bool value) { header_.set(value ? NURSERY_OWNED_BIT : 0); } +size_t SmallBuffer::allocBytes() const { + return arena()->getThingSize() - sizeof(SmallBuffer); +} + inline MediumBuffer::MediumBuffer(uint8_t sizeClass, bool nurseryOwned) : sizeClass(sizeClass), isNurseryOwned(nurseryOwned) {} @@ -55,32 +90,16 @@ inline size_t MediumBuffer::bytesIncludingHeader() const { return BufferAllocator::SizeClassBytes(sizeClass); } -inline void* MediumBuffer::data() { return this + 1; } - -inline LargeBuffer::LargeBuffer(Zone* zone, size_t bytes, bool nurseryOwned) - : ChunkBase(zone->runtimeFromMainThread()), - zone(zone), - bytesIncludingHeader(bytes), - isNurseryOwned(nurseryOwned) { - kind = ChunkKind::LargeBuffer; - MOZ_ASSERT((bytes % PageSize) == 0); +inline size_t MediumBuffer::allocBytes() const { + return bytesIncludingHeader() - sizeof(MediumBuffer); } +inline void* MediumBuffer::data() { return this + 1; } + inline void LargeBuffer::check() const { MOZ_ASSERT(checkValue == LargeBufferCheckValue); } -inline bool LargeBuffer::markAtomic() { - do { - if (marked) { - return false; - } - } while (!marked.compareExchange(false, true)); - return true; -} - -inline void* LargeBuffer::data() { return this + 1; } - BufferAllocator::AutoLock::AutoLock(GCRuntime* gc) : LockGuard(gc->bufferAllocatorLock) {} @@ -139,12 +158,15 @@ struct BufferChunk : public ChunkBase, MainThreadOrGCTaskData decommittedPages; MainThreadOrGCTaskData allocBitmap; - MainThreadData zone; // Only used by GetAllocZone. MainThreadOrGCTaskData allocatedDuringCollection; MainThreadData hasNurseryOwnedAllocs; MainThreadOrGCTaskData hasNurseryOwnedAllocsAfterSweep; +#ifdef DEBUG + MainThreadData zone; +#endif + static BufferChunk* from(void* alloc) { ChunkBase* chunk = js::gc::detail::GetGCAddressChunkBase(alloc); MOZ_ASSERT(chunk->kind == ChunkKind::MediumBuffers); @@ -152,8 +174,11 @@ struct BufferChunk : public ChunkBase, } explicit BufferChunk(Zone* zone) - : ChunkBase(zone->runtimeFromMainThread(), ChunkKind::MediumBuffers), - zone(zone) {} + : ChunkBase(zone->runtimeFromMainThread(), ChunkKind::MediumBuffers) { +#ifdef DEBUG + this->zone = zone; +#endif + } ~BufferChunk() { MOZ_ASSERT(allocBitmap.ref().IsEmpty()); } @@ -414,7 +439,8 @@ BufferAllocator::BufferAllocator(Zone* zone) sweptLargeTenuredAllocs(lock()), minorState(State::NotCollecting), majorState(State::NotCollecting), - minorSweepingFinished(lock()) {} + minorSweepingFinished(lock()), + majorSweepingFinished(lock()) {} BufferAllocator::~BufferAllocator() { #ifdef DEBUG @@ -485,6 +511,29 @@ void* BufferAllocator::allocInGC(size_t bytes, bool nurseryOwned) { return result; } +template +static HeaderT* GetHeaderFromAlloc(void* alloc) { + static_assert(std::is_same_v || + std::is_same_v); + auto* header = reinterpret_cast(uintptr_t(alloc) - sizeof(HeaderT)); + header->check(); + return header; +} + +inline Cell* LargeBuffer::headerCell() { + return GetHeaderFromAlloc(this); +} + +#ifdef DEBUG + +inline Zone* LargeBuffer::zone() { return headerCell()->zone(); } + +inline Zone* LargeBuffer::zoneFromAnyThread() { + return headerCell()->zoneFromAnyThread(); +} + +#endif + #ifdef XP_DARWIN static inline void VirtualCopyPages(void* dst, const void* src, size_t bytes) { MOZ_ASSERT((uintptr_t(dst) & PageMask) == 0); @@ -508,35 +557,45 @@ void* BufferAllocator::realloc(void* ptr, size_t bytes, bool nurseryOwned) { return alloc(bytes, nurseryOwned); } - MOZ_ASSERT(GetAllocZone(ptr) == zone); - MOZ_ASSERT(IsNurseryOwned(ptr) == nurseryOwned); + MOZ_ASSERT(isNurseryOwned(ptr) == nurseryOwned); MOZ_ASSERT_IF(zone->isGCMarkingOrSweeping(), majorState == State::Marking); - size_t currentBytes = GetAllocSize(ptr); bytes = GetGoodAllocSize(bytes); - if (bytes == currentBytes) { - return ptr; - } - if (bytes > currentBytes) { - // Can only grow medium allocations. - if (IsMediumAlloc(ptr) && !IsLargeAllocSize(bytes)) { - if (growMedium(ptr, bytes)) { + size_t currentBytes; + if (IsLargeAlloc(ptr)) { + LargeBuffer* header = lookupLargeBuffer(ptr); + currentBytes = header->allocBytes(); + + // We can shrink large allocations (on some platforms). + if (bytes < header->allocBytes() && IsLargeAllocSize(bytes)) { + if (shrinkLarge(header, bytes)) { + return ptr; + } + } + } else if (IsMediumAlloc(ptr)) { + auto* header = GetHeaderFromAlloc(ptr); + currentBytes = header->allocBytes(); + + // We can grow or shrink medium allocations. + if (bytes < header->allocBytes() && !IsSmallAllocSize(bytes)) { + if (shrinkMedium(header, bytes)) { + return ptr; + } + } + + if (bytes > header->allocBytes() && !IsLargeAllocSize(bytes)) { + if (growMedium(header, bytes)) { return ptr; } } } else { - // Can shrink medium or large allocations. - if (IsMediumAlloc(ptr) && !IsSmallAllocSize(bytes)) { - if (shrinkMedium(ptr, bytes)) { - return ptr; - } - } - if (IsLargeAlloc(ptr) && IsLargeAllocSize(bytes)) { - if (shrinkLarge(ptr, bytes)) { - return ptr; - } - } + auto* header = GetHeaderFromAlloc(ptr); + currentBytes = header->allocBytes(); + } + + if (bytes == currentBytes) { + return ptr; } void* newPtr = alloc(bytes, nurseryOwned); @@ -550,13 +609,9 @@ void* BufferAllocator::realloc(void* ptr, size_t bytes, bool nurseryOwned) { #ifdef XP_DARWIN if (bytesToCopy >= ChunkSize) { - MOZ_ASSERT((uintptr_t(ptr) & PageMask) == (uintptr_t(newPtr) & PageMask)); - size_t alignBytes = PageSize - (uintptr_t(ptr) & PageMask); - memcpy(newPtr, ptr, alignBytes); - void* dst = reinterpret_cast(uintptr_t(newPtr) + alignBytes); - void* src = reinterpret_cast(uintptr_t(ptr) + alignBytes); - bytesToCopy -= alignBytes; - VirtualCopyPages(dst, src, bytesToCopy); + MOZ_ASSERT(IsLargeAlloc(ptr)); + MOZ_ASSERT(IsLargeAlloc(newPtr)); + VirtualCopyPages(newPtr, ptr, bytesToCopy); return newPtr; } #endif @@ -565,19 +620,8 @@ void* BufferAllocator::realloc(void* ptr, size_t bytes, bool nurseryOwned) { return newPtr; } -template -static HeaderT* GetHeaderFromAlloc(void* alloc) { - auto* header = reinterpret_cast(uintptr_t(alloc) - sizeof(HeaderT)); - header->check(); - return header; -} - void BufferAllocator::free(void* ptr) { MOZ_ASSERT(ptr); - MOZ_ASSERT(GetAllocZone(ptr) == zone); - - DebugOnlyPoison(ptr, JS_FREED_BUFFER_PATTERN, GetAllocSize(ptr), - MemCheckKind::MakeUndefined); if (IsLargeAlloc(ptr)) { freeLarge(ptr); @@ -597,9 +641,12 @@ bool BufferAllocator::IsBufferAlloc(void* alloc) { // Precondition: |alloc| is a pointer to a buffer allocation, a GC thing or a // direct nursery allocation returned by Nursery::allocateBuffer. + if (IsLargeAlloc(alloc)) { + return true; + } + ChunkKind chunkKind = detail::GetGCAddressChunkBase(alloc)->getKind(); - if (chunkKind == ChunkKind::MediumBuffers || - chunkKind == ChunkKind::LargeBuffer) { + if (chunkKind == ChunkKind::MediumBuffers) { return true; } @@ -611,42 +658,25 @@ bool BufferAllocator::IsBufferAlloc(void* alloc) { return false; } -/* static */ -size_t BufferAllocator::GetAllocSize(void* alloc) { +size_t BufferAllocator::getAllocSize(void* alloc) { if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); - return header->bytesIncludingHeader - sizeof(LargeBuffer); + LargeBuffer* header = lookupLargeBuffer(alloc); + return header->allocBytes(); } if (IsSmallAlloc(alloc)) { auto* cell = GetHeaderFromAlloc(alloc); - return cell->arena()->getThingSize() - sizeof(SmallBuffer); + return cell->allocBytes(); } MOZ_ASSERT(IsMediumAlloc(alloc)); auto* header = GetHeaderFromAlloc(alloc); - return SizeClassBytes(header->sizeClass) - sizeof(MediumBuffer); + return header->allocBytes(); } -/* static */ -JS::Zone* BufferAllocator::GetAllocZone(void* alloc) { +bool BufferAllocator::isNurseryOwned(void* alloc) { if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); - return header->zone; - } - - if (IsSmallAlloc(alloc)) { - auto* cell = GetHeaderFromAlloc(alloc); - return cell->zone(); - } - - return BufferChunk::from(alloc)->zone; -} - -/* static */ -bool BufferAllocator::IsNurseryOwned(void* alloc) { - if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); + LargeBuffer* header = lookupLargeBuffer(alloc); return header->isNurseryOwned; } @@ -662,55 +692,75 @@ bool BufferAllocator::IsNurseryOwned(void* alloc) { void BufferAllocator::markNurseryOwnedAlloc(void* alloc, bool ownerWasTenured) { MOZ_ASSERT(alloc); - MOZ_ASSERT(IsNurseryOwned(alloc)); - MOZ_ASSERT(GetAllocZone(alloc) == zone); + MOZ_ASSERT(isNurseryOwned(alloc)); MOZ_ASSERT(minorState == State::Marking); - if (IsSmallAlloc(alloc)) { - // This path is currently unused outside test code because we allocate - // nursery buffers directly in the nursery rather than using this allocator. - auto* cell = GetHeaderFromAlloc(alloc); - if (ownerWasTenured) { - cell->setNurseryOwned(false); - } - // Heap size tracked as part of GC heap for small allocations. - return; - } - if (IsLargeAlloc(alloc)) { - auto* header = GetHeaderFromAlloc(alloc); - largeNurseryAllocs.ref().remove(header); - if (ownerWasTenured) { - header->isNurseryOwned = false; - header->allocatedDuringCollection = majorState != State::NotCollecting; - largeTenuredAllocs.ref().pushBack(header); - size_t usableSize = header->bytesIncludingHeader - sizeof(LargeBuffer); - updateHeapSize(usableSize, false, false); - } else { - sweptLargeNurseryAllocs.ref().pushBack(header); - } + LargeBuffer* buffer = lookupLargeBuffer(alloc); + MOZ_ASSERT(buffer->zone() == zone); + markLargeNurseryOwnedBuffer(buffer, ownerWasTenured); return; } - MOZ_ASSERT(IsMediumAlloc(alloc)); - auto* header = GetHeaderFromAlloc(alloc); - MOZ_ASSERT(BufferChunk::from(alloc)->hasNurseryOwnedAllocs); - if (ownerWasTenured) { - header->isNurseryOwned = false; - size_t usableSize = - SizeClassBytes(header->sizeClass) - sizeof(MediumBuffer); - updateHeapSize(usableSize, false, false); - } else { - BufferChunk* chunk = BufferChunk::from(alloc); - MOZ_ASSERT(chunk->isAllocated(alloc)); - chunk->markBits.ref().markIfUnmarked(alloc, MarkColor::Black); + if (IsSmallAlloc(alloc)) { + auto* buffer = GetHeaderFromAlloc(alloc); + markSmallNurseryOwnedBuffer(buffer, ownerWasTenured); + return; } + + auto* buffer = GetHeaderFromAlloc(alloc); + markMediumNurseryOwnedBuffer(buffer, ownerWasTenured); } -/* static */ -bool BufferAllocator::IsMarkedBlack(void* alloc) { +void BufferAllocator::markSmallNurseryOwnedBuffer(SmallBuffer* buffer, + bool ownerWasTenured) { + MOZ_ASSERT(buffer->zone() == zone); + + if (ownerWasTenured) { + buffer->setNurseryOwned(false); + } + + // Heap size is tracked as part of GC heap for small allocations. +} + +void BufferAllocator::markMediumNurseryOwnedBuffer(MediumBuffer* buffer, + bool ownerWasTenured) { + BufferChunk* chunk = BufferChunk::from(buffer); + MOZ_ASSERT(chunk->zone == zone); + MOZ_ASSERT(chunk->hasNurseryOwnedAllocs); + MOZ_ASSERT(chunk->isAllocated(buffer->data())); + + if (ownerWasTenured) { + // Change the allocation to a tenured owned one. This prevents sweeping in a + // minor collection. + buffer->isNurseryOwned = false; + size_t usableSize = buffer->allocBytes(); + updateHeapSize(usableSize, false, false); + return; + } + + chunk->markBits.ref().markIfUnmarked(buffer->data(), MarkColor::Black); +} + +void BufferAllocator::markLargeNurseryOwnedBuffer(LargeBuffer* buffer, + bool ownerWasTenured) { + largeNurseryAllocsToSweep.ref().remove(buffer); + + if (ownerWasTenured) { + buffer->isNurseryOwned = false; + buffer->allocatedDuringCollection = majorState != State::NotCollecting; + largeTenuredAllocs.ref().pushBack(buffer); + size_t usableSize = buffer->allocBytes(); + updateHeapSize(usableSize, false, false); + return; + } + + largeNurseryAllocs.ref().pushBack(buffer); +} + +bool BufferAllocator::isMarkedBlack(void* alloc) { if (IsLargeAlloc(alloc)) { - return IsLargeAllocMarked(alloc); + return isLargeAllocMarked(alloc); } if (IsSmallAlloc(alloc)) { @@ -725,8 +775,7 @@ bool BufferAllocator::IsMarkedBlack(void* alloc) { return chunk->markBits.ref().isMarkedBlack(alloc); } -/* static */ -void BufferAllocator::TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, +void BufferAllocator::traceEdge(JSTracer* trc, Cell* owner, void** bufferp, const char* name) { // Buffers are conceptually part of the owning cell and are not reported to // the tracer. @@ -739,7 +788,8 @@ void BufferAllocator::TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, void* buffer = *bufferp; MOZ_ASSERT(buffer); - if (js::gc::detail::GetGCAddressChunkBase(buffer)->isNurseryChunk()) { + if (!IsLargeAlloc(buffer) && + js::gc::detail::GetGCAddressChunkBase(buffer)->isNurseryChunk()) { // JSObject slots and elements can be allocated in the nursery and this is // handled separately. return; @@ -747,46 +797,95 @@ void BufferAllocator::TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, MOZ_ASSERT(IsBufferAlloc(buffer)); - if (IsSmallAlloc(buffer)) { - auto* cell = GetHeaderFromAlloc(buffer); - TraceManuallyBarrieredEdge(trc, &cell, name); - if (cell != GetHeaderFromAlloc(buffer)) { - *bufferp = cell->data(); - } + if (IsLargeAlloc(buffer)) { + traceLargeAlloc(trc, owner, bufferp, name); return; } + if (IsSmallAlloc(buffer)) { + traceSmallAlloc(trc, owner, bufferp, name); + return; + } + + traceMediumAlloc(trc, owner, bufferp, name); +} + +void BufferAllocator::traceSmallAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name) { + void* alloc = *allocp; + auto* cell = GetHeaderFromAlloc(alloc); + TraceManuallyBarrieredEdge(trc, &cell, name); + if (cell != GetHeaderFromAlloc(alloc)) { + *allocp = cell->data(); + } +} + +void BufferAllocator::traceMediumAlloc(JSTracer* trc, Cell* owner, + void** allocp, const char* name) { + void* alloc = *allocp; + auto* buffer = GetHeaderFromAlloc(alloc); + if (trc->isTenuringTracer()) { - if (IsNurseryOwned(buffer)) { - Zone* zone = owner->zone(); - zone->bufferAllocator.markNurseryOwnedAlloc(buffer, owner->isTenured()); + if (buffer->isNurseryOwned) { + markMediumNurseryOwnedBuffer(buffer, owner->isTenured()); } return; } if (trc->isMarkingTracer()) { - if (!IsNurseryOwned(buffer)) { - MOZ_ASSERT(!ChunkPtrIsInsideNursery(buffer)); - MarkTenuredAlloc(buffer); + if (!buffer->isNurseryOwned) { + markMediumTenuredAlloc(alloc); } return; } } -/* static */ -bool BufferAllocator::MarkTenuredAlloc(void* alloc) { +void BufferAllocator::traceLargeAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name) { + void* alloc = *allocp; + LargeBuffer* buffer = lookupLargeBuffer(alloc); + + // Trace small buffer that holds large buffer metadata. + // For moving GC the table is updated in fixupAfterMovingGC(). + traceSmallAlloc(trc, owner, reinterpret_cast(&buffer), "LargeBuffer"); + + if (trc->isTenuringTracer()) { + if (isNurseryOwned(alloc)) { + markLargeNurseryOwnedBuffer(buffer, owner->isTenured()); + } + return; + } + + if (trc->isMarkingTracer()) { + if (!isNurseryOwned(alloc)) { + markLargeTenuredBuffer(buffer); + } + return; + } +} + +bool BufferAllocator::markTenuredAlloc(void* alloc) { MOZ_ASSERT(alloc); - MOZ_ASSERT(!IsNurseryOwned(alloc)); + MOZ_ASSERT(!isNurseryOwned(alloc)); if (IsLargeAlloc(alloc)) { - return MarkLargeAlloc(alloc); + LargeBuffer* buffer = lookupLargeBuffer(alloc); + return markLargeTenuredBuffer(buffer); } if (IsSmallAlloc(alloc)) { - auto* cell = GetHeaderFromAlloc(alloc); - return cell->markIfUnmarkedAtomic(MarkColor::Black); + return markSmallTenuredAlloc(alloc); } + return markMediumTenuredAlloc(alloc); +} + +bool BufferAllocator::markSmallTenuredAlloc(void* alloc) { + auto* cell = GetHeaderFromAlloc(alloc); + return cell->markIfUnmarkedAtomic(MarkColor::Black); +} + +bool BufferAllocator::markMediumTenuredAlloc(void* alloc) { BufferChunk* chunk = BufferChunk::from(alloc); MOZ_ASSERT(chunk->isAllocated(alloc)); if (chunk->allocatedDuringCollection) { @@ -804,17 +903,18 @@ void BufferAllocator::startMinorCollection(MaybeLock& lock) { MOZ_ASSERT(minorState == State::NotCollecting); if (majorState == State::NotCollecting) { checkGCStateNotInUse(lock); - } else { - // Large allocations that are marked when tracing the nursery will be moved - // to this list. - MOZ_ASSERT(sweptLargeNurseryAllocs.ref().isEmpty()); } #endif + // Large allocations that are marked when tracing the nursery will be moved + // back to the main list. + MOZ_ASSERT(largeNurseryAllocsToSweep.ref().isEmpty()); + std::swap(largeNurseryAllocs.ref(), largeNurseryAllocsToSweep.ref()); + minorState = State::Marking; } -bool BufferAllocator::startMinorSweeping(LargeAllocList& largeAllocsToFree) { +bool BufferAllocator::startMinorSweeping() { // Called during minor GC. Operates on the active allocs/chunks lists. The 'to // sweep' lists do not contain nursery owned allocations. @@ -827,24 +927,16 @@ bool BufferAllocator::startMinorSweeping(LargeAllocList& largeAllocsToFree) { } for (LargeBuffer* header : largeNurseryAllocs.ref()) { MOZ_ASSERT(header->isNurseryOwned); - MOZ_ASSERT(!header->marked); } - for (LargeBuffer* header : sweptLargeNurseryAllocs.ref()) { + for (LargeBuffer* header : largeNurseryAllocsToSweep.ref()) { MOZ_ASSERT(header->isNurseryOwned); - MOZ_ASSERT(!header->marked); } #endif - // Large nursery allocations are moved out of |largeNurseryAllocs| when they - // are marked, so any remaining are ready to be freed. Move them to the output - // list. - largeAllocsToFree.append(std::move(largeNurseryAllocs.ref())); - MOZ_ASSERT(largeNurseryAllocs.ref().isEmpty()); - largeNurseryAllocs.ref() = std::move(sweptLargeNurseryAllocs.ref()); - // Check whether there are any medium chunks containing nursery owned // allocations that need to be swept. - if (mediumMixedChunks.ref().isEmpty()) { + if (mediumMixedChunks.ref().isEmpty() && + largeNurseryAllocsToSweep.ref().isEmpty()) { // Nothing more to do. Don't transition to sweeping state. minorState = State::NotCollecting; return false; @@ -900,20 +992,24 @@ void BufferAllocator::sweepForMinorCollection() { } } + // Bug 1961749: Freeing large buffers can be slow so it might be worth + // splitting sweeping into two phases so that all zones get their medium + // buffers swept and made available for allocation before any large buffers + // are freed. + // Alternatively this could happen in parallel to sweeping medium buffers. + + while (!largeNurseryAllocsToSweep.ref().isEmpty()) { + LargeBuffer* header = largeNurseryAllocsToSweep.ref().popFirst(); + MaybeLock lock(std::in_place, this); + unmapLarge(header, true, lock); + } + // Signal to main thread to update minorState. AutoLock lock(this); MOZ_ASSERT(!minorSweepingFinished); minorSweepingFinished = true; } -/* static */ -void BufferAllocator::FreeLargeAllocs(LargeAllocList& largeAllocsToFree) { - while (!largeAllocsToFree.isEmpty()) { - LargeBuffer* header = largeAllocsToFree.popFirst(); - header->zone->bufferAllocator.unmapLarge(header, true); - } -} - void BufferAllocator::startMajorCollection(MaybeLock& lock) { maybeMergeSweptData(lock); @@ -955,6 +1051,7 @@ void BufferAllocator::startMajorSweeping(MaybeLock& lock) { #ifdef DEBUG MOZ_ASSERT(majorState == State::Marking); MOZ_ASSERT(zone->isGCFinished()); + MOZ_ASSERT(!majorSweepingFinished.refNoCheck()); #endif maybeMergeSweptData(lock); @@ -1000,6 +1097,10 @@ void BufferAllocator::sweepForMajorCollection(bool shouldDecommit) { // there's currently no advantage to that. AutoLock lock(this); sweptLargeTenuredAllocs.ref() = std::move(sweptList); + + // Signal to main thread to update majorState. + MOZ_ASSERT(!majorSweepingFinished); + majorSweepingFinished = true; } static void ClearAllocatedDuringCollection(SlimLinkedList& list) { @@ -1014,58 +1115,66 @@ static void ClearAllocatedDuringCollection(SlimLinkedList& list) { } void BufferAllocator::finishMajorCollection(const AutoLock& lock) { - // This can be called without startMajorSweeping if collection is aborted. - MOZ_ASSERT(majorState == State::Marking || majorState == State::Sweeping); + // This can be called in any state: + // + // - NotCollecting: after major sweeping has finished and the state has been + // reset to NotCollecting in mergeSweptData. + // + // - Marking: if collection was aborted and startMajorSweeping was not + // called. + // + // - Sweeping: if sweeping has finished and mergeSweptData has not been + // called yet. - ClearAllocatedDuringCollection(mediumMixedChunks.ref()); - ClearAllocatedDuringCollection(mediumTenuredChunks.ref()); - // This flag is not set for large nursery-owned allocations. - ClearAllocatedDuringCollection(largeTenuredAllocs.ref()); - - if (minorState == State::Sweeping) { - // Ensure this flag is cleared when chunks are merged in mergeSweptData. - majorFinishedWhileMinorSweeping = true; - } + MOZ_ASSERT_IF(majorState == State::Sweeping, majorSweepingFinished); if (minorState == State::Sweeping || majorState == State::Sweeping) { mergeSweptData(lock); } - MOZ_ASSERT_IF(majorState == State::Marking, - sweptMediumTenuredChunks.ref().isEmpty()); - MOZ_ASSERT_IF(majorState == State::Sweeping, - mediumTenuredChunksToSweep.ref().isEmpty()); - if (majorState == State::Marking) { - // We have aborted collection without sweeping this zone. Restore or rebuild - // the original state. - - for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { - chunk->markBits.ref().clear(); - } - for (LargeBuffer* alloc : largeTenuredAllocsToSweep.ref()) { - alloc->marked = false; - } - - // Rebuild free lists for chunks we didn't end up sweeping. - for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { - MOZ_ALWAYS_TRUE( - sweepChunk(chunk, OwnerKind::None, false, mediumFreeLists.ref())); - } - - mediumTenuredChunks.ref().prepend( - std::move(mediumTenuredChunksToSweep.ref())); - largeTenuredAllocs.ref().prepend( - std::move(largeTenuredAllocsToSweep.ref())); + abortMajorSweeping(lock); } - majorState = State::NotCollecting; - #ifdef DEBUG checkGCStateNotInUse(lock); #endif } +void BufferAllocator::abortMajorSweeping(const AutoLock& lock) { + // We have aborted collection without sweeping this zone. Restore or rebuild + // the original state. + + MOZ_ASSERT(majorState == State::Marking); + MOZ_ASSERT(sweptMediumTenuredChunks.ref().isEmpty()); + + clearAllocatedDuringCollectionState(lock); + + for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { + chunk->markBits.ref().clear(); + } + + // Rebuild free lists for chunks we didn't end up sweeping. + for (BufferChunk* chunk : mediumTenuredChunksToSweep.ref()) { + MOZ_ALWAYS_TRUE( + sweepChunk(chunk, OwnerKind::None, false, mediumFreeLists.ref())); + } + + mediumTenuredChunks.ref().prepend( + std::move(mediumTenuredChunksToSweep.ref())); + largeTenuredAllocs.ref().prepend(std::move(largeTenuredAllocsToSweep.ref())); + + majorState = State::NotCollecting; +} + +void BufferAllocator::clearAllocatedDuringCollectionState( + const AutoLock& lock) { + ClearAllocatedDuringCollection(mediumMixedChunks.ref()); + ClearAllocatedDuringCollection(mediumTenuredChunks.ref()); + // This flag is not set for large nursery-owned allocations. + ClearAllocatedDuringCollection(largeTenuredAllocs.ref()); +} + void BufferAllocator::maybeMergeSweptData() { if (minorState == State::Sweeping || majorState == State::Sweeping) { mergeSweptData(); @@ -1089,6 +1198,14 @@ void BufferAllocator::maybeMergeSweptData(MaybeLock& lock) { void BufferAllocator::mergeSweptData(const AutoLock& lock) { MOZ_ASSERT(minorState == State::Sweeping || majorState == State::Sweeping); + if (majorSweepingFinished) { + clearAllocatedDuringCollectionState(lock); + + if (minorState == State::Sweeping) { + majorFinishedWhileMinorSweeping = true; + } + } + // Merge swept chunks that previously contained nursery owned allocations. If // semispace nursery collection is in use then these chunks may contain both // nursery and tenured-owned allocations, otherwise all allocations will be @@ -1151,6 +1268,68 @@ void BufferAllocator::mergeSweptData(const AutoLock& lock) { } #endif } + + if (majorSweepingFinished) { + MOZ_ASSERT(majorState == State::Sweeping); + majorState = State::NotCollecting; + majorSweepingFinished = false; + + MOZ_ASSERT(mediumTenuredChunksToSweep.ref().isEmpty()); + } +} + +void BufferAllocator::prepareForMovingGC() { + maybeMergeSweptData(); + + MOZ_ASSERT(majorState == State::NotCollecting); + MOZ_ASSERT(minorState == State::NotCollecting); + MOZ_ASSERT(largeNurseryAllocsToSweep.ref().isEmpty()); + MOZ_ASSERT(largeTenuredAllocsToSweep.ref().isEmpty()); + +#ifdef DEBUG + MOZ_ASSERT(!movingGCInProgress); + movingGCInProgress = true; +#endif + + // Remove large buffer metadata objects from their linked lists so we can move + // them without breaking the links. + for (auto i = largeAllocMap.ref().iter(); !i.done(); i.next()) { + LargeBuffer* buffer = i.get().value(); + if (buffer->isNurseryOwned) { + largeNurseryAllocs.ref().remove(buffer); + } else { + largeTenuredAllocs.ref().remove(buffer); + } + } + + MOZ_ASSERT(largeNurseryAllocs.ref().isEmpty()); + MOZ_ASSERT(largeTenuredAllocs.ref().isEmpty()); +} + +void BufferAllocator::fixupAfterMovingGC() { +#ifdef DEBUG + MOZ_ASSERT(movingGCInProgress); + movingGCInProgress = false; +#endif + + // Update our pointers to large allocation metadata objects and return them to + // their lists. + for (auto i = largeAllocMap.ref().iter(); !i.done(); i.next()) { + LargeBuffer* buffer = i.get().value(); + auto* header = GetHeaderFromAlloc(buffer); + if (IsForwarded(header)) { + header = Forwarded(header); + buffer = static_cast(header->data()); + i.get().value() = buffer; + } + + MOZ_ASSERT(!buffer->isInList()); + if (buffer->isNurseryOwned) { + largeNurseryAllocs.ref().pushBack(buffer); + } else { + largeTenuredAllocs.ref().pushBack(buffer); + } + } } void BufferAllocator::clearMarkStateAfterBarrierVerification() { @@ -1165,11 +1344,6 @@ void BufferAllocator::clearMarkStateAfterBarrierVerification() { chunk->markBits.ref().clear(); } } - for (auto* allocs : {&largeNurseryAllocs.ref(), &largeTenuredAllocs.ref()}) { - for (auto* alloc : *allocs) { - alloc->marked = false; - } - } } bool BufferAllocator::isPointerWithinMediumOrLargeBuffer(void* ptr) { @@ -1224,7 +1398,7 @@ bool BufferChunk::isPointerWithinAllocation(void* ptr) const { } bool LargeBuffer::isPointerWithinAllocation(void* ptr) const { - return uintptr_t(ptr) - uintptr_t(this) < bytesIncludingHeader; + return uintptr_t(ptr) - uintptr_t(alloc) < bytes; } #ifdef DEBUG @@ -1257,6 +1431,7 @@ void BufferAllocator::checkGCStateNotInUse(const AutoLock& lock) { checkChunkListGCStateNotInUse(sweptMediumTenuredChunks.ref(), false, false); } else { MOZ_ASSERT(mediumMixedChunksToSweep.ref().isEmpty()); + MOZ_ASSERT(largeNurseryAllocsToSweep.ref().isEmpty()); MOZ_ASSERT(sweptMediumMixedChunks.ref().isEmpty()); MOZ_ASSERT(sweptMediumTenuredChunks.ref().isEmpty()); @@ -1267,6 +1442,7 @@ void BufferAllocator::checkGCStateNotInUse(const AutoLock& lock) { MOZ_ASSERT(!majorFinishedWhileMinorSweeping); MOZ_ASSERT(!sweptChunksAvailable); MOZ_ASSERT(!minorSweepingFinished); + MOZ_ASSERT(!majorSweepingFinished); } MOZ_ASSERT(mediumTenuredChunksToSweep.ref().isEmpty()); @@ -1275,9 +1451,9 @@ void BufferAllocator::checkGCStateNotInUse(const AutoLock& lock) { checkAllocListGCStateNotInUse(largeTenuredAllocs.ref(), false); MOZ_ASSERT(largeTenuredAllocsToSweep.ref().isEmpty()); - - MOZ_ASSERT(sweptLargeNurseryAllocs.ref().isEmpty()); MOZ_ASSERT(sweptLargeTenuredAllocs.ref().isEmpty()); + + MOZ_ASSERT(!movingGCInProgress); } void BufferAllocator::checkChunkListGCStateNotInUse( @@ -1351,7 +1527,6 @@ void BufferAllocator::checkAllocListGCStateNotInUse(LargeAllocList& list, bool isNurseryOwned) { for (LargeBuffer* header : list) { MOZ_ASSERT(header->isNurseryOwned == isNurseryOwned); - MOZ_ASSERT(!header->marked); MOZ_ASSERT_IF(!isNurseryOwned, !header->allocatedDuringCollection); } } @@ -1372,8 +1547,8 @@ void* BufferAllocator::allocSmall(size_t bytes, bool nurseryOwned) { void* alloc = cell->data(); MOZ_ASSERT(IsSmallAlloc(alloc)); - MOZ_ASSERT(GetAllocSize(alloc) >= bytes); - MOZ_ASSERT(GetAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); + MOZ_ASSERT(getAllocSize(alloc) >= bytes); + MOZ_ASSERT(getAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); return alloc; } @@ -1391,8 +1566,8 @@ void* BufferAllocator::allocSmallInGC(size_t bytes, bool nurseryOwned) { cell->setNurseryOwned(nurseryOwned); void* alloc = cell->data(); - MOZ_ASSERT(GetAllocSize(alloc) >= bytes); - MOZ_ASSERT(GetAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); + MOZ_ASSERT(getAllocSize(alloc) >= bytes); + MOZ_ASSERT(getAllocSize(alloc) < 2 * (bytes + sizeof(SmallBuffer))); return alloc; } @@ -1422,6 +1597,10 @@ AllocKind BufferAllocator::AllocKindForSmallAlloc(size_t bytes) { bool BufferAllocator::IsSmallAlloc(void* alloc) { MOZ_ASSERT(IsBufferAlloc(alloc)); + // Test for large buffers before calling this so we can assume |alloc| is + // inside a chunk. + MOZ_ASSERT(!IsLargeAlloc(alloc)); + ChunkBase* chunk = detail::GetGCAddressChunkBase(alloc); return chunk->getKind() == ChunkKind::TenuredArenas; } @@ -1666,8 +1845,7 @@ bool BufferAllocator::sweepChunk(BufferChunk* chunk, OwnerKind ownerKindToSweep, // Dead. Update allocated bitmap and heap size accounting. chunk->setAllocated(header, false); if (!header->isNurseryOwned) { - size_t usableBytes = bytes - sizeof(MediumBuffer); - mallocHeapBytesFreed += usableBytes; + mallocHeapBytesFreed += header->allocBytes(); } PoisonAlloc(header, JS_SWEPT_TENURED_PATTERN, bytes, MemCheckKind::MakeUndefined); @@ -1773,13 +1951,17 @@ void BufferAllocator::freeMedium(void* alloc) { // neighboring free regions. Coalescing is necessary for resize to work // properly. + auto* header = GetHeaderFromAlloc(alloc); + DebugOnlyPoison(alloc, JS_FREED_BUFFER_PATTERN, header->allocBytes(), + MemCheckKind::MakeUndefined); + BufferChunk* chunk = BufferChunk::from(alloc); + MOZ_ASSERT(chunk->zone == zone); + if (isSweepingChunk(chunk)) { return; // We can't free if the chunk is currently being swept. } - auto* header = GetHeaderFromAlloc(alloc); - // Set region as not allocated and then clear mark bit. chunk->setAllocated(alloc, false); @@ -1793,11 +1975,11 @@ void BufferAllocator::freeMedium(void* alloc) { if (!header->isNurseryOwned) { bool updateRetained = majorState == State::Marking && !chunk->allocatedDuringCollection; - size_t usableBytes = bytes - sizeof(MediumBuffer); - zone->mallocHeapSize.removeBytes(usableBytes, updateRetained); + zone->mallocHeapSize.removeBytes(bytes - sizeof(MediumBuffer), + updateRetained); } - PoisonAlloc(header, JS_SWEPT_TENURED_PATTERN, bytes, + PoisonAlloc(header, JS_FREED_BUFFER_PATTERN, sizeof(MediumBuffer), MemCheckKind::MakeUndefined); FreeLists* freeLists = getChunkFreeLists(chunk); @@ -1921,13 +2103,14 @@ void BufferAllocator::updateFreeRegionStart(FreeLists* freeLists, } } -bool BufferAllocator::growMedium(void* alloc, size_t newBytes) { - BufferChunk* chunk = BufferChunk::from(alloc); +bool BufferAllocator::growMedium(MediumBuffer* header, size_t newBytes) { + BufferChunk* chunk = BufferChunk::from(header); + MOZ_ASSERT(chunk->zone == zone); + if (isSweepingChunk(chunk)) { return false; // We can't grow if the chunk is currently being swept. } - auto* header = GetHeaderFromAlloc(alloc); newBytes += sizeof(MediumBuffer); size_t currentBytes = SizeClassBytes(header->sizeClass); @@ -1972,13 +2155,14 @@ bool BufferAllocator::growMedium(void* alloc, size_t newBytes) { return true; } -bool BufferAllocator::shrinkMedium(void* alloc, size_t newBytes) { - BufferChunk* chunk = BufferChunk::from(alloc); +bool BufferAllocator::shrinkMedium(MediumBuffer* header, size_t newBytes) { + BufferChunk* chunk = BufferChunk::from(header); + MOZ_ASSERT(chunk->zone == zone); + if (isSweepingChunk(chunk)) { return false; // We can't shrink if the chunk is currently being swept. } - auto* header = GetHeaderFromAlloc(alloc); size_t currentBytes = SizeClassBytes(header->sizeClass); newBytes += sizeof(MediumBuffer); @@ -2143,41 +2327,83 @@ bool BufferAllocator::IsMediumAlloc(void* alloc) { return chunk->getKind() == ChunkKind::MediumBuffers; } -void* BufferAllocator::allocLarge(size_t bytes, bool nurseryOwned, bool inGC) { - size_t totalBytes = RoundUp(bytes + sizeof(LargeBuffer), ChunkSize); - MOZ_ASSERT(totalBytes > MaxMediumAllocSize); - MOZ_ASSERT(totalBytes >= bytes); +bool BufferAllocator::needLockToAccessBufferMap() const { + MOZ_ASSERT(CurrentThreadCanAccessZone(zone) || CurrentThreadIsGCMarking()); + return minorState.refNoCheck() == State::Sweeping || + majorState.refNoCheck() == State::Sweeping; +} - // Large allocations are aligned to the chunk size, even if they are smaller - // than a chunk. This allows us to tell different kinds of buffer allocation - // apart by looking at the chunk kind. - void* ptr = MapAlignedPages(totalBytes, ChunkSize, ShouldStallAndRetry(inGC)); - if (!ptr) { +LargeBuffer* BufferAllocator::lookupLargeBuffer(void* alloc) { + MaybeLock lock; + return lookupLargeBuffer(alloc, lock); +} + +LargeBuffer* BufferAllocator::lookupLargeBuffer(void* alloc, MaybeLock& lock) { + MOZ_ASSERT(lock.isNothing()); + if (needLockToAccessBufferMap()) { + lock.emplace(this); + } + + auto ptr = largeAllocMap.ref().lookup(alloc); + MOZ_ASSERT(ptr); + LargeBuffer* buffer = ptr->value(); + MOZ_ASSERT(buffer->data() == alloc); + MOZ_ASSERT(buffer->zone() == zone); + return buffer; +} + +void* BufferAllocator::allocLarge(size_t bytes, bool nurseryOwned, bool inGC) { + bytes = RoundUp(bytes, ChunkSize); + MOZ_ASSERT(bytes > MaxMediumAllocSize); + MOZ_ASSERT(bytes >= bytes); + + // Allocate a small buffer the size of a LargeBuffer to hold the metadata. + static_assert(sizeof(LargeBuffer) <= MaxSmallAllocSize); + void* bufferPtr = allocSmall(sizeof(LargeBuffer), nurseryOwned); + if (!bufferPtr) { return nullptr; } + // Large allocations are aligned to the chunk size, even if they are smaller + // than a chunk. This allows us to tell large buffer allocations apart by + // looking at the pointer alignment. + void* ptr = MapAlignedPages(bytes, ChunkSize, ShouldStallAndRetry(inGC)); + if (!ptr) { + return nullptr; + } + auto freeGuard = mozilla::MakeScopeExit([&]() { UnmapPages(ptr, bytes); }); + + auto* buffer = new (bufferPtr) LargeBuffer(ptr, bytes, nurseryOwned); + CheckHighBitsOfPointer(ptr); - auto* header = new (ptr) LargeBuffer(zone, totalBytes, nurseryOwned); + { + MaybeLock lock; + if (needLockToAccessBufferMap()) { + lock.emplace(this); + } + if (!largeAllocMap.ref().putNew(ptr, buffer)) { + return nullptr; + } + } + + freeGuard.release(); if (nurseryOwned) { - largeNurseryAllocs.ref().pushBack(header); + largeNurseryAllocs.ref().pushBack(buffer); } else { - header->allocatedDuringCollection = majorState != State::NotCollecting; - largeTenuredAllocs.ref().pushBack(header); + buffer->allocatedDuringCollection = majorState != State::NotCollecting; + largeTenuredAllocs.ref().pushBack(buffer); } // Update memory accounting and trigger an incremental slice if needed. if (!nurseryOwned) { - size_t usableBytes = totalBytes - sizeof(LargeBuffer); bool checkThresholds = !inGC; - updateHeapSize(usableBytes, checkThresholds, false); + updateHeapSize(bytes, checkThresholds, false); } - void* alloc = header->data(); - MOZ_ASSERT(IsLargeAlloc(alloc)); - - return alloc; + MOZ_ASSERT(IsLargeAlloc(ptr)); + return ptr; } void BufferAllocator::updateHeapSize(size_t bytes, bool checkThresholds, @@ -2193,48 +2419,49 @@ void BufferAllocator::updateHeapSize(size_t bytes, bool checkThresholds, /* static */ bool BufferAllocator::IsLargeAlloc(void* alloc) { - ChunkBase* chunk = js::gc::detail::GetGCAddressChunkBase(alloc); - return chunk->kind == ChunkKind::LargeBuffer; + return (uintptr_t(alloc) & ChunkMask) == 0; } -/* static */ -bool BufferAllocator::IsLargeAllocMarked(void* alloc) { - auto* header = GetHeaderFromAlloc(alloc); - return header->marked; +bool BufferAllocator::isLargeAllocMarked(void* alloc) { + LargeBuffer* header = lookupLargeBuffer(alloc); + return header->headerCell()->isMarkedAny(); } -/* static */ -bool BufferAllocator::MarkLargeAlloc(void* alloc) { - auto* header = GetHeaderFromAlloc(alloc); - if (header->allocatedDuringCollection) { +bool BufferAllocator::markLargeTenuredBuffer(LargeBuffer* buffer) { + MOZ_ASSERT(!buffer->isNurseryOwned); + + if (buffer->allocatedDuringCollection) { return false; } - if (header->isNurseryOwned) { - // Nursery-owned allocations are always marked. - return false; - } + auto* headerCell = GetHeaderFromAlloc(buffer); - return header->markAtomic(); + // Bug 1961755: This method can return false positives. A fully atomic version + // would be preferable in this case. + return headerCell->markIfUnmarkedAtomic(MarkColor::Black); } bool BufferAllocator::sweepLargeTenured(LargeBuffer* header) { MOZ_ASSERT(!header->isNurseryOwned); - MOZ_ASSERT(header->zone == zone); + MOZ_ASSERT(header->zoneFromAnyThread() == zone); MOZ_ASSERT(!header->isInList()); - if (!header->marked) { - unmapLarge(header, true); - return false; + if (header->headerCell()->isMarkedAny()) { + return true; } - header->marked = false; - return true; + MaybeLock lock(std::in_place, this); + unmapLarge(header, true, lock); + return false; } void BufferAllocator::freeLarge(void* alloc) { - auto* header = GetHeaderFromAlloc(alloc); - MOZ_ASSERT(header->zone == zone); + MaybeLock lock; + LargeBuffer* header = lookupLargeBuffer(alloc, lock); + MOZ_ASSERT(header->zone() == zone); + + DebugOnlyPoison(alloc, JS_FREED_BUFFER_PATTERN, header->allocBytes(), + MemCheckKind::MakeUndefined); if (!header->isNurseryOwned && majorState == State::Sweeping && !header->allocatedDuringCollection) { @@ -2252,13 +2479,11 @@ void BufferAllocator::freeLarge(void* alloc) { largeTenuredAllocs.ref().remove(header); } - unmapLarge(header, false); + unmapLarge(header, false, lock); } -bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { - MOZ_ASSERT(IsLargeAlloc(alloc)); +bool BufferAllocator::shrinkLarge(LargeBuffer* header, size_t newBytes) { MOZ_ASSERT(IsLargeAllocSize(newBytes)); - #ifdef XP_WIN // Can't unmap part of a region mapped with VirtualAlloc on Windows. // @@ -2267,8 +2492,7 @@ bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { // grow the allocation again if necessary. return false; #else - auto* header = GetHeaderFromAlloc(alloc); - MOZ_ASSERT(header->zone == zone); + MOZ_ASSERT(header->zone() == zone); if (!header->isNurseryOwned && majorState == State::Sweeping && !header->allocatedDuringCollection) { @@ -2277,8 +2501,8 @@ bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { MOZ_ASSERT(header->isInList()); - newBytes = RoundUp(newBytes + sizeof(LargeBuffer), PageSize); - size_t oldBytes = header->bytesIncludingHeader; + newBytes = RoundUp(newBytes, ChunkSize); + size_t oldBytes = header->bytes; MOZ_ASSERT(oldBytes > newBytes); size_t shrinkBytes = oldBytes - newBytes; @@ -2286,26 +2510,37 @@ bool BufferAllocator::shrinkLarge(void* alloc, size_t newBytes) { zone->mallocHeapSize.removeBytes(shrinkBytes, false); } - header->bytesIncludingHeader = newBytes; - void* endPtr = reinterpret_cast(uintptr_t(header) + newBytes); + header->bytes = newBytes; + + void* endPtr = reinterpret_cast(uintptr_t(header->data()) + newBytes); UnmapPages(endPtr, shrinkBytes); return true; #endif } -void BufferAllocator::unmapLarge(LargeBuffer* header, bool isSweeping) { - MOZ_ASSERT(header->zone == zone); +void BufferAllocator::unmapLarge(LargeBuffer* header, bool isSweeping, + MaybeLock& lock) { + MOZ_ASSERT(header->zoneFromAnyThread() == zone); MOZ_ASSERT(!header->isInList()); + MOZ_ASSERT_IF(isSweeping || needLockToAccessBufferMap(), lock.isSome()); - size_t bytes = header->bytesIncludingHeader; +#ifdef DEBUG + auto ptr = largeAllocMap.ref().lookup(header->data()); + MOZ_ASSERT(ptr && ptr->value() == header); +#endif + largeAllocMap.ref().remove(header->data()); + + // Drop the lock now we've updated the map. + lock.reset(); + + size_t bytes = header->bytes; if (!header->isNurseryOwned) { - size_t usableBytes = bytes - sizeof(LargeBuffer); - zone->mallocHeapSize.removeBytes(usableBytes, isSweeping); + zone->mallocHeapSize.removeBytes(bytes, isSweeping); } - UnmapPages(header, bytes); + UnmapPages(header->data(), bytes); } #include "js/Printer.h" @@ -2413,13 +2648,13 @@ size_t BufferAllocator::getSizeOfNurseryBuffers() { for (BufferChunk* chunk : mediumMixedChunks.ref()) { for (BufferChunkIter alloc(chunk); !alloc.done(); alloc.next()) { if (alloc->isNurseryOwned) { - bytes += alloc->bytesIncludingHeader() - sizeof(MediumBuffer); + bytes += alloc->allocBytes(); } } } for (const LargeBuffer* buffer : largeNurseryAllocs.ref()) { - bytes += buffer->bytesIncludingHeader - sizeof(LargeBuffer); + bytes += buffer->allocBytes(); } return bytes; @@ -2475,12 +2710,12 @@ void BufferAllocator::getStats(size_t& usedBytes, size_t& freeBytes, } for (const LargeBuffer* buffer : largeNurseryAllocs.ref()) { largeNurseryAllocCount++; - usedBytes += buffer->bytesIncludingHeader - sizeof(LargeBuffer); + usedBytes += buffer->allocBytes(); adminBytes += sizeof(LargeBuffer); } for (const LargeBuffer* buffer : largeTenuredAllocs.ref()) { largeTenuredAllocCount++; - usedBytes += buffer->bytesIncludingHeader - sizeof(LargeBuffer); + usedBytes += buffer->allocBytes(); adminBytes += sizeof(LargeBuffer); } for (const FreeList& freeList : mediumFreeLists.ref()) { diff --git a/js/src/gc/BufferAllocator.h b/js/src/gc/BufferAllocator.h index 2aa65030a88..7ad4bf3ab12 100644 --- a/js/src/gc/BufferAllocator.h +++ b/js/src/gc/BufferAllocator.h @@ -12,6 +12,7 @@ #include "mozilla/Array.h" #include "mozilla/Atomics.h" #include "mozilla/BitSet.h" +#include "mozilla/HashTable.h" #include "mozilla/Maybe.h" #include "mozilla/TimeStamp.h" @@ -198,6 +199,7 @@ class BufferAllocator : public SlimLinkedListElement { public: explicit AutoLock(GCRuntime* gc); explicit AutoLock(BufferAllocator* allocator); + friend class UnlockGuard; }; // A lock guard that is locked only when needed. @@ -250,6 +252,9 @@ class BufferAllocator : public SlimLinkedListElement { using LargeAllocList = SlimLinkedList; + using LargeAllocMap = + mozilla::HashMap>; + enum class State : uint8_t { NotCollecting, Marking, Sweeping }; enum class OwnerKind : uint8_t { Tenured = 0, Nursery, None }; @@ -287,11 +292,15 @@ class BufferAllocator : public SlimLinkedListElement { // List of large tenured-owned buffers. MainThreadData largeTenuredAllocs; + // Map from allocation pointer to buffer metadata for large buffers. + // Access requires holding the mutex during sweeping. + MainThreadOrGCTaskData largeAllocMap; + // Large buffers waiting to be swept. + MainThreadOrGCTaskData largeNurseryAllocsToSweep; MainThreadOrGCTaskData largeTenuredAllocsToSweep; // Large buffers that have been swept. - MainThreadData sweptLargeNurseryAllocs; MutexData sweptLargeTenuredAllocs; // Flag to indicate that swept chunks are available to be merged in the @@ -302,6 +311,11 @@ class BufferAllocator : public SlimLinkedListElement { MainThreadData minorState; MainThreadData majorState; + // Flags to tell the main thread that sweeping has finished and the state + // should be updated. + MutexData minorSweepingFinished; + MutexData majorSweepingFinished; + // A major GC was started while a minor GC was still sweeping. Chunks by the // minor GC will be moved directly to the list of chunks to sweep for the // major GC. This happens for the minor GC at the start of every major GC. @@ -311,9 +325,9 @@ class BufferAllocator : public SlimLinkedListElement { // cleanup will be deferred to the end of the minor sweeping. MainThreadData majorFinishedWhileMinorSweeping; - // Flag to tell the main thread that minor sweeping has finished and - // minorState should be updated. - MutexData minorSweepingFinished; +#ifdef DEBUG + MainThreadData movingGCInProgress; +#endif public: explicit BufferAllocator(JS::Zone* zone); @@ -326,37 +340,32 @@ class BufferAllocator : public SlimLinkedListElement { static inline size_t GetGoodPower2ElementCount(size_t requiredElements, size_t elementSize); static bool IsBufferAlloc(void* alloc); - static size_t GetAllocSize(void* alloc); - static JS::Zone* GetAllocZone(void* alloc); - static bool IsNurseryOwned(void* alloc); - static bool IsMarkedBlack(void* alloc); - static void TraceEdge(JSTracer* trc, Cell* owner, void** bufferp, - const char* name); void* alloc(size_t bytes, bool nurseryOwned); void* allocInGC(size_t bytes, bool nurseryOwned); void* realloc(void* ptr, size_t bytes, bool nurseryOwned); void free(void* ptr); + size_t getAllocSize(void* ptr); + bool isNurseryOwned(void* ptr); void startMinorCollection(MaybeLock& lock); - bool startMinorSweeping(LargeAllocList& largeAllocsToFree); + bool startMinorSweeping(); void sweepForMinorCollection(); - static void FreeLargeAllocs(LargeAllocList& largeAllocsToFree); - void startMajorCollection(MaybeLock& lock); void startMajorSweeping(MaybeLock& lock); void sweepForMajorCollection(bool shouldDecommit); void finishMajorCollection(const AutoLock& lock); + void prepareForMovingGC(); + void fixupAfterMovingGC(); void clearMarkStateAfterBarrierVerification(); - void maybeMergeSweptData(); - void maybeMergeSweptData(MaybeLock& lock); - void mergeSweptData(); - void mergeSweptData(const AutoLock& lock); - bool isEmpty() const; + void traceEdge(JSTracer* trc, Cell* owner, void** bufferp, const char* name); + bool markTenuredAlloc(void* alloc); + bool isMarkedBlack(void* alloc); + // For debugging, used to implement GetMarkInfo. Returns false for allocations // being swept on another thread. bool isPointerWithinMediumOrLargeBuffer(void* ptr); @@ -383,13 +392,16 @@ class BufferAllocator : public SlimLinkedListElement { #endif private: - // GC-internal APIs: - static bool MarkTenuredAlloc(void* alloc); - friend class js::GCMarker; - void markNurseryOwnedAlloc(void* alloc, bool ownerWasTenured); friend class js::Nursery; + void maybeMergeSweptData(); + void maybeMergeSweptData(MaybeLock& lock); + void mergeSweptData(); + void mergeSweptData(const AutoLock& lock); + void abortMajorSweeping(const AutoLock& lock); + void clearAllocatedDuringCollectionState(const AutoLock& lock); + // Small allocation methods: static inline bool IsSmallAllocSize(size_t bytes); @@ -397,6 +409,10 @@ class BufferAllocator : public SlimLinkedListElement { void* allocSmall(size_t bytes, bool nurseryOwned); void* allocSmallInGC(size_t bytes, bool nurseryOwned); + void traceSmallAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name); + void markSmallNurseryOwnedBuffer(SmallBuffer* buffer, bool ownerWasTenured); + bool markSmallTenuredAlloc(void* alloc); static AllocKind AllocKindForSmallAlloc(size_t bytes); @@ -419,8 +435,8 @@ class BufferAllocator : public SlimLinkedListElement { uintptr_t freeEnd, bool shouldDecommit, bool expectUnchanged, FreeLists& freeLists); void freeMedium(void* alloc); - bool growMedium(void* alloc, size_t newBytes); - bool shrinkMedium(void* alloc, size_t newBytes); + bool growMedium(MediumBuffer* header, size_t newBytes); + bool shrinkMedium(MediumBuffer* header, size_t newBytes); FreeRegion* findFollowingFreeRegion(uintptr_t start); FreeRegion* findPrecedingFreeRegion(uintptr_t start); enum class ListPosition { Front, Back }; @@ -432,6 +448,10 @@ class BufferAllocator : public SlimLinkedListElement { uintptr_t newStart); FreeLists* getChunkFreeLists(BufferChunk* chunk); bool isSweepingChunk(BufferChunk* chunk); + void traceMediumAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name); + void markMediumNurseryOwnedBuffer(MediumBuffer* buffer, bool ownerWasTenured); + bool markMediumTenuredAlloc(void* alloc); // Get the size class for an allocation. This rounds up to a class that is // large enough to hold the required size. @@ -448,14 +468,22 @@ class BufferAllocator : public SlimLinkedListElement { static inline bool IsLargeAllocSize(size_t bytes); static bool IsLargeAlloc(void* alloc); - static bool IsLargeAllocMarked(void* alloc); - static bool MarkLargeAlloc(void* alloc); void* allocLarge(size_t bytes, bool nurseryOwned, bool inGC); bool sweepLargeTenured(LargeBuffer* header); void freeLarge(void* alloc); - bool shrinkLarge(void* alloc, size_t newBytes); - void unmapLarge(LargeBuffer* header, bool isSweeping); + bool shrinkLarge(LargeBuffer* header, size_t newBytes); + void unmapLarge(LargeBuffer* header, bool isSweeping, MaybeLock& lock); + void traceLargeAlloc(JSTracer* trc, Cell* owner, void** allocp, + const char* name); + void markLargeNurseryOwnedBuffer(LargeBuffer* buffer, bool ownerWasTenured); + bool markLargeTenuredBuffer(LargeBuffer* buffer); + bool isLargeAllocMarked(void* alloc); + + // Lookup a large buffer by pointer in the map. + LargeBuffer* lookupLargeBuffer(void* alloc); + LargeBuffer* lookupLargeBuffer(void* alloc, MaybeLock& lock); + bool needLockToAccessBufferMap() const; void updateHeapSize(size_t bytes, bool checkThresholds, bool updateRetainedSize); @@ -494,33 +522,10 @@ struct alignas(CellAlignBytes) MediumBuffer { static MediumBuffer* from(BufferChunk* chunk, uintptr_t offset); void check() const; size_t bytesIncludingHeader() const; + size_t allocBytes() const; void* data(); }; -struct alignas(CellAlignBytes) LargeBuffer - : protected ChunkBase, - public SlimLinkedListElement { - JS::Zone* const zone; - size_t bytesIncludingHeader; - mozilla::Atomic marked; - bool isNurseryOwned; - bool allocatedDuringCollection = false; - -#ifdef DEBUG - uint32_t checkValue = LargeBufferCheckValue; -#endif - - inline LargeBuffer(JS::Zone* zone, size_t bytes, bool nurseryOwned); - - inline void check() const; - - inline bool markAtomic(); - inline void* data(); - bool isPointerWithinAllocation(void* ptr) const; -}; - -static constexpr size_t LargeBufferHeaderSize = sizeof(LargeBuffer); - } // namespace gc } // namespace js diff --git a/js/src/gc/Cell.h b/js/src/gc/Cell.h index 1809f48f6d1..47751203cbe 100644 --- a/js/src/gc/Cell.h +++ b/js/src/gc/Cell.h @@ -901,6 +901,8 @@ class alignas(gc::CellAlignBytes) SmallBuffer : public TenuredCell { // GCRuntime::checkForCompartmentMismatches ends up calling this because it // iterates all GC cells. } + + size_t allocBytes() const; void* data() { return this + 1; } }; template diff --git a/js/src/gc/Compacting.cpp b/js/src/gc/Compacting.cpp index 4250a5a5a55..eec1719c1a2 100644 --- a/js/src/gc/Compacting.cpp +++ b/js/src/gc/Compacting.cpp @@ -388,7 +388,7 @@ bool ArenaLists::relocateArenas(Arena*& relocatedListOut, JS::GCReason reason, clearFreeLists(); if (ShouldRelocateAllArenas(reason)) { - zone_->prepareForCompacting(); + zone_->prepareForMovingGC(); for (auto kind : allocKindsToRelocate) { ArenaList& al = arenaList(kind); Arena* allArenas = al.release(); @@ -409,7 +409,7 @@ bool ArenaLists::relocateArenas(Arena*& relocatedListOut, JS::GCReason reason, return false; } - zone_->prepareForCompacting(); + zone_->prepareForMovingGC(); for (auto kind : allocKindsToRelocate) { if (rangeToRelocate[kind].first) { ArenaList& al = arenaList(kind); @@ -471,13 +471,6 @@ inline void MovingTracer::onEdge(T** thingp, const char* name) { } } -void Zone::prepareForCompacting() { - JS::GCContext* gcx = runtimeFromMainThread()->gcContext(); - - MOZ_ASSERT(!isPreservingCode()); - forceDiscardJitCode(gcx); -} - void GCRuntime::sweepZoneAfterCompacting(MovingTracer* trc, Zone* zone) { MOZ_ASSERT(zone->isGCCompacting()); diff --git a/js/src/gc/GC.cpp b/js/src/gc/GC.cpp index ff89d07ab06..9e4e33177f5 100644 --- a/js/src/gc/GC.cpp +++ b/js/src/gc/GC.cpp @@ -317,6 +317,8 @@ void GCRuntime::verifyAllChunks() { if (currentChunk_) { MOZ_ASSERT(currentChunk_->info.isCurrentChunk); currentChunk_->verify(); + } else { + MOZ_ASSERT(pendingFreeCommittedArenas.ref().IsEmpty()); } } #endif @@ -2271,13 +2273,11 @@ void GCRuntime::queueAllLifoBlocksForFreeAfterMinorGC(LifoAlloc* lifo) { } void GCRuntime::queueBuffersForFreeAfterMinorGC( - Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers, - Nursery::LargeAllocList& largeAllocs) { + Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers) { AutoLockHelperThreadState lock; if (!buffersToFreeAfterMinorGC.ref().empty() || - !stringBuffersToReleaseAfterMinorGC.ref().empty() || - !largeBuffersToFreeAfterMinorGC.ref().isEmpty()) { + !stringBuffersToReleaseAfterMinorGC.ref().empty()) { // In the rare case that this hasn't processed the buffers from a previous // minor GC we have to wait here. MOZ_ASSERT(!freeTask.isIdle(lock)); @@ -2289,9 +2289,6 @@ void GCRuntime::queueBuffersForFreeAfterMinorGC( MOZ_ASSERT(stringBuffersToReleaseAfterMinorGC.ref().empty()); std::swap(stringBuffersToReleaseAfterMinorGC.ref(), stringBuffers); - - MOZ_ASSERT(largeBuffersToFreeAfterMinorGC.ref().isEmpty()); - std::swap(largeBuffersToFreeAfterMinorGC.ref(), largeAllocs); } void Realm::destroy(JS::GCContext* gcx) { @@ -4036,7 +4033,6 @@ void GCRuntime::incrementalSlice(SliceBudget& budget, JS::GCReason reason, MOZ_ASSERT(minorGCNumber >= initialMinorGCNumber); if (minorGCNumber == initialMinorGCNumber) { MOZ_ASSERT(nursery().sweepTaskIsIdle()); - waitBackgroundFreeEnd(); } { @@ -4068,6 +4064,7 @@ void GCRuntime::incrementalSlice(SliceBudget& budget, JS::GCReason reason, beginCompactPhase(); } + nursery().joinSweepTask(); if (compactPhase(reason, budget, session) == NotFinished) { break; } diff --git a/js/src/gc/GCRuntime.h b/js/src/gc/GCRuntime.h index 117aada2f68..439e24365bb 100644 --- a/js/src/gc/GCRuntime.h +++ b/js/src/gc/GCRuntime.h @@ -620,8 +620,7 @@ class GCRuntime { void queueUnusedLifoBlocksForFree(LifoAlloc* lifo); void queueAllLifoBlocksForFreeAfterMinorGC(LifoAlloc* lifo); void queueBuffersForFreeAfterMinorGC( - Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers, - Nursery::LargeAllocList& largeAllocs); + Nursery::BufferSet& buffers, Nursery::StringBufferVector& stringBuffers); // Public here for ReleaseArenaLists and FinalizeTypedArenas. void releaseArena(Arena* arena, const AutoLockGC& lock); @@ -695,8 +694,7 @@ class GCRuntime { bool hasBuffersForBackgroundFree() const { return !lifoBlocksToFree.ref().isEmpty() || !buffersToFreeAfterMinorGC.ref().empty() || - !stringBuffersToReleaseAfterMinorGC.ref().empty() || - !largeBuffersToFreeAfterMinorGC.ref().isEmpty(); + !stringBuffersToReleaseAfterMinorGC.ref().empty(); } // Returns false on failure without raising an exception. @@ -1099,6 +1097,11 @@ class GCRuntime { // accessed without taking the GC lock. MainThreadData currentChunk_; + // Bitmap for arenas in the current chunk that have been freed by background + // sweeping but not yet merged into the chunk's freeCommittedArenas. + GCLockData pendingFreeCommittedArenas; + friend class ArenaChunk; + /* * JSGC_MIN_EMPTY_CHUNK_COUNT * @@ -1227,8 +1230,6 @@ class GCRuntime { HelperThreadLockData buffersToFreeAfterMinorGC; HelperThreadLockData stringBuffersToReleaseAfterMinorGC; - HelperThreadLockData> - largeBuffersToFreeAfterMinorGC; /* The number of the minor GC peformed at the start of major GC. */ MainThreadData initialMinorGCNumber; diff --git a/js/src/gc/Heap.cpp b/js/src/gc/Heap.cpp index f7fede2dc86..1eec140def9 100644 --- a/js/src/gc/Heap.cpp +++ b/js/src/gc/Heap.cpp @@ -355,8 +355,9 @@ void ArenaChunk::releaseArena(GCRuntime* gc, Arena* arena, // The main thread is allocating out of this chunk without holding the // lock. Don't touch any data structures it is using but add the arena to a // pending set. This will be merged back by mergePendingFreeArenas. - MOZ_ASSERT(!pendingFreeCommittedArenas[arenaIndex(arena)]); - pendingFreeCommittedArenas[arenaIndex(arena)] = true; + auto& bitmap = gc->pendingFreeCommittedArenas.ref(); + MOZ_ASSERT(!bitmap[arenaIndex(arena)]); + bitmap[arenaIndex(arena)] = true; return; } @@ -465,7 +466,7 @@ void ArenaChunk::updateCurrentChunkAfterAlloc(GCRuntime* gc) { if (MOZ_UNLIKELY(isFull())) { AutoLockGC lock(gc); - mergePendingFreeArenas(lock); + mergePendingFreeArenas(gc, lock); if (isFull()) { gc->clearCurrentChunk(lock); } @@ -504,9 +505,9 @@ void ArenaChunk::updateFreeCountsAfterFree(GCRuntime* gc, size_t numArenasFreed, void GCRuntime::setCurrentChunk(ArenaChunk* chunk, const AutoLockGC& lock) { MOZ_ASSERT(!currentChunk_); + MOZ_ASSERT(pendingFreeCommittedArenas.ref().IsEmpty()); MOZ_ASSERT(chunk); MOZ_ASSERT(!chunk->info.isCurrentChunk); - MOZ_ASSERT(chunk->pendingFreeCommittedArenas.IsEmpty()); currentChunk_ = chunk; chunk->info.isCurrentChunk = true; // Lock needed here. @@ -520,7 +521,7 @@ void GCRuntime::clearCurrentChunk(const AutoLockGC& lock) { return; } - chunk->mergePendingFreeArenas(lock); + chunk->mergePendingFreeArenas(this, lock); MOZ_ASSERT(chunk->info.isCurrentChunk); chunk->info.isCurrentChunk = false; // Lock needed here. @@ -540,17 +541,18 @@ void GCRuntime::clearCurrentChunk(const AutoLockGC& lock) { availableChunks(lock).push(chunk); } -void ArenaChunk::mergePendingFreeArenas(const AutoLockGC& lock) { +void ArenaChunk::mergePendingFreeArenas(GCRuntime* gc, const AutoLockGC& lock) { MOZ_ASSERT(info.isCurrentChunk); - if (pendingFreeCommittedArenas.IsEmpty()) { + auto& bitmap = gc->pendingFreeCommittedArenas.ref(); + if (bitmap.IsEmpty()) { return; } - MOZ_ASSERT((freeCommittedArenas & pendingFreeCommittedArenas).IsEmpty()); - size_t count = pendingFreeCommittedArenas.Count(); - freeCommittedArenas |= pendingFreeCommittedArenas; - pendingFreeCommittedArenas.ResetAll(); + MOZ_ASSERT((freeCommittedArenas & bitmap).IsEmpty()); + size_t count = bitmap.Count(); + freeCommittedArenas |= bitmap; + bitmap.ResetAll(); info.numArenasFree += count; info.numArenasFreeCommitted += count; @@ -708,7 +710,6 @@ void ChunkPool::verifyChunks() const { for (ArenaChunk* chunk = head_; chunk; chunk = chunk->info.next) { chunk->verify(); MOZ_ASSERT(!chunk->info.isCurrentChunk); - MOZ_ASSERT(chunk->pendingFreeCommittedArenas.IsEmpty()); } } diff --git a/js/src/gc/Heap.h b/js/src/gc/Heap.h index b8a0689a582..d84393ad896 100644 --- a/js/src/gc/Heap.h +++ b/js/src/gc/Heap.h @@ -547,7 +547,7 @@ class ArenaChunk : public ArenaChunkBase { Arena* fetchNextFreeArena(GCRuntime* gc); // Merge arenas freed by background sweeping into the main free arenas bitmap. - void mergePendingFreeArenas(const AutoLockGC& lock); + void mergePendingFreeArenas(GCRuntime* gc, const AutoLockGC& lock); #ifdef DEBUG void verify() const; diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index 3f480dd3696..370bb65d260 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -1657,12 +1657,12 @@ scan_obj: { if (nobj->hasDynamicSlots()) { ObjectSlots* slots = nobj->getSlotsHeader(); - BufferAllocator::MarkTenuredAlloc(slots); + MarkTenuredBuffer(nobj->zone(), slots); } if (nobj->hasDynamicElements()) { void* elements = nobj->getUnshiftedElementsHeader(); - BufferAllocator::MarkTenuredAlloc(elements); + MarkTenuredBuffer(nobj->zone(), elements); } if (!nobj->hasEmptyElements()) { diff --git a/js/src/gc/Nursery.cpp b/js/src/gc/Nursery.cpp index b0b904c24dd..4c85f673ac8 100644 --- a/js/src/gc/Nursery.cpp +++ b/js/src/gc/Nursery.cpp @@ -917,14 +917,12 @@ void* js::Nursery::reallocateBuffer(Zone* zone, Cell* cell, void* oldBuffer, size_t oldBytes, size_t newBytes) { if (!IsInsideNursery(cell)) { MOZ_ASSERT(IsBufferAlloc(oldBuffer)); - MOZ_ASSERT(!ChunkPtrIsInsideNursery(oldBuffer)); - MOZ_ASSERT(!IsNurseryOwned(oldBuffer)); + MOZ_ASSERT(!IsNurseryOwned(zone, oldBuffer)); return ReallocBuffer(zone, oldBuffer, newBytes, false); } - if (!ChunkPtrIsInsideNursery(oldBuffer)) { - MOZ_ASSERT(IsBufferAlloc(oldBuffer)); - MOZ_ASSERT(IsNurseryOwned(oldBuffer)); + if (IsBufferAlloc(oldBuffer)) { + MOZ_ASSERT(IsNurseryOwned(zone, oldBuffer)); MOZ_ASSERT(toSpace.mallocedBufferBytes >= oldBytes); void* newBuffer = ReallocBuffer(zone, oldBuffer, newBytes, true); @@ -1702,8 +1700,7 @@ js::Nursery::CollectionResult js::Nursery::doCollection(AutoGCSession& session, // Sweep malloced buffers. startProfile(ProfileKey::FreeMallocedBuffers); gc->queueBuffersForFreeAfterMinorGC(fromSpace.mallocedBuffers, - stringBuffersToReleaseAfterMinorGC_, - largeAllocsToFreeAfterMinorGC_); + stringBuffersToReleaseAfterMinorGC_); fromSpace.mallocedBufferBytes = 0; endProfile(ProfileKey::FreeMallocedBuffers); @@ -1979,12 +1976,12 @@ Nursery::WasBufferMoved js::Nursery::maybeMoveRawBufferOnPromotion( bool nurseryOwned = IsInsideNursery(owner); void* buffer = *bufferp; - if (!ChunkPtrIsInsideNursery(buffer)) { + if (IsBufferAlloc(buffer)) { // This is an external buffer allocation owned by a nursery GC thing. - MOZ_ASSERT(IsNurseryOwned(buffer)); + Zone* zone = owner->zone(); + MOZ_ASSERT(IsNurseryOwned(zone, buffer)); bool ownerWasTenured = !nurseryOwned; - owner->zone()->bufferAllocator.markNurseryOwnedAlloc(buffer, - ownerWasTenured); + zone->bufferAllocator.markNurseryOwnedAlloc(buffer, ownerWasTenured); if (nurseryOwned) { registerBuffer(buffer, nbytes); } @@ -2014,11 +2011,8 @@ Nursery::WasBufferMoved js::Nursery::maybeMoveRawBufferOnPromotion( } void js::Nursery::sweepBuffers() { - MOZ_ASSERT(largeAllocsToFreeAfterMinorGC_.isEmpty()); - for (ZonesIter zone(runtime(), WithAtoms); !zone.done(); zone.next()) { - if (zone->bufferAllocator.startMinorSweeping( - largeAllocsToFreeAfterMinorGC_)) { + if (zone->bufferAllocator.startMinorSweeping()) { sweepTask->queueAllocatorToSweep(zone->bufferAllocator); } } diff --git a/js/src/gc/Nursery.h b/js/src/gc/Nursery.h index c8decaaf9ea..9820955f783 100644 --- a/js/src/gc/Nursery.h +++ b/js/src/gc/Nursery.h @@ -777,9 +777,6 @@ class Nursery { Vector; StringBufferVector stringBuffersToReleaseAfterMinorGC_; - using LargeAllocList = SlimLinkedList; - LargeAllocList largeAllocsToFreeAfterMinorGC_; - UniquePtr sweepTask; UniquePtr decommitTask; @@ -816,13 +813,6 @@ MOZ_ALWAYS_INLINE bool Nursery::Space::isInside(const void* p) const { return false; } -// Test whether a GC cell or buffer is in the nursery. Equivalent to -// IsInsideNursery but take care not to call this with malloc memory. Faster -// than Nursery::isInside. -MOZ_ALWAYS_INLINE bool ChunkPtrIsInsideNursery(void* ptr) { - return gc::detail::ChunkPtrHasStoreBuffer(ptr); -} - } // namespace js #endif // gc_Nursery_h diff --git a/js/src/gc/Sweeping.cpp b/js/src/gc/Sweeping.cpp index 6aa097592f9..9714572c7c9 100644 --- a/js/src/gc/Sweeping.cpp +++ b/js/src/gc/Sweeping.cpp @@ -430,7 +430,9 @@ void GCRuntime::sweepBackgroundThings(ZoneList& zones) { // Now everything with a non-trivial finalizer has been finalized we can // sweep buffer memory. - // TODO: This could happen in parallel with further arena sweeping. + // + // Note we depend on this happening before the BUFFER alloc kinds in + // BackgroundTrivialFinalizePhase are swept! bool decommit = shouldDecommit() && DecommitEnabled(); zone->bufferAllocator.sweepForMajorCollection(decommit); @@ -601,9 +603,6 @@ void GCRuntime::freeFromBackgroundThread(AutoLockHelperThreadState& lock) { Nursery::StringBufferVector stringBuffers; std::swap(stringBuffers, stringBuffersToReleaseAfterMinorGC.ref()); - SlimLinkedList largeBuffers; - std::swap(largeBuffers, largeBuffersToFreeAfterMinorGC.ref()); - AutoUnlockHelperThreadState unlock(lock); lifoBlocks.freeAll(); @@ -619,8 +618,6 @@ void GCRuntime::freeFromBackgroundThread(AutoLockHelperThreadState& lock) { for (auto* buffer : stringBuffers) { buffer->Release(); } - - BufferAllocator::FreeLargeAllocs(largeBuffers); } while (hasBuffersForBackgroundFree()); } diff --git a/js/src/gc/Tracer.h b/js/src/gc/Tracer.h index 6e7e2885a03..74b34acda77 100644 --- a/js/src/gc/Tracer.h +++ b/js/src/gc/Tracer.h @@ -7,8 +7,8 @@ #ifndef js_Tracer_h #define js_Tracer_h +#include "gc/Allocator.h" #include "gc/Barrier.h" -#include "gc/BufferAllocator.h" #include "gc/TraceKind.h" #include "js/HashTable.h" #include "js/TracingAPI.h" @@ -335,7 +335,7 @@ template void TraceBufferEdge(JSTracer* trc, gc::Cell* owner, T** bufferp, const char* name) { void** ptrp = reinterpret_cast(bufferp); - gc::BufferAllocator::TraceEdge(trc, owner, ptrp, name); + gc::TraceBufferEdgeInternal(trc, owner, ptrp, name); } // As below but with manual barriers. diff --git a/js/src/gc/Zone.cpp b/js/src/gc/Zone.cpp index 4cd60f9768c..7c1d922f03b 100644 --- a/js/src/gc/Zone.cpp +++ b/js/src/gc/Zone.cpp @@ -602,9 +602,20 @@ Zone* Zone::nextZone() const { return listNext_; } +void Zone::prepareForMovingGC() { + JS::GCContext* gcx = runtimeFromMainThread()->gcContext(); + + MOZ_ASSERT(!isPreservingCode()); + forceDiscardJitCode(gcx); + + // We must always call fixupAfterMovingGC after this point. + bufferAllocator.prepareForMovingGC(); +} + void Zone::fixupAfterMovingGC() { ZoneAllocator::fixupAfterMovingGC(); shapeZone().fixupPropMapShapeTableAfterMovingGC(); + bufferAllocator.fixupAfterMovingGC(); } void Zone::purgeAtomCache() { diff --git a/js/src/gc/Zone.h b/js/src/gc/Zone.h index b8ee8ca80b8..be34302299a 100644 --- a/js/src/gc/Zone.h +++ b/js/src/gc/Zone.h @@ -683,8 +683,6 @@ class Zone : public js::ZoneAllocator, public js::gc::GraphNodeBase { return numRealmsWithAllocMetadataBuilder_ > 0; } - void prepareForCompacting(); - void traceRootsInMajorGC(JSTracer* trc); void sweepAfterMinorGC(JSTracer* trc); @@ -731,7 +729,9 @@ class Zone : public js::ZoneAllocator, public js::gc::GraphNodeBase { void traceWeakCCWEdges(JSTracer* trc); static void fixupAllCrossCompartmentWrappersAfterMovingGC(JSTracer* trc); + void prepareForMovingGC(); void fixupAfterMovingGC(); + void fixupScriptMapsAfterMovingGC(JSTracer* trc); void setNurseryAllocFlags(bool allocObjects, bool allocStrings, diff --git a/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js new file mode 100644 index 00000000000..287198c783c --- /dev/null +++ b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-cloning.js @@ -0,0 +1,12 @@ +// |jit-test| skip-if: !wasmThreadsEnabled() || !('toResizableBuffer' in WebAssembly.Memory.prototype) + +// When serializing and deserializing a SAB extracted from a memory, the length +// of the SAB should not change even if the memory was grown after serialization +// and before deserialization. + +let mem = new WebAssembly.Memory({initial: 2, maximum: 4, shared: true}); +let buf = mem.toResizableBuffer(); +let clonedbuf = serialize(buf, [], {SharedArrayBuffer: 'allow'}); +mem.grow(1); +let buf2 = deserialize(clonedbuf, {SharedArrayBuffer: 'allow'}); +assertEq(buf.byteLength, buf2.byteLength); diff --git a/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js new file mode 100644 index 00000000000..09403ebacbb --- /dev/null +++ b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer-shared.js @@ -0,0 +1,127 @@ +// |jit-test| skip-if: !('toResizableBuffer' in WebAssembly.Memory.prototype) + +let mem = new WebAssembly.Memory({initial: 20, maximum: 50, shared: true}); + +// Utils for testing + +let ins = wasmEvalText(`(module + (import "" "mem" (memory 20 50 shared)) + (func (export "check") (param i32 i32 i32) (result i32) + block + loop + local.get 0 + i32.load + local.get 2 + i32.eq + i32.eqz + br_if 1 + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + i32.const 1 + return + end + end + i32.const 0 + ) + (func (export "fill") (param i32 i32 i32) + loop + local.get 0 + local.get 2 + i32.store + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + end + ) +)`, {"": {mem,}}); + +function check(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + assertEq(arr[(off >> 2) + i], value); + } +} +function fill(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + arr[i] = value; + } +} + +fill(0, 10, 1); +assertEq(ins.exports.check(0, 10, 1), 1); + +// Convert to growable array, back to fixed-length, again to growable, +// and attempt to resize using JS. + +let ab = mem.buffer; +assertEq(ab.growable, false); + +// Make .buffer growable, detaching the old one. +let rab = mem.toResizableBuffer(); +assertEq(rab.growable, true); +assertEq(mem.buffer, rab); +assertEq(rab.maxByteLength, 50 << 16); + +assertEq(ins.exports.check(0, 10, 1), 1); +ins.exports.fill(0, 10, 3); +check(0, 10, 3); + +// We can go back if we choose. +let ab2 = mem.toFixedLengthBuffer(); +assertEq(ab2.growable, false); +assertEq(mem.buffer, ab2); +assertEq(ab2 !== ab, true); +assertEq(ab2.maxByteLength, 20 << 16); + +assertEq(ins.exports.check(0, 10, 3), 1); +ins.exports.fill(0, 10, 2); +check(0, 10, 2); + +assertThrowsInstanceOf( + () => ins.exports.check(20 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); +ins.exports.fill(20 * 65536 - 4, 1, 20); + +// Let's go back to growable. Memory#grow no longer detaches .buffer when it's growable. +rab = mem.toResizableBuffer(); +let oldLen = rab.byteLength; +mem.grow(8); +assertEq(rab.byteLength, oldLen + (8 * 65536)) +assertEq(rab.maxByteLength, 50 << 16); + +ins.exports.check(20 * 65536 - 4, 1, 20); +ins.exports.check(20 * 65536, 1, 0); +assertThrowsInstanceOf( + () => ins.exports.check(28 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); + +assertEq(ins.exports.check(0, 10, 2), 1); +ins.exports.fill(0, 10, 5); +check(0, 10, 5); + +// Try to resize JS way. +rab.grow(65536 * 30); +assertEq(rab.byteLength, 30 * 65536); +ins.exports.fill(30 * 65536 - 10*4, 10, 6); +check(30 * 65536 - 10 * 4, 10, 6); + +// RAB#resize throws when trying to shrink or grow by non-page multiples +// for WebAssembly.Memory-vended RABs. +assertThrowsInstanceOf(() => rab.grow(rab.byteLength - 65536), RangeError); +assertThrowsInstanceOf(() => rab.grow(rab.byteLength + 10), RangeError); diff --git a/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js new file mode 100644 index 00000000000..d52d18989b8 --- /dev/null +++ b/js/src/jit-test/tests/wasm/wasm-resizablearraybuffer.js @@ -0,0 +1,135 @@ +// |jit-test| skip-if: !('toResizableBuffer' in WebAssembly.Memory.prototype) + +let mem = new WebAssembly.Memory({initial: 20, maximum: 50}); + +// Utils for testing + +let ins = wasmEvalText(`(module + (import "" "mem" (memory 20 50)) + (func (export "check") (param i32 i32 i32) (result i32) + block + loop + local.get 0 + i32.load + local.get 2 + i32.eq + i32.eqz + br_if 1 + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + i32.const 1 + return + end + end + i32.const 0 + ) + (func (export "fill") (param i32 i32 i32) + loop + local.get 0 + local.get 2 + i32.store + + local.get 1 + i32.const 1 + i32.sub + local.set 1 + local.get 0 + i32.const 4 + i32.add + local.set 0 + local.get 1 + br_if 0 + end + ) +)`, {"": {mem,}}); + +function check(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + assertEq(arr[(off >> 2) + i], value); + } +} +function fill(off, count, value) { + const arr = new Int32Array(mem.buffer); + for (let i = 0; i < count; i++) { + arr[i] = value; + } +} + +fill(0, 10, 1); +assertEq(ins.exports.check(0, 10, 1), 1); + +// Convert to resizable array, back to fixed-length, again to resizable, +// and attempt to resize using JS. + +let ab = mem.buffer; +assertEq(ab.resizable, false); + +// Make .buffer resizable, detaching the old one. +let rab = mem.toResizableBuffer(); +assertEq(rab.resizable, true); +assertEq(mem.buffer, rab); +assertEq(ab.detached, true); +assertEq(rab.maxByteLength, 50 << 16); + +assertEq(ins.exports.check(0, 10, 1), 1); +ins.exports.fill(0, 10, 3); +check(0, 10, 3); + +// We can go back if we choose. +let ab2 = mem.toFixedLengthBuffer(); +assertEq(ab2.resizable, false); +assertEq(mem.buffer, ab2); +assertEq(ab2 !== ab, true); +assertEq(rab.detached, true); +assertEq(ab2.maxByteLength, 20 << 16); + +assertEq(ins.exports.check(0, 10, 3), 1); +ins.exports.fill(0, 10, 2); +check(0, 10, 2); + +assertThrowsInstanceOf( + () => ins.exports.check(20 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); +ins.exports.fill(20 * 65536 - 4, 1, 20); + +// Let's go back to resizable. Memory#grow no longer detaches .buffer when it's resizable. +rab = mem.toResizableBuffer(); +let oldLen = rab.byteLength; +mem.grow(8); +assertEq(rab.detached, false); +assertEq(rab.byteLength, oldLen + (8 * 65536)) +assertEq(rab.maxByteLength, 50 << 16); + +ins.exports.check(20 * 65536 - 4, 1, 20); +ins.exports.check(20 * 65536, 1, 0); +assertThrowsInstanceOf( + () => ins.exports.check(28 * 65536 - 4, 2, 0), WebAssembly.RuntimeError); + +assertEq(ins.exports.check(0, 10, 2), 1); +ins.exports.fill(0, 10, 5); +check(0, 10, 5); + +// Try to resize JS way. +rab.resize(65536 * 30); +assertEq(rab.byteLength, 30 * 65536); +ins.exports.fill(30 * 65536 - 10*4, 10, 6); +check(30 * 65536 - 10 * 4, 10, 6); + +// RAB#resize throws when trying to shrink or grow by non-page multiples +// for WebAssembly.Memory-vended RABs. +assertThrowsInstanceOf(() => rab.resize(rab.byteLength - 65536), RangeError); +assertThrowsInstanceOf(() => rab.resize(rab.byteLength + 10), RangeError); + +// No allow to make buffer resizable when max in not specified. + +mem = new WebAssembly.Memory({initial: 20}); +assertThrowsInstanceOf(() => mem.toResizableBuffer(), TypeError); diff --git a/js/src/jit/ABIFunctionList-inl.h b/js/src/jit/ABIFunctionList-inl.h index c91f378a343..d00157ee450 100644 --- a/js/src/jit/ABIFunctionList-inl.h +++ b/js/src/jit/ABIFunctionList-inl.h @@ -7,6 +7,7 @@ #ifndef jit_ABIFunctionList_inl_h #define jit_ABIFunctionList_inl_h +#include "mozilla/MacroArgs.h" // MOZ_CONCAT #include "mozilla/SIMD.h" // mozilla::SIMD::memchr{,2x}{8,16} #include "jslibmath.h" // js::NumberMod @@ -97,108 +98,108 @@ namespace jit { # define ABIFUNCTION_FUZZILLI_LIST(_) #endif -#define ABIFUNCTION_LIST(_) \ - ABIFUNCTION_JS_GC_PROBES_LIST(_) \ - ABIFUNCTION_JS_CODEGEN_ARM_LIST(_) \ - ABIFUNCTION_WASM_CODEGEN_DEBUG_LIST(_) \ - _(js::ArgumentsObject::finishForIonPure) \ - _(js::ArgumentsObject::finishInlineForIonPure) \ - _(js::ArrayShiftMoveElements) \ - _(js::ArraySortData::sortArrayWithComparator) \ - _(js::ArraySortData::sortTypedArrayWithComparator) \ - _(js::ArraySortFromJit) \ - _(js::ecmaAtan2) \ - _(js::ecmaHypot) \ - _(js::ecmaPow) \ - _(js::EmulatesUndefined) \ - _(js::EmulatesUndefinedCheckFuse) \ - _(js::ExecuteRegExpAtomRaw) \ - _(js::hypot3) \ - _(js::hypot4) \ - _(js::Interpret) \ - _(js::Int32ToStringPure) \ - _(js::irregexp::CaseInsensitiveCompareNonUnicode) \ - _(js::irregexp::CaseInsensitiveCompareUnicode) \ - _(js::irregexp::GrowBacktrackStack) \ - _(js::irregexp::IsCharacterInRangeArray) \ - _(js::jit::AllocateAndInitTypedArrayBuffer) \ - _(js::jit::AllocateBigIntNoGC) \ - _(js::jit::AllocateFatInlineString) \ - _(js::jit::AllocateDependentString) \ - _(js::jit::AssertMapObjectHash) \ - _(js::jit::AssertPropertyLookup) \ - _(js::jit::AssertSetObjectHash) \ - _(js::jit::AssertValidBigIntPtr) \ - _(js::jit::AssertValidObjectPtr) \ - _(js::jit::AssertValidStringPtr) \ - _(js::jit::AssertValidSymbolPtr) \ - _(js::jit::AssertValidValue) \ - _(js::jit::AssumeUnreachable) \ - _(js::jit::AtomicsStore64) \ - _(js::jit::AtomizeStringNoGC) \ - _(js::jit::Bailout) \ - _(js::jit::BaselineScript::OSREntryForFrame) \ - _(js::jit::BigIntNumberEqual) \ - _(js::jit::BigIntNumberEqual) \ - _(js::jit::BigIntNumberCompare) \ - _(js::jit::NumberBigIntCompare) \ - _(js::jit::NumberBigIntCompare) \ - _(js::jit::BigIntNumberCompare) \ - _(js::jit::DateFillLocalTimeSlots) \ - _(js::jit::EqualStringsHelperPure) \ - _(js::jit::FinishBailoutToBaseline) \ - _(js::jit::Float16ToFloat32) \ - _(js::jit::Float32ToFloat16) \ - _(js::jit::FrameIsDebuggeeCheck) \ - _(js::jit::GetContextSensitiveInterpreterStub) \ - _(js::jit::GetIndexFromString) \ - _(js::jit::GetInt32FromStringPure) \ - _(js::jit::GetNativeDataPropertyPure) \ - _(js::jit::GetNativeDataPropertyPureWithCacheLookup) \ - _(js::jit::GetNativeDataPropertyByValuePure) \ - _(js::jit::GlobalHasLiveOnDebuggerStatement) \ - _(js::jit::HandleCodeCoverageAtPC) \ - _(js::jit::HandleCodeCoverageAtPrologue) \ - _(js::jit::HandleException) \ - _(js::jit::HasNativeDataPropertyPure) \ - _(js::jit::HasNativeDataPropertyPure) \ - _(js::jit::HasNativeElementPure) \ - _(js::jit::InitBaselineFrameForOsr) \ - _(js::jit::InvalidationBailout) \ - _(js::jit::InvokeFromInterpreterStub) \ - _(js::jit::LazyLinkTopActivation) \ - _(js::jit::LinearizeForCharAccessPure) \ - _(js::jit::ObjectHasGetterSetterPure) \ - _(js::jit::ObjectIsCallable) \ - _(js::jit::ObjectIsConstructor) \ - _(js::jit::PostGlobalWriteBarrier) \ - _(js::jit::PostWriteBarrier) \ - _(js::jit::PostWriteElementBarrier) \ - _(js::jit::Printf0) \ - _(js::jit::Printf1) \ - _(js::jit::StringFromCharCodeNoGC) \ - _(js::jit::StringTrimEndIndex) \ - _(js::jit::StringTrimStartIndex) \ - _(js::jit::TypeOfNameObject) \ - _(js::jit::TypeOfEqObject) \ - _(js::jit::WrapObjectPure) \ - ABIFUNCTION_FUZZILLI_LIST(_) \ - _(js::MapIteratorObject::next) \ - _(js::NativeObject::addDenseElementPure) \ - _(js::NativeObject::growSlotsPure) \ - _(js::NumberMod) \ - _(js::NumberToStringPure) \ - _(js::ObjectClassToString) \ - _(js::powi) \ - _(js::ProxyGetProperty) \ - _(js::RoundFloat16) \ - _(js::SetIteratorObject::next) \ - _(js::StringToNumberPure) \ - _(js::TypedArraySortFromJit) \ - _(js::TypeOfObject) \ - _(mozilla::SIMD::memchr16) \ - _(mozilla::SIMD::memchr2x16) \ - _(mozilla::SIMD::memchr2x8) \ +#define ABIFUNCTION_LIST(_) \ + ABIFUNCTION_JS_GC_PROBES_LIST(_) \ + ABIFUNCTION_JS_CODEGEN_ARM_LIST(_) \ + ABIFUNCTION_WASM_CODEGEN_DEBUG_LIST(_) \ + _(js::ArgumentsObject::finishForIonPure) \ + _(js::ArgumentsObject::finishInlineForIonPure) \ + _(js::ArrayShiftMoveElements) \ + _(js::ArraySortData::sortArrayWithComparator) \ + _(js::ArraySortData::sortTypedArrayWithComparator) \ + _(js::ArraySortFromJit) \ + _(js::ecmaAtan2) \ + _(js::ecmaHypot) \ + _(js::ecmaPow) \ + _(js::EmulatesUndefined) \ + _(js::EmulatesUndefinedCheckFuse) \ + _(js::ExecuteRegExpAtomRaw) \ + _(js::hypot3) \ + _(js::hypot4) \ + _(js::Interpret) \ + _(js::Int32ToStringPure) \ + _(js::irregexp::CaseInsensitiveCompareNonUnicode) \ + _(js::irregexp::CaseInsensitiveCompareUnicode) \ + _(js::irregexp::GrowBacktrackStack) \ + _(js::irregexp::IsCharacterInRangeArray) \ + _(js::jit::AllocateAndInitTypedArrayBuffer) \ + _(js::jit::AllocateBigIntNoGC) \ + _(js::jit::AllocateFatInlineString) \ + _(js::jit::AllocateDependentString) \ + _(js::jit::AssertMapObjectHash) \ + _(js::jit::AssertPropertyLookup) \ + _(js::jit::AssertSetObjectHash) \ + _(js::jit::AssertValidBigIntPtr) \ + _(js::jit::AssertValidObjectPtr) \ + _(js::jit::AssertValidStringPtr) \ + _(js::jit::AssertValidSymbolPtr) \ + _(js::jit::AssertValidValue) \ + _(js::jit::AssumeUnreachable) \ + _(js::jit::AtomicsStore64) \ + _(js::jit::AtomizeStringNoGC) \ + _(js::jit::Bailout) \ + _(js::jit::BaselineScript::OSREntryForFrame) \ + _(js::jit::BigIntNumberEqual) \ + _(js::jit::BigIntNumberEqual) \ + _(js::jit::BigIntNumberCompare) \ + _(js::jit::NumberBigIntCompare) \ + _(js::jit::NumberBigIntCompare) \ + _(js::jit::BigIntNumberCompare) \ + _(js::jit::DateFillLocalTimeSlots) \ + _(js::jit::EqualStringsHelperPure) \ + _(js::jit::FinishBailoutToBaseline) \ + _(js::jit::Float16ToFloat32) \ + _(js::jit::Float32ToFloat16) \ + _(js::jit::FrameIsDebuggeeCheck) \ + _(js::jit::GetContextSensitiveInterpreterStub) \ + _(js::jit::GetIndexFromString) \ + _(js::jit::GetInt32FromStringPure) \ + _(js::jit::GetNativeDataPropertyPure) \ + _(js::jit::GetNativeDataPropertyPureWithCacheLookup) \ + _(js::jit::GetNativeDataPropertyByValuePure) \ + _(js::jit::GlobalHasLiveOnDebuggerStatement) \ + _(js::jit::HandleCodeCoverageAtPC) \ + _(js::jit::HandleCodeCoverageAtPrologue) \ + _(js::jit::HandleException) \ + _(js::jit::HasNativeDataPropertyPure) \ + _(js::jit::HasNativeDataPropertyPure) \ + _(js::jit::HasNativeElementPure) \ + _(js::jit::InitBaselineFrameForOsr) \ + _(js::jit::InvalidationBailout) \ + _(js::jit::InvokeFromInterpreterStub) \ + _(js::jit::LazyLinkTopActivation) \ + _(js::jit::LinearizeForCharAccessPure) \ + _(js::jit::ObjectHasGetterSetterPure) \ + _(js::jit::ObjectIsCallable) \ + _(js::jit::ObjectIsConstructor) \ + _(js::jit::PostGlobalWriteBarrier) \ + _(js::jit::PostWriteBarrier) \ + _(js::jit::PostWriteElementBarrier) \ + _(js::jit::Printf0) \ + _(js::jit::Printf1) \ + _(js::jit::StringFromCharCodeNoGC) \ + _(js::jit::StringTrimEndIndex) \ + _(js::jit::StringTrimStartIndex) \ + _(js::jit::TypeOfNameObject) \ + _(js::jit::TypeOfEqObject) \ + _(js::jit::WrapObjectPure) \ + ABIFUNCTION_FUZZILLI_LIST(_) \ + _(js::MapIteratorObject::next) \ + _(js::NativeObject::addDenseElementPure) \ + _(js::NativeObject::growSlotsPure) \ + _(js::NumberMod) \ + _(js::NumberToStringPure) \ + _(js::ObjectClassToString) \ + _(js::powi) \ + _(js::ProxyGetProperty) \ + _(js::RoundFloat16) \ + _(js::SetIteratorObject::next) \ + _(js::StringToNumberPure) \ + _(js::TypedArraySortFromJit) \ + _(js::TypeOfObject) \ + _(mozilla::SIMD::memchr16) \ + _(mozilla::SIMD::memchr2x16) \ + _(mozilla::SIMD::memchr2x8) \ _(mozilla::SIMD::memchr8) // List of all ABI functions to be used with callWithABI, which are @@ -241,19 +242,17 @@ namespace jit { # pragma GCC diagnostic ignored "-Wignored-attributes" #endif -// Note: the use of ::fp instead of fp is intentional to enforce use of -// fully-qualified names in the list above. -#define DEF_TEMPLATE(fp) \ - template <> \ - struct ABIFunctionData { \ - static constexpr bool registered = true; \ +#define DEF_TEMPLATE(fp) \ + template <> \ + struct ABIFunctionData { \ + static constexpr bool registered = true; \ }; ABIFUNCTION_LIST(DEF_TEMPLATE) #undef DEF_TEMPLATE #define DEF_TEMPLATE(fp, ...) \ template <> \ - struct ABIFunctionData<__VA_ARGS__, ::fp> { \ + struct ABIFunctionData<__VA_ARGS__, fp> { \ static constexpr bool registered = true; \ }; ABIFUNCTION_AND_TYPE_LIST(DEF_TEMPLATE) @@ -275,4 +274,20 @@ ABIFUNCTIONSIG_LIST(DEF_TEMPLATE) } // namespace jit } // namespace js +// Make sure that all names are fully qualified (or at least, are resolvable +// within the toplevel namespace). +// +// Previously this was accomplished just by using `::fp` to force resolution +// within the toplevel namespace, but (1) that prevented using templated +// functions with more than one parameter (eg `void foo`) because the +// macro split on the comma and wrapping it in parens doesn't work because +// `::(foo)` is invalid; and (2) that would only check the function name itself, +// not eg template parameters. +namespace check_fully_qualified { +#define CHECK_NS_VISIBILITY(fp) \ + [[maybe_unused]] static constexpr decltype(&fp) MOZ_CONCAT(fp_, __COUNTER__) = nullptr; +ABIFUNCTION_LIST(CHECK_NS_VISIBILITY) +#undef CHECK_NS_VISIBILITY +} // namespace check_fully_qualified + #endif // jit_VMFunctionList_inl_h diff --git a/js/src/jit/VMFunctionList-inl.h b/js/src/jit/VMFunctionList-inl.h index 361789178ae..62abf380543 100644 --- a/js/src/jit/VMFunctionList-inl.h +++ b/js/src/jit/VMFunctionList-inl.h @@ -7,6 +7,8 @@ #ifndef jit_VMFunctionList_inl_h #define jit_VMFunctionList_inl_h +#include "mozilla/MacroArgs.h" // MOZ_CONCAT + #include "builtin/Eval.h" #include "builtin/ModuleObject.h" // js::GetOrCreateModuleMetaObject #include "builtin/Object.h" // js::ObjectCreateWithTemplate @@ -127,7 +129,7 @@ namespace jit { _(CloneRegExpObject, js::CloneRegExpObject) \ _(CloseIterOperation, js::CloseIterOperation) \ _(CodePointAt, js::jit::CodePointAt) \ - _(ConcatStrings, js::ConcatStrings) \ + _(ConcatStrings, js::ConcatStrings) \ _(CreateAsyncFromSyncIterator, js::CreateAsyncFromSyncIterator) \ _(CreateBigIntFromInt32, js::jit::CreateBigIntFromInt32) \ _(CreateBigIntFromInt64, js::jit::CreateBigIntFromInt64) \ @@ -218,8 +220,8 @@ namespace jit { _(InitFunctionEnvironmentObjects, js::jit::InitFunctionEnvironmentObjects) \ _(InitPropGetterSetterOperation, js::InitPropGetterSetterOperation) \ _(InitRestParameter, js::jit::InitRestParameter) \ - _(Int32ToString, js::Int32ToString) \ - _(Int32ToStringWithBase, js::Int32ToStringWithBase) \ + _(Int32ToString, js::Int32ToString) \ + _(Int32ToStringWithBase, js::Int32ToStringWithBase) \ _(InterpretResume, js::jit::InterpretResume) \ _(InterruptCheck, js::jit::InterruptCheck) \ _(InvokeFunction, js::jit::InvokeFunction) \ @@ -283,7 +285,7 @@ namespace jit { js::NewTypedArrayWithTemplateAndLength) \ _(NormalSuspend, js::jit::NormalSuspend) \ _(NumberParseInt, js::NumberParseInt) \ - _(NumberToString, js::NumberToString) \ + _(NumberToString, js::NumberToString) \ _(ObjectCreateWithTemplate, js::ObjectCreateWithTemplate) \ _(ObjectKeys, js::jit::ObjectKeys) \ _(ObjectKeysLength, js::jit::ObjectKeysLength) \ @@ -342,8 +344,9 @@ namespace jit { _(StringTrimEnd, js::StringTrimEnd) \ _(StringTrimStart, js::StringTrimStart) \ _(StringsCompareGreaterThanOrEquals, \ - js::jit::StringsCompare) \ - _(StringsCompareLessThan, js::jit::StringsCompare) \ + js::jit::StringsCompare) \ + _(StringsCompareLessThan, \ + js::jit::StringsCompare) \ _(StringsEqual, js::jit::StringsEqual) \ _(StringsNotEqual, js::jit::StringsEqual) \ _(SubstringKernel, js::SubstringKernel) \ @@ -358,7 +361,7 @@ namespace jit { _(ThrowUninitializedThis, js::ThrowUninitializedThis) \ _(ThrowWithStackOperation, js::ThrowWithStackOperation) \ _(ToBigInt, js::ToBigInt) \ - _(ToStringSlow, js::ToStringSlow) \ + _(ToStringSlow, js::ToStringSlow) \ _(ValueToIterator, js::ValueToIterator) \ _(VarEnvironmentObjectCreateWithoutEnclosing, \ js::VarEnvironmentObject::createWithoutEnclosing) @@ -384,7 +387,7 @@ struct VMFunctionToId; // Error here? Update VMFUNCTION_LIST? // fully-qualified names in the list above. #define DEF_TEMPLATE(name, fp, ...) \ template <> \ - struct VMFunctionToId { \ + struct VMFunctionToId { \ static constexpr VMFunctionId id = VMFunctionId::name; \ }; VMFUNCTION_LIST(DEF_TEMPLATE) @@ -397,4 +400,13 @@ VMFUNCTION_LIST(DEF_TEMPLATE) } // namespace jit } // namespace js +// Make sure that all names are fully qualified (or at least, are resolvable +// within the toplevel namespace). +namespace check_fully_qualified { +#define CHECK_NS_VISIBILITY(name, fp, ...) \ + [[maybe_unused]] static constexpr decltype(&fp) MOZ_CONCAT(fp_, __COUNTER__) = nullptr; +VMFUNCTION_LIST(CHECK_NS_VISIBILITY) +#undef CHECK_NS_VISIBILITY +} // namespace check_fully_qualified + #endif // jit_VMFunctionList_inl_h diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp index 6e8cec03b3d..fcaf1b08c84 100644 --- a/js/src/jit/VMFunctions.cpp +++ b/js/src/jit/VMFunctions.cpp @@ -368,7 +368,7 @@ struct VMFunctionDataHelper // Generate VMFunctionData array. static constexpr VMFunctionData vmFunctions[] = { #define DEF_VMFUNCTION(name, fp, valuesToPop...) \ - VMFunctionDataHelper(#name, PopValues(valuesToPop)), + VMFunctionDataHelper(#name, PopValues(valuesToPop)), VMFUNCTION_LIST(DEF_VMFUNCTION) #undef DEF_VMFUNCTION }; @@ -381,7 +381,7 @@ static constexpr VMFunctionData vmFunctions[] = { // in VMFunctionData because there's no good way to cast them to void* in // constexpr code. Compilers are smart enough to treat the const array below as // constexpr. -#define DEF_VMFUNCTION(name, fp, ...) (void*)(::fp), +#define DEF_VMFUNCTION(name, fp, ...) (void*)(fp), static void* const vmFunctionTargets[] = {VMFUNCTION_LIST(DEF_VMFUNCTION)}; #undef DEF_VMFUNCTION diff --git a/js/src/jsapi-tests/testGCAllocator.cpp b/js/src/jsapi-tests/testGCAllocator.cpp index 6704aa6bd7b..d8fb85eea2d 100644 --- a/js/src/jsapi-tests/testGCAllocator.cpp +++ b/js/src/jsapi-tests/testGCAllocator.cpp @@ -397,7 +397,9 @@ static size_t SomeAllocSizes[] = {16, 255 * 1024, 256 * 1024, 600 * 1024, - 3 * 1024 * 1024}; + 1 * 1024 * 1024, + 3 * 1024 * 1024, + 10 * 1024 * 1024}; static void WriteAllocData(void* alloc, size_t bytes) { auto* data = reinterpret_cast(alloc); @@ -503,23 +505,25 @@ BEGIN_TEST(testBufferAllocator_API) { } CHECK(GetGoodAllocSize(goodSize) == goodSize); + // Check we don't waste space requesting 1MB aligned sizes. + if (requestSize >= ChunkSize) { + CHECK(goodSize == RoundUp(requestSize, ChunkSize)); + } + for (bool nurseryOwned : {true, false}) { void* alloc = AllocBuffer(zone, requestSize, nurseryOwned); CHECK(alloc); CHECK(IsBufferAlloc(alloc)); - CHECK(!ChunkPtrIsInsideNursery(alloc)); - size_t actualSize = GetAllocSize(alloc); + size_t actualSize = GetAllocSize(zone, alloc); CHECK(actualSize == GetGoodAllocSize(requestSize)); - CHECK(GetAllocZone(alloc) == zone); - - CHECK(IsNurseryOwned(alloc) == nurseryOwned); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); WriteAllocData(alloc, actualSize); CHECK(CheckAllocData(alloc, actualSize)); - CHECK(!IsBufferAllocMarkedBlack(alloc)); + CHECK(!IsBufferAllocMarkedBlack(zone, alloc)); CHECK(cx->runtime()->gc.isPointerWithinBufferAlloc(alloc)); @@ -573,9 +577,8 @@ BEGIN_TEST(testBufferAllocator_realloc) { void* alloc = ReallocBuffer(zone, nullptr, requestSize, nurseryOwned); CHECK(alloc); CHECK(IsBufferAlloc(alloc)); - CHECK(!ChunkPtrIsInsideNursery(alloc)); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); - size_t actualSize = GetAllocSize(alloc); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); + size_t actualSize = GetAllocSize(zone, alloc); WriteAllocData(alloc, actualSize); holder->setBuffer(alloc); @@ -584,23 +587,23 @@ BEGIN_TEST(testBufferAllocator_realloc) { alloc = ReallocBuffer(zone, alloc, requestSize, nurseryOwned); CHECK(alloc); CHECK(alloc == prev); - CHECK(actualSize == GetAllocSize(alloc)); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); + CHECK(actualSize == GetAllocSize(zone, alloc)); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); CHECK(CheckAllocData(alloc, actualSize)); // Grow. size_t newSize = requestSize + requestSize / 2; alloc = ReallocBuffer(zone, alloc, newSize, nurseryOwned); CHECK(alloc); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); CHECK(CheckAllocData(alloc, actualSize)); // Shrink. newSize = newSize / 2; alloc = ReallocBuffer(zone, alloc, newSize, nurseryOwned); CHECK(alloc); - CHECK(IsNurseryOwned(alloc) == nurseryOwned); - actualSize = GetAllocSize(alloc); + CHECK(IsNurseryOwned(zone, alloc) == nurseryOwned); + actualSize = GetAllocSize(zone, alloc); CHECK(CheckAllocData(alloc, actualSize)); // Free. @@ -633,7 +636,6 @@ BEGIN_TEST(testBufferAllocator_predicatesOnOtherAllocs) { CHECK(!isMalloced); CHECK(cx->nursery().isInside(buffer)); CHECK(!IsBufferAlloc(buffer)); - CHECK(ChunkPtrIsInsideNursery(buffer)); RootedObject obj(cx, NewPlainObject(cx)); CHECK(obj); diff --git a/js/src/jsapi-tests/testJitABIcalls.cpp b/js/src/jsapi-tests/testJitABIcalls.cpp index aa576b52fa6..e0eb9991b8d 100644 --- a/js/src/jsapi-tests/testJitABIcalls.cpp +++ b/js/src/jsapi-tests/testJitABIcalls.cpp @@ -48,10 +48,10 @@ using namespace js::jit; // Convert the content of each macro list to a single and unique format which is // (Name, Type). -#define ABIFUN_TO_ALLFUN(Fun) (#Fun, decltype(&::Fun)) +#define ABIFUN_TO_ALLFUN(Fun) (#Fun, decltype(&Fun)) #define ABIFUN_AND_SIG_TO_ALLFUN(Fun, Sig) (#Fun " as " #Sig, Sig) #define ABISIG_TO_ALLFUN(Sig) ("(none) as " #Sig, Sig) -#define VMFUN_TO_ALLFUN(Name, Fun, Pop...) (#Fun, decltype(&::Fun)) +#define VMFUN_TO_ALLFUN(Name, Fun, Pop...) (#Fun, decltype(&Fun)) #define APPLY(A, B) A B diff --git a/js/src/make-source-package.py b/js/src/make-source-package.py index 82db8dd50c5..87342529123 100755 --- a/js/src/make-source-package.py +++ b/js/src/make-source-package.py @@ -112,6 +112,7 @@ print("") rsync_filter_list = """ # Top-level config and build files ++ /aclocal.m4 + /client.mk + /configure.py + /LICENSE @@ -382,6 +383,33 @@ def copy_cargo_toml(): f.write(content) +def generate_configure(): + """Generate configure files to avoid build dependency on autoconf-2.13""" + + src_old_configure_in_file = topsrc_dir / "js" / "src" / "old-configure.in" + dest_old_configure_file = target_dir / "js" / "src" / "old-configure" + + js_src_dir = topsrc_dir / "js" / "src" + + env = os.environ.copy() + env["M4"] = m4 + env["AWK"] = awk + env["AC_MACRODIR"] = topsrc_dir / "build" / "autoconf" + + with dest_old_configure_file.open("w") as f: + subprocess.run( + [ + "sh", + str(topsrc_dir / "build" / "autoconf" / "autoconf.sh"), + f"--localdir={js_src_dir}", + str(src_old_configure_in_file), + ], + stdout=f, + check=True, + env=env, + ) + + def copy_file(filename, content): """Copy an existing file from the staging area, or create a new file with the given contents if it does not exist.""" @@ -424,6 +452,7 @@ def stage(): create_target_dir() sync_files() copy_cargo_toml() + generate_configure() copy_file("INSTALL", INSTALL_CONTENT) copy_file("README", README_CONTENT) copy_file("mozconfig", MOZCONFIG_DEBUG_CONTENT) diff --git a/js/src/old-configure.in b/js/src/old-configure.in new file mode 100644 index 00000000000..f507cae34e1 --- /dev/null +++ b/js/src/old-configure.in @@ -0,0 +1,23 @@ +dnl -*- Mode: Autoconf; tab-width: 4; indent-tabs-mode: nil; -*- +dnl vi: set tabstop=4 shiftwidth=4 expandtab syntax=m4: +dnl This Source Code Form is subject to the terms of the Mozilla Public +dnl License, v. 2.0. If a copy of the MPL was not distributed with this +dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. + +dnl Process this file with autoconf to produce a configure script. +dnl ======================================================== +AC_PREREQ(2.13) +AC_INIT(js/src/jsapi.h) +AC_CONFIG_AUX_DIR(${srcdir}/build/autoconf) + +dnl ======================================================== +dnl = +dnl = Maintainer debug option (no --enable equivalent) +dnl = +dnl ======================================================== + +dnl Spit out some output +dnl ======================================================== +MOZ_CREATE_CONFIG_STATUS() + +rm -fr confdefs* $ac_clean_files diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js index 7a5eb5ea15a..3049d7c0cc1 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_links.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b const tzMapper = [ x => x, diff --git a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js index 87a6117d3de..266b0d983cf 100644 --- a/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js +++ b/js/src/tests/non262/Intl/DateTimeFormat/timeZone_version.js @@ -1,8 +1,8 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a -const tzdata = "2025a"; +// tzdata version = 2025b +const tzdata = "2025b"; if (typeof getICUOptions === "undefined") { var getICUOptions = SpecialPowers.Cu.getJSTestingFunctions().getICUOptions; diff --git a/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js b/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js index 1c3108f6519..f01a99f48e8 100644 --- a/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js +++ b/js/src/tests/non262/Intl/supportedValuesOf-timeZones-canonical.js @@ -1,7 +1,7 @@ // |reftest| skip-if(!this.hasOwnProperty("Intl")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b const zones = [ "Africa/Abidjan", "Africa/Accra", @@ -94,6 +94,7 @@ const zones = [ "America/Chihuahua", "America/Ciudad_Juarez", "America/Costa_Rica", + "America/Coyhaique", "America/Creston", "America/Cuiaba", "America/Curacao", diff --git a/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js b/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js index 4d9fb28ac6a..1c6cc39b534 100644 --- a/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js +++ b/js/src/tests/non262/Temporal/ZonedDateTime/zones-and-links.js @@ -1,7 +1,7 @@ // |reftest| shell-option(--enable-temporal) skip-if(!this.hasOwnProperty("Temporal")) // Generated by make_intl_data.py. DO NOT EDIT. -// tzdata version = 2025a +// tzdata version = 2025b const zones = [ "Africa/Abidjan", "Africa/Accra", @@ -94,6 +94,7 @@ const zones = [ "America/Chihuahua", "America/Ciudad_Juarez", "America/Costa_Rica", + "America/Coyhaique", "America/Creston", "America/Cuiaba", "America/Curacao", diff --git a/js/src/vm/ArrayBufferObject.cpp b/js/src/vm/ArrayBufferObject.cpp index 7c575cb5044..def0a55d386 100644 --- a/js/src/vm/ArrayBufferObject.cpp +++ b/js/src/vm/ArrayBufferObject.cpp @@ -685,6 +685,28 @@ bool ArrayBufferObject::resizeImpl(JSContext* cx, const CallArgs& args) { return false; } + if (obj->isWasm()) { + // Special case for resizing of Wasm buffers. + if (newByteLength % wasm::PageSize != 0) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_PAGE_MULTIPLE); + return false; + } + if (newByteLength < obj->byteLength()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_CANNOT_SHRINK); + return false; + } + + Pages newPages = Pages::fromByteLengthExact(newByteLength); + MOZ_RELEASE_ASSERT(WasmArrayBufferSourceMaxPages(obj).isSome()); + Rooted res( + cx, + obj->wasmGrowToPagesInPlace(obj->wasmAddressType(), newPages, obj, cx)); + MOZ_ASSERT_IF(res, res == obj); + return !!res; + } + // Steps 7-15. obj->resize(size_t(newByteLength)); @@ -1606,8 +1628,6 @@ ArrayBufferObject* ArrayBufferObject::wasmGrowToPagesInPlace( return nullptr; } - CheckStealPreconditions(oldBuf, cx); - MOZ_ASSERT(oldBuf->isWasm()); // Check that the new pages is within our allowable range. This will @@ -1619,6 +1639,25 @@ ArrayBufferObject* ArrayBufferObject::wasmGrowToPagesInPlace( MOZ_ASSERT(newPages <= wasm::MaxMemoryPages(t) && newPages.byteLength() <= ArrayBufferObject::ByteLengthLimit); + if (oldBuf->is()) { + RemoveCellMemory(oldBuf, oldBuf->byteLength(), + MemoryUse::ArrayBufferContents); + + if (!oldBuf->contents().wasmBuffer()->growToPagesInPlace(newPages)) { + // If fails, the buffer still exists on oldBuf, keep tracking + // cell memory there. + AddCellMemory(oldBuf, oldBuf->byteLength(), + MemoryUse::ArrayBufferContents); + return nullptr; + } + oldBuf->setByteLength(newPages.byteLength()); + AddCellMemory(oldBuf, newPages.byteLength(), + MemoryUse::ArrayBufferContents); + return oldBuf; + } + + CheckStealPreconditions(oldBuf, cx); + // We have checked against the clamped maximum and so we know we can convert // to byte lengths now. size_t newSize = newPages.byteLength(); @@ -1662,6 +1701,8 @@ ArrayBufferObject* ArrayBufferObject::wasmGrowToPagesInPlace( ArrayBufferObject* ArrayBufferObject::wasmMovingGrowToPages( AddressType t, Pages newPages, Handle oldBuf, JSContext* cx) { + MOZ_ASSERT(oldBuf->is()); + // On failure, do not throw and ensure that the original buffer is // unmodified and valid. if (oldBuf->isLengthPinned()) { @@ -2339,6 +2380,51 @@ ArrayBufferObject* ArrayBufferObject::createFromNewRawBuffer( return buffer; } +template +ArrayBufferType* ArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle donor) { + // Similar to NewResizableArrayBufferObject/NewArrayBufferObject + constexpr auto allocKind = + GetArrayBufferGCObjectKind(ArrayBufferType::RESERVED_SLOTS); + ArrayBufferType* buffer = + NewArrayBufferObject(cx, nullptr, allocKind); + if (!buffer) { + return nullptr; + } + + RemoveCellMemory(donor, donor->byteLength(), MemoryUse::ArrayBufferContents); + + MOZ_RELEASE_ASSERT(donor->isWasm()); + // The only flag allowed to be set on the `donor` is the resizable flag. + MOZ_RELEASE_ASSERT((donor->flags() & ~KIND_MASK & ~RESIZABLE) == 0); + BufferContents contents(donor->dataPointer(), WASM); + size_t byteLength = donor->byteLength(); + [[maybe_unused]] size_t maxByteLength = donor->wasmClampedMaxByteLength(); + + // Overwrite |oldBuf|'s data pointer *without* releasing old data. + donor->setDataPointer(BufferContents::createNoData()); + ArrayBufferObject::detach(cx, donor); + + if constexpr (std::is_same_v) { + buffer->initialize(byteLength, maxByteLength, contents); + } else { + static_assert( + std::is_same_v); + buffer->initialize(byteLength, contents); + } + + AddCellMemory(buffer, buffer->byteLength(), MemoryUse::ArrayBufferContents); + return buffer; +} + +template FixedLengthArrayBufferObject* +ArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle donor); + +template ResizableArrayBufferObject* +ArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle donor); + /* static */ uint8_t* ArrayBufferObject::stealMallocedContents( JSContext* cx, Handle buffer) { CheckStealPreconditions(buffer, cx); diff --git a/js/src/vm/ArrayBufferObject.h b/js/src/vm/ArrayBufferObject.h index dc1721fb562..c8b40a51f41 100644 --- a/js/src/vm/ArrayBufferObject.h +++ b/js/src/vm/ArrayBufferObject.h @@ -467,6 +467,13 @@ class ArrayBufferObject : public ArrayBufferObjectMaybeShared { WasmArrayRawBuffer* buffer, size_t initialSize); + // Create an ArrayBufferObject object (resizable or fixed-length) based + // on the existing donor object. The |buffer| will be removed from the + // latter, and its ownership will be assumed by the new object. + template + static ArrayBufferType* createFromWasmObject( + JSContext* cx, Handle donor); + static void copyData(ArrayBufferObject* toBuffer, size_t toIndex, ArrayBufferObject* fromBuffer, size_t fromIndex, size_t count); @@ -606,6 +613,11 @@ class ArrayBufferObject : public ArrayBufferObjectMaybeShared { */ inline size_t maxByteLength() const; + size_t wasmClampedMaxByteLength() const { + MOZ_ASSERT(isWasm()); + return wasmClampedMaxPages().byteLength(); + } + size_t associatedBytes() const; uint32_t flags() const; diff --git a/js/src/vm/JSObject.cpp b/js/src/vm/JSObject.cpp index f3713a1ef89..f2728728d0c 100644 --- a/js/src/vm/JSObject.cpp +++ b/js/src/vm/JSObject.cpp @@ -1085,14 +1085,18 @@ bool NativeObject::fixupAfterSwap(JSContext* cx, Handle obj, obj->initSlotUnchecked(i, slotValues[i]); } - MOZ_ASSERT_IF( - obj->hasDynamicSlots() && gc::IsBufferAlloc(obj->getSlotsHeader()), - gc::IsNurseryOwned(obj->getSlotsHeader()) == IsInsideNursery(obj)); - - MOZ_ASSERT_IF(obj->hasDynamicElements() && - gc::IsBufferAlloc(obj->getUnshiftedElementsHeader()), - gc::IsNurseryOwned(obj->getUnshiftedElementsHeader()) == - IsInsideNursery(obj)); +#ifdef DEBUG + Zone* zone = obj->zone(); + if (obj->hasDynamicSlots() && gc::IsBufferAlloc(obj->getSlotsHeader())) { + MOZ_ASSERT(gc::IsNurseryOwned(zone, obj->getSlotsHeader()) == + IsInsideNursery(obj)); + } + if (obj->hasDynamicElements() && + gc::IsBufferAlloc(obj->getUnshiftedElementsHeader())) { + MOZ_ASSERT(gc::IsNurseryOwned(zone, obj->getUnshiftedElementsHeader()) == + IsInsideNursery(obj)); + } +#endif return true; } @@ -3193,13 +3197,13 @@ void JSObject::addSizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf, // TODO: These will eventually count as GC heap memory. if (is() && as().hasDynamicSlots()) { info->objectsMallocHeapSlots += - gc::GetAllocSize(as().getSlotsHeader()); + gc::GetAllocSize(zone(), as().getSlotsHeader()); } if (is() && as().hasDynamicElements()) { void* allocatedElements = as().getUnshiftedElementsHeader(); info->objectsMallocHeapElementsNormal += - gc::GetAllocSize(allocatedElements); + gc::GetAllocSize(zone(), allocatedElements); } // Other things may be measured in the future if DMD indicates it is diff --git a/js/src/vm/NativeObject.cpp b/js/src/vm/NativeObject.cpp index 022aacd85dc..33b0beff6b3 100644 --- a/js/src/vm/NativeObject.cpp +++ b/js/src/vm/NativeObject.cpp @@ -854,13 +854,10 @@ bool NativeObject::goodElementsAllocationAmount(JSContext* cx, // We will allocate these in large buffers so account for the header size // required there. static_assert(sizeof(Value) * Mebi >= gc::ChunkSize); - const size_t BufferHeaderCount = gc::LargeBufferHeaderSize / sizeof(Value); - reqAllocated += BufferHeaderCount; // Pick the first bucket that'll fit |reqAllocated|. for (uint32_t b : BigBuckets) { if (b >= reqAllocated) { - b -= BufferHeaderCount; MOZ_ASSERT(b == gc::GetGoodElementCount(b, sizeof(Value))); *goodAmount = b; return true; @@ -868,7 +865,7 @@ bool NativeObject::goodElementsAllocationAmount(JSContext* cx, } // Otherwise, return the maximum bucket size. - *goodAmount = MAX_DENSE_ELEMENTS_ALLOCATION - BufferHeaderCount; + *goodAmount = MAX_DENSE_ELEMENTS_ALLOCATION; return true; } diff --git a/js/src/vm/NativeObject.h b/js/src/vm/NativeObject.h index 6f88347a638..27006dc0a2a 100644 --- a/js/src/vm/NativeObject.h +++ b/js/src/vm/NativeObject.h @@ -1388,8 +1388,7 @@ class NativeObject : public JSObject { // The maximum number of usable dense elements in an object. static const uint32_t MAX_DENSE_ELEMENTS_COUNT = - MAX_DENSE_ELEMENTS_ALLOCATION - ObjectElements::VALUES_PER_HEADER - - gc::LargeBufferHeaderSize / sizeof(Value); + MAX_DENSE_ELEMENTS_ALLOCATION - ObjectElements::VALUES_PER_HEADER; static void elementsSizeMustNotOverflow() { static_assert( diff --git a/js/src/vm/SharedArrayObject.cpp b/js/src/vm/SharedArrayObject.cpp index c53ed78efb6..8b010fb595a 100644 --- a/js/src/vm/SharedArrayObject.cpp +++ b/js/src/vm/SharedArrayObject.cpp @@ -273,8 +273,9 @@ void SharedArrayRawBuffer::dropReference() { } } -bool SharedArrayRawBuffer::grow(size_t newByteLength) { - MOZ_RELEASE_ASSERT(isGrowable()); +bool SharedArrayRawBuffer::growJS(size_t newByteLength) { + MOZ_ASSERT(!isWasm()); + MOZ_RELEASE_ASSERT(isGrowableJS()); // The caller is responsible to ensure |newByteLength| doesn't exceed the // maximum allowed byte length. @@ -386,7 +387,31 @@ bool SharedArrayBufferObject::growImpl(JSContext* cx, const CallArgs& args) { JSMSG_ARRAYBUFFER_LENGTH_LARGER_THAN_MAXIMUM); return false; } - if (!buffer->rawBufferObject()->grow(newByteLength)) { + + if (buffer->isWasm()) { + // Special case for resizing of Wasm buffers. + if (newByteLength % wasm::PageSize != 0) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_PAGE_MULTIPLE); + return false; + } + + mozilla::Maybe lock( + mozilla::Some(buffer->rawWasmBufferObject())); + + if (newByteLength < buffer->rawWasmBufferObject()->volatileByteLength()) { + lock.reset(); + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_ARRAYBUFFER_CANNOT_SHRINK); + return false; + } + + Pages newPages = Pages::fromByteLengthExact(newByteLength); + return buffer->rawWasmBufferObject()->wasmGrowToPagesInPlace( + *lock, buffer->wasmAddressType(), newPages); + } + + if (!buffer->rawBufferObject()->growJS(newByteLength)) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_LENGTH_SMALLER_THAN_CURRENT); return false; @@ -546,11 +571,13 @@ SharedArrayBufferType* SharedArrayBufferObject::NewWith( FixedLengthSharedArrayBufferObject> || std::is_same_v); - if constexpr (std::is_same_v) { - MOZ_ASSERT(!buffer->isGrowable()); - } else { - MOZ_ASSERT(buffer->isGrowable()); + if (!buffer->isWasm()) { + if constexpr (std::is_same_v) { + MOZ_ASSERT(!buffer->isGrowableJS()); + } else { + MOZ_ASSERT(buffer->isGrowableJS()); + } } AutoSetNewObjectMetadata metadata(cx); @@ -684,6 +711,46 @@ SharedArrayBufferObject* SharedArrayBufferObject::createFromNewRawBuffer( return obj; } +template +SharedArrayBufferType* SharedArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle wasmBuffer) { + MOZ_ASSERT(cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled()); + MOZ_ASSERT(wasmBuffer->isWasm()); + + SharedArrayRawBuffer* rawBuffer = wasmBuffer->rawBufferObject(); + size_t byteLengthOrMaximum; + if constexpr (std::is_same_v) { + byteLengthOrMaximum = rawBuffer->toWasmBuffer()->wasmClampedMaxByteLength(); + } else { + static_assert(std::is_same_v); + byteLengthOrMaximum = rawBuffer->volatileByteLength(); + } + + if (!rawBuffer->addReference()) { + JS_ReportErrorASCII(cx, "Reference count overflow on SharedArrayBuffer"); + return nullptr; + } + + SharedArrayBufferType* obj = NewWith( + cx, rawBuffer, byteLengthOrMaximum, nullptr); + if (!obj) { + rawBuffer->dropReference(); + return nullptr; + } + + return obj; +} + +template FixedLengthSharedArrayBufferObject* SharedArrayBufferObject:: + createFromWasmObject( + JSContext* cx, Handle wasmBuffer); + +template GrowableSharedArrayBufferObject* +SharedArrayBufferObject::createFromWasmObject( + JSContext* cx, Handle wasmBuffer); + /* static */ void SharedArrayBufferObject::wasmDiscard(Handle buf, uint64_t byteOffset, diff --git a/js/src/vm/SharedArrayObject.h b/js/src/vm/SharedArrayObject.h index 035c6d5edc9..c78f0f1ec26 100644 --- a/js/src/vm/SharedArrayObject.h +++ b/js/src/vm/SharedArrayObject.h @@ -56,8 +56,10 @@ class SharedArrayRawBuffer { // Whether this is a WasmSharedArrayRawBuffer. bool isWasm_; - // Whether this is a growable non-Wasm buffer. - bool isGrowable_; + // Whether this is a growable non-Wasm buffer. All wasm raw buffers are + // growable, but must be grown through a wasm instruction or by getting + // a GSAB object through wasmMemoryObj.toResizableBuffer(). + bool isGrowableJS_; mozilla::Atomic refcount_; mozilla::Atomic length_; @@ -67,15 +69,18 @@ class SharedArrayRawBuffer { FutexWaiter* waiters_ = nullptr; protected: - SharedArrayRawBuffer(bool isGrowable, uint8_t* buffer, size_t length) - : isWasm_(false), isGrowable_(isGrowable), refcount_(1), length_(length) { + SharedArrayRawBuffer(bool isGrowableJS, uint8_t* buffer, size_t length) + : isWasm_(false), + isGrowableJS_(isGrowableJS), + refcount_(1), + length_(length) { MOZ_ASSERT(buffer == dataPointerShared()); } enum class WasmBuffer {}; SharedArrayRawBuffer(WasmBuffer, uint8_t* buffer, size_t length) - : isWasm_(true), isGrowable_(false), refcount_(1), length_(length) { + : isWasm_(true), isGrowableJS_(false), refcount_(1), length_(length) { MOZ_ASSERT(buffer == dataPointerShared()); } @@ -99,7 +104,7 @@ class SharedArrayRawBuffer { bool isWasm() const { return isWasm_; } - bool isGrowable() const { return isGrowable_; } + bool isGrowableJS() const { return isGrowableJS_; } uint32_t refcount() const { return refcount_; } @@ -114,7 +119,7 @@ class SharedArrayRawBuffer { // space. The caller is responsible to ensure that the buffer has been // allocated with enough space to hold at least |newByteLength| bytes. IOW // this method merely sets the number of user accessible bytes of this buffer. - bool grow(size_t newByteLength); + bool growJS(size_t newByteLength); static size_t offsetOfByteLength() { return offsetof(SharedArrayRawBuffer, length_); @@ -192,6 +197,11 @@ class WasmSharedArrayRawBuffer : public SharedArrayRawBuffer { size_t mappedSize() const { return mappedSize_; } + size_t wasmClampedMaxByteLength() const { + MOZ_ASSERT(isWasm()); + return wasmClampedMaxPages().byteLength(); + } + bool wasmGrowToPagesInPlace(const Lock&, wasm::AddressType t, wasm::Pages newPages); @@ -363,9 +373,13 @@ class SharedArrayBufferObject : public ArrayBufferObjectMaybeShared { return byteLengthOrMaxByteLength(); } + wasm::AddressType wasmAddressType() const { + return rawWasmBufferObject()->wasmAddressType(); + } + bool isWasm() const { return rawBufferObject()->isWasm(); } - bool isGrowable() const { return rawBufferObject()->isGrowable(); } + bool isGrowable() const { return is(); } SharedMem dataPointerShared() const { return rawBufferObject()->dataPointerShared(); @@ -383,6 +397,12 @@ class SharedArrayBufferObject : public ArrayBufferObjectMaybeShared { static SharedArrayBufferObject* createFromNewRawBuffer( JSContext* cx, WasmSharedArrayRawBuffer* buffer, size_t initialSize); + // Create an SharedArrayBufferObject object (growable or fixed-length), + // using the same buffer as in the wasmBuffer object. + template + static SharedArrayBufferType* createFromWasmObject( + JSContext* cx, Handle wasmBuffer); + wasm::Pages volatileWasmPages() const { return rawWasmBufferObject()->volatileWasmPages(); } diff --git a/js/src/vm/StructuredClone.cpp b/js/src/vm/StructuredClone.cpp index d3d6fedd40a..b690d0a98e4 100644 --- a/js/src/vm/StructuredClone.cpp +++ b/js/src/vm/StructuredClone.cpp @@ -2915,7 +2915,7 @@ bool JSStructuredCloneReader::readSharedArrayBuffer(StructuredDataType type, bool isGrowable = type == SCTAG_GROWABLE_SHARED_ARRAY_BUFFER_OBJECT; SharedArrayRawBuffer* rawbuf = reinterpret_cast(p); - MOZ_RELEASE_ASSERT(isGrowable == rawbuf->isGrowable()); + MOZ_RELEASE_ASSERT(rawbuf->isWasm() || isGrowable == rawbuf->isGrowableJS()); // There's no guarantee that the receiving agent has enabled shared memory // even if the transmitting agent has done so. Ideally we'd check at the diff --git a/js/src/wasm/WasmJS.cpp b/js/src/wasm/WasmJS.cpp index f2495f6dec9..7a8dce722f7 100644 --- a/js/src/wasm/WasmJS.cpp +++ b/js/src/wasm/WasmJS.cpp @@ -2185,35 +2185,57 @@ static bool IsMemory(HandleValue v) { } /* static */ -bool WasmMemoryObject::bufferGetterImpl(JSContext* cx, const CallArgs& args) { - Rooted memoryObj( - cx, &args.thisv().toObject().as()); - Rooted buffer(cx, &memoryObj->buffer()); - +ArrayBufferObjectMaybeShared* WasmMemoryObject::refreshBuffer( + JSContext* cx, Handle memoryObj, + Handle buffer) { if (memoryObj->isShared()) { size_t memoryLength = memoryObj->volatileMemoryLength(); - MOZ_ASSERT(memoryLength >= buffer->byteLength()); + MOZ_ASSERT_IF(!buffer->is(), + memoryLength >= buffer->byteLength()); - if (memoryLength > buffer->byteLength()) { + // The `length` field on a fixed length SAB cannot change even if + // the underlying memory has grown. The spec therefore requires that + // accessing the buffer property will create a new fixed length SAB + // with the current length if the underlying raw buffer's length has + // changed. We don't need to do this for growable SAB. + if (!buffer->is() && + memoryLength > buffer->byteLength()) { Rooted newBuffer( cx, SharedArrayBufferObject::New( cx, memoryObj->sharedArrayRawBuffer(), memoryLength)); + MOZ_ASSERT(newBuffer->is()); if (!newBuffer) { - return false; + return nullptr; } // OK to addReference after we try to allocate because the memoryObj // keeps the rawBuffer alive. if (!memoryObj->sharedArrayRawBuffer()->addReference()) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_SC_SAB_REFCNT_OFLO); - return false; + return nullptr; } - buffer = newBuffer; memoryObj->setReservedSlot(BUFFER_SLOT, ObjectValue(*newBuffer)); + return newBuffer; } } + return buffer; +} - args.rval().setObject(*buffer); +/* static */ +bool WasmMemoryObject::bufferGetterImpl(JSContext* cx, const CallArgs& args) { + Rooted memoryObj( + cx, &args.thisv().toObject().as()); + + Rooted buffer(cx, &memoryObj->buffer()); + MOZ_RELEASE_ASSERT(buffer->isWasm() && !buffer->isPreparedForAsmJS()); + + ArrayBufferObjectMaybeShared* refreshedBuffer = + WasmMemoryObject::refreshBuffer(cx, memoryObj, buffer); + if (!refreshedBuffer) { + return false; + } + + args.rval().setObject(*refreshedBuffer); return true; } @@ -2311,11 +2333,110 @@ bool WasmMemoryObject::discard(JSContext* cx, unsigned argc, Value* vp) { return CallNonGenericMethod(cx, args); } +#ifdef ENABLE_WASM_RESIZABLE_ARRAYBUFFER +/* static */ +bool WasmMemoryObject::toFixedLengthBufferImpl(JSContext* cx, + const CallArgs& args) { + Rooted memory( + cx, &args.thisv().toObject().as()); + + Rooted buffer(cx, &memory->buffer()); + MOZ_RELEASE_ASSERT(buffer->isWasm() && !buffer->isPreparedForAsmJS()); + // If IsFixedLengthArrayBuffer(buffer) is true, return buffer. + if (!buffer->isResizable()) { + ArrayBufferObjectMaybeShared* refreshedBuffer = + refreshBuffer(cx, memory, buffer); + args.rval().set(ObjectValue(*refreshedBuffer)); + return true; + } + + Rooted fixedBuffer(cx); + if (memory->isShared()) { + Rooted oldBuffer( + cx, &buffer->as()); + fixedBuffer.set(SharedArrayBufferObject::createFromWasmObject< + FixedLengthSharedArrayBufferObject>(cx, oldBuffer)); + } else { + Rooted oldBuffer(cx, &buffer->as()); + fixedBuffer.set( + ArrayBufferObject::createFromWasmObject( + cx, oldBuffer)); + } + + if (!fixedBuffer) { + return false; + } + memory->setReservedSlot(BUFFER_SLOT, ObjectValue(*fixedBuffer)); + args.rval().set(ObjectValue(*fixedBuffer)); + return true; +} + +/* static */ +bool WasmMemoryObject::toFixedLengthBuffer(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + return CallNonGenericMethod(cx, args); +} + +/* static */ +bool WasmMemoryObject::toResizableBufferImpl(JSContext* cx, + const CallArgs& args) { + Rooted memory( + cx, &args.thisv().toObject().as()); + + Rooted buffer(cx, &memory->buffer()); + // If IsFixedLengthArrayBuffer(buffer) is false, return buffer. + if (buffer->isResizable()) { + args.rval().set(ObjectValue(*buffer)); + return true; + } + + if (buffer->wasmSourceMaxPages().isNothing()) { + JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, + JSMSG_WASM_MEMORY_NOT_RESIZABLE); + return false; + } + + Rooted resizableBuffer(cx); + if (memory->isShared()) { + Rooted oldBuffer( + cx, &buffer->as()); + resizableBuffer.set(SharedArrayBufferObject::createFromWasmObject< + GrowableSharedArrayBufferObject>(cx, oldBuffer)); + } else { + Rooted oldBuffer(cx, &buffer->as()); + resizableBuffer.set( + ArrayBufferObject::createFromWasmObject( + cx, oldBuffer)); + } + + if (!resizableBuffer) { + return false; + } + memory->setReservedSlot(BUFFER_SLOT, ObjectValue(*resizableBuffer)); + args.rval().set(ObjectValue(*resizableBuffer)); + return true; +} + +/* static */ +bool WasmMemoryObject::toResizableBuffer(JSContext* cx, unsigned argc, + Value* vp) { + CallArgs args = CallArgsFromVp(argc, vp); + return CallNonGenericMethod(cx, args); +} +#endif // ENABLE_WASM_RESIZABLE_ARRAYBUFFER + const JSFunctionSpec WasmMemoryObject::methods[] = { #ifdef ENABLE_WASM_TYPE_REFLECTIONS JS_FN("type", WasmMemoryObject::type, 0, JSPROP_ENUMERATE), #endif JS_FN("grow", WasmMemoryObject::grow, 1, JSPROP_ENUMERATE), +#ifdef ENABLE_WASM_RESIZABLE_ARRAYBUFFER + JS_FN("toFixedLengthBuffer", WasmMemoryObject::toFixedLengthBuffer, 0, + JSPROP_ENUMERATE), + JS_FN("toResizableBuffer", WasmMemoryObject::toResizableBuffer, 0, + JSPROP_ENUMERATE), +#endif JS_FS_END, }; diff --git a/js/src/wasm/WasmJS.h b/js/src/wasm/WasmJS.h index f4f4d04e484..3bcdb92713f 100644 --- a/js/src/wasm/WasmJS.h +++ b/js/src/wasm/WasmJS.h @@ -258,6 +258,10 @@ class WasmMemoryObject : public NativeObject { static bool discardImpl(JSContext* cx, const CallArgs& args); static bool discard(JSContext* cx, unsigned argc, Value* vp); static uint64_t growShared(Handle memory, uint64_t delta); + static bool toFixedLengthBufferImpl(JSContext* cx, const CallArgs& args); + static bool toFixedLengthBuffer(JSContext* cx, unsigned argc, Value* vp); + static bool toResizableBufferImpl(JSContext* cx, const CallArgs& args); + static bool toResizableBuffer(JSContext* cx, unsigned argc, Value* vp); using InstanceSet = JS::WeakCache, @@ -266,6 +270,13 @@ class WasmMemoryObject : public NativeObject { InstanceSet& observers() const; InstanceSet* getOrCreateObservers(JSContext* cx); + // The spec requires that the buffer property will create a new fixed length + // SAB if the underlying raw buffer's length has changed. The method creates + // new objects and updates the BUFFER_SLOT slot. + static ArrayBufferObjectMaybeShared* refreshBuffer( + JSContext* cx, Handle memoryObj, + Handle buffer); + public: static const unsigned RESERVED_SLOTS = 3; static const JSClass class_; diff --git a/js/sub.configure b/js/sub.configure new file mode 100644 index 00000000000..a331a9356bf --- /dev/null +++ b/js/sub.configure @@ -0,0 +1,89 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +@depends(build_environment) +@imports("logging") +@imports(_from="__builtin__", _import="object") +@imports(_from="mozbuild.configure.util", _import="ConfigureOutputHandler") +def old_js_configure(build_env): + class PrefixOutput(object): + def __init__(self, prefix, fh): + self._fh = fh + self._begin_line = True + self._prefix = prefix + + def write(self, content): + if self._begin_line: + self._fh.write(self._prefix) + self._fh.write(("\n" + self._prefix).join(content.splitlines())) + self._begin_line = content.endswith("\n") + if self._begin_line: + self._fh.write("\n") + + def flush(self): + self._fh.flush() + + logger = logging.getLogger("moz.configure") + formatter = logging.Formatter("js/src> %(levelname)s: %(message)s") + for handler in logger.handlers: + handler.setFormatter(formatter) + if isinstance(handler, ConfigureOutputHandler): + handler._stdout = PrefixOutput("js/src> ", handler._stdout) + return os.path.join(build_env.topsrcdir, "js", "src", "old-configure") + + +@depends(old_configure.substs, mozconfig) +def old_js_configure_env(substs, mozconfig): + substs = dict(substs) + # Here, we mimic what we used to do from old-configure, which makes this + # all awkward. + + # Variables that were explicitly exported from old-configure, and those + # explicitly set in the environment when invoking old-configure, were + # automatically inherited from subconfigure. We assume the relevant ones + # have a corresponding AC_SUBST in old-configure, making them available + # in `substs`. + extra_env = {} + + for var in ( + "MOZ_DEV_EDITION", + "STLPORT_LIBS", + ): + if var in substs: + value = substs[var] + elif ( + mozconfig + and var in mozconfig + and not mozconfig[var][1].startswith("removed") + ): + value = mozconfig[var][0] + else: + continue + if isinstance(value, list): + value = " ".join(value) + extra_env[var] = value + + return extra_env + + +old_js_configure = old_configure_for(old_js_configure, extra_env=old_js_configure_env) +set_config("OLD_JS_CONFIGURE_SUBSTS", old_js_configure.substs) +set_config("OLD_JS_CONFIGURE_DEFINES", old_js_configure.defines) + + +@dependable +@imports("logging") +@imports(_from="mozbuild.configure.util", _import="ConfigureOutputHandler") +def post_old_js_configure(): + # Restore unprefixed logging. + formatter = logging.Formatter("%(levelname)s: %(message)s") + logger = logging.getLogger("moz.configure") + for handler in logger.handlers: + handler.setFormatter(formatter) + if isinstance(handler, ConfigureOutputHandler): + handler._stdout.flush() + handler._stdout = handler._stdout._fh diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp index c3116954a13..fa10d805707 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp @@ -2249,9 +2249,6 @@ void PresShell::NotifyDestroyingFrame(nsIFrame* aFrame) { } } - EventStateManager* const esm = mPresContext->EventStateManager(); - esm->NotifyDestroyingFrameForGesture(aFrame); - mFramesToDirty.Remove(aFrame); if (ScrollContainerFrame* scrollContainerFrame = do_QueryFrame(aFrame)) { @@ -4452,7 +4449,8 @@ void PresShell::NotifyFontFaceSetOnRefresh() { void PresShell::DoFlushPendingNotifications(FlushType aType) { // by default, flush animations if aType >= FlushType::Style - mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style); + mozilla::ChangesToFlush flush(aType, aType >= FlushType::Style, + aType >= FlushType::Layout); FlushPendingNotifications(flush); } @@ -4502,10 +4500,10 @@ void PresShell::DoFlushPendingNotifications(mozilla::ChangesToFlush aFlush) { */ FlushType flushType = aFlush.mFlushType; - // If this is a layout flush, first update the relevancy of any content - // of elements with `content-visibility: auto` so that the values - // returned from script queries are up-to-date. - if (flushType >= mozilla::FlushType::Layout) { + if (aFlush.mUpdateRelevancy) { + // If needed, first update the relevancy of any content of elements with + // `content-visibility: auto` so that the values returned from e.g. script + // queries are up-to-date. UpdateRelevancyOfContentVisibilityAutoFrames(); } @@ -9868,8 +9866,9 @@ void PresShell::WillPaint() { // reflow being interspersed. Note that we _do_ allow this to be // interruptible; if we can't do all the reflows it's better to flicker a bit // than to freeze up. - FlushPendingNotifications( - ChangesToFlush(FlushType::InterruptibleLayout, false)); + FlushPendingNotifications(ChangesToFlush(FlushType::InterruptibleLayout, + /* aFlushAnimations = */ false, + /* aUpdateRelevancy = */ false)); } void PresShell::DidPaintWindow() { @@ -12578,13 +12577,15 @@ PresShell::ProximityToViewportResult PresShell::DetermineProximityToViewport() { DOMIntersectionObserver::IsForProximityToViewport::Yes) .Intersects(); element->SetVisibleForContentVisibility(intersects); - if (oldVisibility.isNothing() || *oldVisibility != intersects) { - frame->UpdateIsRelevantContent(ContentRelevancyReason::Visible); - } // 14.2.3.3 if (checkForInitialDetermination && intersects) { + // Initial determination happens sync, otherwise on the next rendering + // opportunity. + frame->UpdateIsRelevantContent(ContentRelevancyReason::Visible); result.mHadInitialDetermination = true; + } else if (oldVisibility.isNothing() || *oldVisibility != intersects) { + ScheduleContentRelevancyUpdate(ContentRelevancyReason::Visible); } } if (nsPresContext* presContext = GetPresContext()) { diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 4671a4ad5fd..e7a4042a44a 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -3233,10 +3233,6 @@ void RestyleManager::DoProcessPendingRestyles(ServoTraversalFlags aFlags) { ServoStyleSet* styleSet = StyleSet(); Document* doc = presContext->Document(); - // Ensure the refresh driver is active during traversal to avoid mutating - // mActiveTimer and mMostRecentRefresh time. - presContext->RefreshDriver()->MostRecentRefresh(); - if (!doc->GetServoRestyleRoot()) { // This might post new restyles, so need to do it here. Don't do it if we're // already going to restyle tho, so that we don't potentially reflow with diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index abb53daf833..e27a1442615 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3967,18 +3967,6 @@ nsBlockFrame* nsLayoutUtils::FindNearestBlockAncestor(nsIFrame* aFrame) { return nullptr; } -nsIFrame* nsLayoutUtils::GetNonGeneratedAncestor(nsIFrame* aFrame) { - if (!aFrame->HasAnyStateBits(NS_FRAME_GENERATED_CONTENT)) { - return aFrame; - } - - nsIFrame* f = aFrame; - do { - f = GetParentOrPlaceholderFor(f); - } while (f->HasAnyStateBits(NS_FRAME_GENERATED_CONTENT)); - return f; -} - nsIFrame* nsLayoutUtils::GetParentOrPlaceholderFor(const nsIFrame* aFrame) { // This condition must match the condition in FindContainingBlocks in // RetainedDisplayListBuider.cpp, MarkFrameForDisplayIfVisible and diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h index 9e439c8a604..99b09843bb8 100644 --- a/layout/base/nsLayoutUtils.h +++ b/layout/base/nsLayoutUtils.h @@ -1392,12 +1392,6 @@ class nsLayoutUtils { */ static nsBlockFrame* FindNearestBlockAncestor(nsIFrame* aFrame); - /** - * Find the nearest ancestor that's not for generated content. Will return - * aFrame if aFrame is not for generated content. - */ - static nsIFrame* GetNonGeneratedAncestor(nsIFrame* aFrame); - /* * Whether the frame is an nsBlockFrame which is not a wrapper block. */ diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index 21a435ca988..4971bb4ecc2 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -2824,8 +2824,7 @@ void nsPresContext::NotifyContentfulPaint() { "We should only notify contentful paint during refresh " "driver ticks"); if (!perf->HadFCPTimingEntry()) { - TimeStamp nowTime = rootPresContext->RefreshDriver()->MostRecentRefresh( - /* aEnsureTimerStarted */ false); + TimeStamp nowTime = rootPresContext->RefreshDriver()->MostRecentRefresh(); MOZ_ASSERT(!nowTime.IsNull(), "Most recent refresh timestamp should exist since we are in " "a refresh driver tick"); diff --git a/layout/base/nsRefreshDriver.cpp b/layout/base/nsRefreshDriver.cpp index 34f081300c1..3237b9c0d90 100644 --- a/layout/base/nsRefreshDriver.cpp +++ b/layout/base/nsRefreshDriver.cpp @@ -1497,16 +1497,6 @@ void nsRefreshDriver::RestoreNormalRefresh() { mPendingTransactions.Clear(); } -TimeStamp nsRefreshDriver::MostRecentRefresh(bool aEnsureTimerStarted) const { - // In case of stylo traversal, we have already activated the refresh driver in - // RestyleManager::ProcessPendingRestyles(). - if (aEnsureTimerStarted && !ServoStyleSet::IsInServoTraversal()) { - const_cast(this)->EnsureTimerStarted(); - } - - return mMostRecentRefresh; -} - void nsRefreshDriver::AddRefreshObserver(nsARefreshObserver* aObserver, FlushType aFlushType, const char* aObserverDescription) { diff --git a/layout/base/nsRefreshDriver.h b/layout/base/nsRefreshDriver.h index fcc2d45cc42..da908814568 100644 --- a/layout/base/nsRefreshDriver.h +++ b/layout/base/nsRefreshDriver.h @@ -79,7 +79,7 @@ class nsRefreshDriver final : public mozilla::layers::TransactionIdAllocator, * ensure that multiple animations started during the same event off * the main event loop have the same start time.) */ - mozilla::TimeStamp MostRecentRefresh(bool aEnsureTimerStarted = true) const; + mozilla::TimeStamp MostRecentRefresh() const { return mMostRecentRefresh; } /** * Add / remove refresh observers. diff --git a/layout/generic/ReflowInput.h b/layout/generic/ReflowInput.h index a1552aa64fe..47fdd28c7e4 100644 --- a/layout/generic/ReflowInput.h +++ b/layout/generic/ReflowInput.h @@ -533,13 +533,7 @@ struct ReflowInput : public SizeComputationInput { // is from the top of the frame tree. int16_t mReflowDepth = 0; - // Logical and physical accessors for the resize flags. - bool IsHResize() const { - return mWritingMode.IsVertical() ? mFlags.mIsBResize : mFlags.mIsIResize; - } - bool IsVResize() const { - return mWritingMode.IsVertical() ? mFlags.mIsIResize : mFlags.mIsBResize; - } + // Accessors for the resize flags. bool IsIResize() const { return mFlags.mIsIResize; } bool IsBResize() const { return mFlags.mIsBResize; } bool IsBResizeForWM(WritingMode aWM) const { @@ -553,20 +547,6 @@ struct ReflowInput : public SizeComputationInput { return !aWM.IsOrthogonalTo(mWritingMode) ? mFlags.mIsBResizeForPercentages : IsIResize(); } - void SetHResize(bool aValue) { - if (mWritingMode.IsVertical()) { - mFlags.mIsBResize = aValue; - } else { - mFlags.mIsIResize = aValue; - } - } - void SetVResize(bool aValue) { - if (mWritingMode.IsVertical()) { - mFlags.mIsIResize = aValue; - } else { - mFlags.mIsBResize = aValue; - } - } void SetIResize(bool aValue) { mFlags.mIsIResize = aValue; } void SetBResize(bool aValue) { mFlags.mIsBResize = aValue; } void SetBResizeForPercentages(bool aValue) { diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp index 31d7c381a25..09122b069e7 100644 --- a/layout/generic/nsIFrame.cpp +++ b/layout/generic/nsIFrame.cpp @@ -1060,12 +1060,6 @@ void nsIFrame::RemoveDisplayItemDataForDeletion() { delete userDataTable; } - if (!nsLayoutUtils::AreRetainedDisplayListsEnabled()) { - // Retained display lists are disabled, no need to update - // RetainedDisplayListData. - return; - } - auto* builder = nsLayoutUtils::GetRetainedDisplayListBuilder(this); if (!builder) { MOZ_ASSERT(DisplayItems().IsEmpty()); diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 613443dd081..f07144f2e4d 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -8402,15 +8402,61 @@ std::pair nsTextFrame::GetOffsets() const { return std::make_pair(GetContentOffset(), GetContentEnd()); } -static int32_t FindEndOfPunctuationRun(const nsTextFragment* aFrag, - const gfxTextRun* aTextRun, - gfxSkipCharsIterator* aIter, - int32_t aOffset, int32_t aStart, - int32_t aEnd) { - int32_t i; +static bool IsFirstLetterPrefixPunctuation(uint32_t aChar) { + switch (mozilla::unicode::GetGeneralCategory(aChar)) { + case HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: /* Pc */ + case HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION: /* Pd */ + case HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: /* Pe */ + case HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: /* Pf */ + case HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: /* Pi */ + case HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: /* Po */ + case HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION: /* Ps */ + return true; + default: + return false; + } +} +static bool IsFirstLetterSuffixPunctuation(uint32_t aChar) { + switch (mozilla::unicode::GetGeneralCategory(aChar)) { + case HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION: /* Pc */ + case HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION: /* Pe */ + case HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION: /* Pf */ + case HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION: /* Pi */ + case HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION: /* Po */ + return true; + default: + return false; + } +} + +static int32_t FindEndOfPrefixPunctuationRun(const nsTextFragment* aFrag, + const gfxTextRun* aTextRun, + gfxSkipCharsIterator* aIter, + int32_t aOffset, int32_t aStart, + int32_t aEnd) { + int32_t i; for (i = aStart; i < aEnd - aOffset; ++i) { - if (nsContentUtils::IsFirstLetterPunctuation( + if (IsFirstLetterPrefixPunctuation( + aFrag->ScalarValueAt(AssertedCast(aOffset + i)))) { + aIter->SetOriginalOffset(aOffset + i); + FindClusterEnd(aTextRun, aEnd, aIter); + i = aIter->GetOriginalOffset() - aOffset; + } else { + break; + } + } + return i; +} + +static int32_t FindEndOfSuffixPunctuationRun(const nsTextFragment* aFrag, + const gfxTextRun* aTextRun, + gfxSkipCharsIterator* aIter, + int32_t aOffset, int32_t aStart, + int32_t aEnd) { + int32_t i; + for (i = aStart; i < aEnd - aOffset; ++i) { + if (IsFirstLetterSuffixPunctuation( aFrag->ScalarValueAt(AssertedCast(aOffset + i)))) { aIter->SetOriginalOffset(aOffset + i); FindClusterEnd(aTextRun, aEnd, aIter); @@ -8440,7 +8486,6 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, const gfxTextRun* aTextRun, int32_t aOffset, const gfxSkipCharsIterator& aIter, int32_t* aLength) { - int32_t i; int32_t length = *aLength; int32_t endOffset = aOffset + length; gfxSkipCharsIterator iter(aIter); @@ -8464,25 +8509,39 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, return false; }; - // skip leading whitespace, then consume clusters that start with punctuation - i = FindEndOfPunctuationRun( - aFrag, aTextRun, &iter, aOffset, - GetTrimmableWhitespaceCount(aFrag, aOffset, length, 1), endOffset); - if (i == length) { - return false; - } + // Skip any trimmable leading whitespace. + int32_t i = GetTrimmableWhitespaceCount(aFrag, aOffset, length, 1); + while (true) { + // Scan past any leading punctuation. This leaves `j` at the first + // non-punctuation character. + int32_t j = FindEndOfPrefixPunctuationRun(aFrag, aTextRun, &iter, aOffset, + i, endOffset); + if (j == length) { + return false; + } - // skip space/no-break-space after punctuation - while (i < length) { - char16_t ch = aFrag->CharAt(AssertedCast(aOffset + i)); - if (ch == ' ' || ch == CH_NBSP) { - ++i; - } else { + // Scan past any Unicode whitespace characters after punctuation. + while (j < length) { + char16_t ch = aFrag->CharAt(AssertedCast(aOffset + j)); + // The spec says to allow "characters that belong to the `Zs` Unicode + // general category _other than_ U+3000" here. + if (unicode::GetGeneralCategory(ch) == + HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR && + ch != 0x3000) { + ++j; + } else { + break; + } + } + if (j == length) { + return false; + } + if (j == i) { + // If no whitespace was found, we've finished the first-letter prefix; + // if there was some, then go back to check for more punctuation. break; } - } - if (i == length) { - return false; + i = j; } // If the next character is not a letter, number or symbol, there is no @@ -8495,7 +8554,7 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, return true; } - // consume another cluster (the actual first letter) + // Consume another cluster (the actual first letter): // For complex scripts such as Indic and SEAsian, where first-letter // should extend to entire orthographic "syllable" clusters, we don't @@ -8566,9 +8625,12 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, break; } + // NOTE that FindClusterEnd sets the iterator to the last character that is + // part of the cluster, NOT to the first character beyond it. iter.SetOriginalOffset(aOffset + i); FindClusterEnd(aTextRun, endOffset, &iter, allowSplitLigature); + // Index of the last character included in the first-letter cluster. i = iter.GetOriginalOffset() - aOffset; // Heuristic for Indic scripts that like to form conjuncts: @@ -8616,9 +8678,44 @@ static bool FindFirstLetterRange(const nsTextFragment* aFrag, } } - // consume clusters that start with punctuation - i = FindEndOfPunctuationRun(aFrag, aTextRun, &iter, aOffset, i + 1, - endOffset); + // When we reach here, `i` points to the last character of the first-letter + // cluster, NOT to the first character beyond it. Advance to the next char, + // ready to check for following whitespace/punctuation: + ++i; + + while (i < length) { + // Skip over whitespace, except for word separator characters, before the + // check for following punctuation. But remember the position before the + // whitespace, in case we need to reset. + const int32_t preWS = i; + while (i < length) { + char16_t ch = aFrag->CharAt(AssertedCast(aOffset + i)); + // The spec says the first-letter suffix includes "any intervening + // typographic space -- characters belonging to the Zs Unicode general + // category other than U+3000 IDEOGRAPHIC SPACE or a word separator", + // where "word separator" includes U+0020 and U+00A0. + if (ch == 0x0020 || ch == 0x00A0 || ch == 0x3000 || + unicode::GetGeneralCategory(ch) != + HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR) { + break; + } else { + ++i; + } + } + + // Consume clusters that start with punctuation. + const int32_t prePunct = i; + i = FindEndOfSuffixPunctuationRun(aFrag, aTextRun, &iter, aOffset, i, + endOffset); + + // If we didn't find punctuation here, then we also don't want to include + // any preceding whitespace, so reset our index. + if (i == prePunct) { + i = preWS; + break; + } + } + if (i < length) { *aLength = i; } diff --git a/layout/reftests/box-shadow/reftest.list b/layout/reftests/box-shadow/reftest.list index f8f302b1cc5..a5fee65994b 100644 --- a/layout/reftests/box-shadow/reftest.list +++ b/layout/reftests/box-shadow/reftest.list @@ -33,7 +33,7 @@ fuzzy(0-26,0-3610) fuzzy-if(winWidget,0-26,0-5910) fuzzy-if(!(swgl&&Android),0-6 == boxshadow-inset-large-border-radius.html boxshadow-inset-large-border-radius-ref.html # fuzzy due to blur going inside, but as long as it's essentially black instead of a light gray its ok. -fuzzy(12-15,9400-13267) == boxshadow-inset-large-offset.html boxshadow-inset-large-offset-ref.html +fuzzy(12-15,9400-13267) fuzzy-if(cocoaWidget&&/^15\.30$/.test(os_version),15-15,13726-14412) == boxshadow-inset-large-offset.html boxshadow-inset-large-offset-ref.html == overflow-not-scrollable-1.html overflow-not-scrollable-1-ref.html == overflow-not-scrollable-1.html overflow-not-scrollable-1-ref2.html diff --git a/layout/reftests/first-letter/399941-2-ref.html b/layout/reftests/first-letter/399941-2-ref.html index 6c0639fc1d8..38a5187ff9a 100644 --- a/layout/reftests/first-letter/399941-2-ref.html +++ b/layout/reftests/first-letter/399941-2-ref.html @@ -2,7 +2,8 @@ - Test case for bug 399941, revised in bug 1260366 due to spec changes + Reference: Test case for bug 399941, revised in bug 1260366 and again in + bug 1957384 due to spec changes + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TEST +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html b/testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html new file mode 100644 index 00000000000..d9727001f43 --- /dev/null +++ b/testing/talos/talos/tests/perf-reftest-singletons/deeply-nested-grid-2.html @@ -0,0 +1,75 @@ + + + + + + + +
1 +
2 +
3 +
4 +
5 +
6 +
7 +
8 +
9 +
10 +
11 +
12 +
13 +
14 +
15 +
16 +
17 +
18 +
19 +
20 +
21 +
22 +
23 +
24 +
25 +
26 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest b/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest index 57cb45c84b7..e95f588f19f 100644 --- a/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest +++ b/testing/talos/talos/tests/perf-reftest-singletons/perf_reftest_singletons.manifest @@ -45,4 +45,6 @@ % http://localhost/tests/perf-reftest-singletons/remove-child-with-lengthy-text.html % http://localhost/tests/perf-reftest-singletons/resize-lengthy-textarea.html % http://localhost/tests/perf-reftest-singletons/thai-reflow.html +% http://localhost/tests/perf-reftest-singletons/deeply-nested-grid-1.html +% http://localhost/tests/perf-reftest-singletons/deeply-nested-grid-2.html # When modifying this list, please also update build/pgo/index.html (If relevant to profile-guided optimzation). diff --git a/testing/web-platform/meta/acid/acid2/reftest.html.ini b/testing/web-platform/meta/acid/acid2/reftest.html.ini index 1cd18173719..e043ed52c1c 100644 --- a/testing/web-platform/meta/acid/acid2/reftest.html.ini +++ b/testing/web-platform/meta/acid/acid2/reftest.html.ini @@ -1,3 +1,4 @@ [reftest.html] expected: + if swgl and (os == "linux") and debug and not fission: [PASS, FAIL] if not swgl: FAIL diff --git a/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini b/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini index 07b26b18012..ad8cdd1e446 100644 --- a/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini +++ b/testing/web-platform/meta/cookie-store/change_eventhandler_for_document_cookie.https.window.js.ini @@ -1,11 +1,11 @@ [change_eventhandler_for_document_cookie.https.window.html] [CookieStore set/overwrite/delete observed by document.cookie] expected: - if os == "mac": PASS + if (os == "mac") and (version == "OS X 14.7.1"): PASS if os == "linux": [FAIL, PASS] [PASS, FAIL] [CookieStore agrees with document.cookie on encoding non-ASCII cookies] expected: if os == "win": [PASS, FAIL] - if os == "linux": [PASS, FAIL] + if os == "linux": [FAIL, PASS] diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini new file mode 100644 index 00000000000..6eb513b3892 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-048.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-048.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini new file mode 100644 index 00000000000..54432fc620e --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-346.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-346.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini new file mode 100644 index 00000000000..22fe051ddae --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-347.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-347.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini new file mode 100644 index 00000000000..56411921667 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-348.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-348.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini new file mode 100644 index 00000000000..37b78600b30 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-349.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-349.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini new file mode 100644 index 00000000000..8ba014f8969 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-350.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-350.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini new file mode 100644 index 00000000000..0f87c6b90ef --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-351.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-351.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini new file mode 100644 index 00000000000..a555e11f31c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-352.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-352.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini new file mode 100644 index 00000000000..8cca7725526 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-353.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-353.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini new file mode 100644 index 00000000000..d49b42ee055 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-354.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-354.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini new file mode 100644 index 00000000000..418b58584fb --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-355.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-355.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini new file mode 100644 index 00000000000..fd5d925b46e --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-356.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-356.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini new file mode 100644 index 00000000000..cbe62658587 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-357.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-357.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini new file mode 100644 index 00000000000..1ed3543b821 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-359.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-359.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini new file mode 100644 index 00000000000..e90fcfa32a9 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-360.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-360.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini new file mode 100644 index 00000000000..c61faf454c2 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-361.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-361.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini new file mode 100644 index 00000000000..7f89f6e2bf1 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-362.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-362.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini new file mode 100644 index 00000000000..5494a7a903f --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-363.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-363.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini new file mode 100644 index 00000000000..ea0e168d065 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-364.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-364.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini new file mode 100644 index 00000000000..cb298bfb45d --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-365.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-365.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini new file mode 100644 index 00000000000..d6ad429ffd7 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-366.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-366.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini new file mode 100644 index 00000000000..9eb44a105cf --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-367.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-367.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini new file mode 100644 index 00000000000..49757792f76 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-368.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-368.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini new file mode 100644 index 00000000000..74a01387506 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-369.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-369.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini new file mode 100644 index 00000000000..811ff15e467 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-370.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-370.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini new file mode 100644 index 00000000000..33188dc91dc --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-371.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-371.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini new file mode 100644 index 00000000000..018400a3c1b --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-372.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-372.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini new file mode 100644 index 00000000000..14f7040e58d --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-373.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-373.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini new file mode 100644 index 00000000000..8562b93c9c0 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-374.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-374.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini new file mode 100644 index 00000000000..79c2538c381 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-375.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-375.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini new file mode 100644 index 00000000000..9e566f93812 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-376.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-376.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini new file mode 100644 index 00000000000..c0de5fa78be --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-377.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-377.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini new file mode 100644 index 00000000000..3b7eadeb7ee --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-378.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-378.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini new file mode 100644 index 00000000000..1c84d488d0f --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-379.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-379.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini new file mode 100644 index 00000000000..05d31e74fd0 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-380.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-380.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini new file mode 100644 index 00000000000..47c275a7524 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-381.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-381.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini new file mode 100644 index 00000000000..b6098840cbb --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-382.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-382.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini new file mode 100644 index 00000000000..bc38cc7d8a2 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-383.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-383.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini new file mode 100644 index 00000000000..255aa40f563 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-384.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-384.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini new file mode 100644 index 00000000000..36f39cb28d9 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-385.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-385.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini new file mode 100644 index 00000000000..25f3e9df983 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-386.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-386.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini new file mode 100644 index 00000000000..b428dbcf84c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-387.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-387.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini new file mode 100644 index 00000000000..ee4522be9ff --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-388.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-388.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini new file mode 100644 index 00000000000..d5033b7702c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-389.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-389.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini new file mode 100644 index 00000000000..8fb41b70dcd --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-390.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-390.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini new file mode 100644 index 00000000000..fa190cdd88b --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-391.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-391.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini new file mode 100644 index 00000000000..b90d9c01cb2 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-392.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-392.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini new file mode 100644 index 00000000000..3b5d91902c3 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-393.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-393.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini new file mode 100644 index 00000000000..97f23aa9d13 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-395.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-395.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini new file mode 100644 index 00000000000..c4b3f440562 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-396.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-396.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini new file mode 100644 index 00000000000..7b6b79a412e --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-397.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-397.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini new file mode 100644 index 00000000000..42d17b359c3 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-398.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-398.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini new file mode 100644 index 00000000000..d875c32af20 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-399.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-399.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini new file mode 100644 index 00000000000..99b8b112eee --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-400.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-400.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini new file mode 100644 index 00000000000..b22c51202b3 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-401.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-401.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini new file mode 100644 index 00000000000..e39556d39c7 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-402.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-402.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini new file mode 100644 index 00000000000..f09b96df47d --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-403.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-403.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini new file mode 100644 index 00000000000..fcd75b014d0 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-404.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-404.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini new file mode 100644 index 00000000000..375bf51a084 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-405.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-405.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini new file mode 100644 index 00000000000..73ce87e3b61 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-406.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-406.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini new file mode 100644 index 00000000000..25f8913dfaf --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-407.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-407.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini new file mode 100644 index 00000000000..c96d7d90fd1 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-408.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-408.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini new file mode 100644 index 00000000000..e55c683a578 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-409.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-409.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini new file mode 100644 index 00000000000..d4f7e041a03 --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-410.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-410.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini new file mode 100644 index 00000000000..414a4fcb10c --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-411.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-411.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini new file mode 100644 index 00000000000..cc01b45b73f --- /dev/null +++ b/testing/web-platform/meta/css/CSS2/selectors/first-letter-punctuation-412.xht.ini @@ -0,0 +1,2 @@ +[first-letter-punctuation-412.xht] + expected: FAIL diff --git a/testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini b/testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini new file mode 100644 index 00000000000..c8a7e63d1db --- /dev/null +++ b/testing/web-platform/meta/css/compositing/svg/mix-blend-mode-in-svg-image.html.ini @@ -0,0 +1,2 @@ +[mix-blend-mode-in-svg-image.html] + max-asserts: 2 diff --git a/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini b/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini index 72a1c372998..010bca2b414 100644 --- a/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini +++ b/testing/web-platform/meta/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html.ini @@ -78,3 +78,9 @@ [corner-shape-render-fuzzy.html?corner-shape=superellipse(0.8)&border-radius=40px&border-width=10px&border-left-color=purple] expected: FAIL + +[corner-shape-render-fuzzy.html?border-radius=50%&corner-top-left-shape=scoop&corner-bottom-right-shape=scoop&corner-top-right-shape=notch&corner-bottom-left-shape=notch&border-width=10px] + expected: FAIL + +[corner-shape-render-fuzzy.html?border-radius=50%&corner-top-right-shape=scoop&corner-bottom-left-shape=scoop&corner-top-left-shape=notch&corner-bottom-right-shape=notch&border-width=10px] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini b/testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini new file mode 100644 index 00000000000..114f9c85cd9 --- /dev/null +++ b/testing/web-platform/meta/css/css-counter-styles/kannada/css3-counter-styles-128.html.ini @@ -0,0 +1,2 @@ +[css3-counter-styles-128.html] + max-asserts: 2 diff --git a/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini b/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini index 034fb6f6743..fb0bf5c08cb 100644 --- a/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini +++ b/testing/web-platform/meta/css/css-scroll-snap/snap-after-relayout/resnap-on-reconstructing-frame.html.ini @@ -1,7 +1,10 @@ [resnap-on-reconstructing-frame.html] + expected: + if (os == "linux") and debug and fission: TIMEOUT [Stay at the last snap point even after reconstrucing the scroll container] expected: - if (os == "linux") and not tsan and not fission and not debug: [FAIL, PASS] + if (os == "linux") and not tsan and debug and fission: TIMEOUT + if (os == "linux") and not tsan and not debug and not fission: [PASS, FAIL] if (os == "linux") and tsan: [PASS, FAIL] if (os == "android") and not debug: [PASS, FAIL] if os == "mac": [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini b/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini index e508baaff84..7e9db6a06ea 100644 --- a/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini +++ b/testing/web-platform/meta/css/css-syntax/serialize-consecutive-tokens.html.ini @@ -6,3 +6,6 @@ [Comments are handled correctly when computing var(--t1)b using t1:a/* comment */.] expected: FAIL + + [Comments are handled correctly when computing var(--t1)b using t1:'a " '/* comment */.] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini b/testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini deleted file mode 100644 index d7898209733..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/block-with-overflowing-text.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[block-with-overflowing-text.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini b/testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini deleted file mode 100644 index 70b70bd845a..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/capture-with-opacity-zero-child.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[capture-with-opacity-zero-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini b/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini deleted file mode 100644 index 6dfa7b08e8d..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-hidden-child.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[capture-with-visibility-hidden-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini b/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini deleted file mode 100644 index e6de14705be..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/capture-with-visibility-mixed-descendants.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[capture-with-visibility-mixed-descendants.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini b/testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini deleted file mode 100644 index b91c29d4df4..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/clip-path-larger-than-border-box-on-child-of-named-element.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[clip-path-larger-than-border-box-on-child-of-named-element.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini b/testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini deleted file mode 100644 index 49be5f6b0eb..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/content-with-child-with-transparent-background.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[content-with-child-with-transparent-background.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini b/testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini deleted file mode 100644 index 3c9eeb041dd..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/content-with-inline-child.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[content-with-inline-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini b/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini index ad317c23ecd..2adcb4781c4 100644 --- a/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/element-with-overflow.html.ini @@ -1,2 +1,3 @@ [element-with-overflow.html] - expected: FAIL + expected: + if os == "win" and not swgl: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini b/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini deleted file mode 100644 index 84e3fd69235..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-new.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[fractional-box-with-overflow-children-new.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini b/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini deleted file mode 100644 index f598df928ea..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/fractional-box-with-overflow-children-old.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[fractional-box-with-overflow-children-old.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini b/testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini deleted file mode 100644 index 5f7c593c0a1..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-filter.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[inline-child-with-filter.html] - expected: - if (os == "android") and debug and not swgl: [FAIL, TIMEOUT] - FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini b/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini index 6af8d718f5d..11509612f88 100644 --- a/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/inline-child-with-overflow-shadow.html.ini @@ -1,2 +1,5 @@ [inline-child-with-overflow-shadow.html] - expected: FAIL + expected: + if os == "android": PASS + if os == "mac": PASS + FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini b/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini index 1f70914513a..33c9009a9b0 100644 --- a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini @@ -1,4 +1,3 @@ [massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html] expected: - if os == "mac": FAIL - if os == "android": FAIL + if os == "android" and not swgl: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini b/testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini deleted file mode 100644 index 4703270550a..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[massive-element-below-viewport-partially-onscreen-new.html] - expected: - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini b/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini index 87ddbbdba0c..aa9874f1700 100644 --- a/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini @@ -1,4 +1,3 @@ [massive-element-right-and-left-of-viewport-partially-onscreen-old.html] expected: - if os == "mac": FAIL if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini index 1026bf1ddf4..a2485c8e3e2 100644 --- a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/new-content-captures-clip-path.html.ini @@ -1,3 +1,3 @@ [new-content-captures-clip-path.html] bug: https://bugzil.la/1951167 - expected: [TIMEOUT, ERROR, FAIL] + expected: [TIMEOUT, ERROR, FAIL, PASS] diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini deleted file mode 100644 index 1547d934990..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/new-content-captures-spans.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[new-content-captures-spans.html] - expected: - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini new file mode 100644 index 00000000000..8e298757857 --- /dev/null +++ b/testing/web-platform/meta/css/css-view-transitions/new-content-preserve-3d-ancestor.html.ini @@ -0,0 +1,2 @@ +[new-content-preserve-3d-ancestor.html] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini b/testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini deleted file mode 100644 index e5e6fae2602..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/new-content-with-overflow.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[new-content-with-overflow.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini b/testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini deleted file mode 100644 index 17790fab03f..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/no-root-capture.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[no-root-capture.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini b/testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini deleted file mode 100644 index e1b7da6b4ba..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/old-content-captures-different-size.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[old-content-captures-different-size.html] - expected: - if debug: [FAIL, ERROR] - FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini b/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini index ceaf0606b87..9a2a4280311 100644 --- a/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/old-content-is-inline.html.ini @@ -2,4 +2,3 @@ bug: Fuzz expected: if os == "win": FAIL - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini b/testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini deleted file mode 100644 index 7381b140cae..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/old-content-with-overflow.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[old-content-with-overflow.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini index 59fa618d0ef..3c8d62a8d01 100644 --- a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini +++ b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-and-box-decorations.html.ini @@ -1,2 +1,4 @@ [span-with-overflowing-text-and-box-decorations.html] - expected: FAIL + expected: + if os == "win" and swgl: PASS + FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini deleted file mode 100644 index c6b20f59b1d..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text-hidden.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[span-with-overflowing-text-hidden.html] - expected: - if os == "mac": FAIL diff --git a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini b/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini deleted file mode 100644 index 4cb1ee49859..00000000000 --- a/testing/web-platform/meta/css/css-view-transitions/span-with-overflowing-text.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[span-with-overflowing-text.html] - expected: FAIL diff --git a/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini b/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini index aeca2efe5b2..ebb51b28c5b 100644 --- a/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini +++ b/testing/web-platform/meta/encoding/textencoder-utf16-surrogates.any.js.ini @@ -19,7 +19,9 @@ ERROR [textencoder-utf16-surrogates.https.any.shadowrealm-in-serviceworker.html] - expected: [ERROR, TIMEOUT] + expected: + if (processor == "x86") and (os == "linux"): [ERROR, CRASH, TIMEOUT] + [ERROR, TIMEOUT] [textencoder-utf16-surrogates.https.any.shadowrealm-in-audioworklet.html] expected: ERROR diff --git a/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini b/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini index 6d49c25cc41..327ec2e8f58 100644 --- a/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini +++ b/testing/web-platform/meta/fetch/metadata/generated/window-history.https.sub.html.ini @@ -1,40 +1,49 @@ [window-history.https.sub.html] expected: if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT - if os == "linux": [OK, TIMEOUT] + if (os == "linux") and tsan: [TIMEOUT, OK] + if (os == "linux") and not tsan: [OK, TIMEOUT] [sec-fetch-user - history.forward] expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if (os == "linux") and debug: [PASS, TIMEOUT] if (os == "linux") and not debug: [PASS, TIMEOUT, NOTRUN] [sec-fetch-user - history.back] expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if (os == "linux") and not debug: [PASS, TIMEOUT, NOTRUN] [sec-fetch-dest - history.forward] expected: if (os == "linux") and not debug and asan: [PASS, TIMEOUT, NOTRUN] if (os == "linux") and not debug and not asan: [PASS, TIMEOUT] + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN [sec-fetch-dest - history.back] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, NOTRUN] [sec-fetch-mode - history.forward] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, NOTRUN] [sec-fetch-mode - history.back] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, NOTRUN] [sec-fetch-site - Same site - history.forward] expected: + if not asan and (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if asan: [PASS, TIMEOUT] [sec-fetch-storage-access - Same site - history.forward] expected: - if (os == "linux") and fission and not debug and not asan: [PASS, TIMEOUT] + if (os == "linux") and fission and not tsan and not debug and not asan: [PASS, TIMEOUT] + if (os == "linux") and fission and tsan: [TIMEOUT, PASS] if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN if (os == "linux") and not fission: [PASS, TIMEOUT, NOTRUN] @@ -44,5 +53,17 @@ if (os == "linux") and not fission: [PASS, TIMEOUT] [sec-fetch-storage-access - Cross-site - history.forward] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [sec-fetch-site - Same site - history.back] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [sec-fetch-site - Cross-site - history.forward] expected: if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT + + [sec-fetch-storage-access - Cross-site - history.back] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN diff --git a/testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini b/testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini new file mode 100644 index 00000000000..c50af9629a8 --- /dev/null +++ b/testing/web-platform/meta/html/editing/dnd/platform/pointerdown-add-overflow-hidden.html.ini @@ -0,0 +1,3 @@ +[pointerdown-add-overflow-hidden.html] + expected: + if (os == "android"): TIMEOUT diff --git a/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini b/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini index 050625e9f76..7474711d45f 100644 --- a/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini +++ b/testing/web-platform/meta/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_history_go_forward.html.ini @@ -1,5 +1,3 @@ [iframe_sandbox_navigate_history_go_forward.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] [Check that sandboxed iframe can not navigate their ancestors] expected: FAIL diff --git a/testing/web-platform/meta/mozilla-sync b/testing/web-platform/meta/mozilla-sync index 0fdcd8e04bc..fdebb5aa2ac 100644 --- a/testing/web-platform/meta/mozilla-sync +++ b/testing/web-platform/meta/mozilla-sync @@ -1 +1 @@ -upstream: 41e905e5f5dacf58b1233b04b5959652d9165fa5 +upstream: 345da84d875becd82120ac159d86acc3b40921f1 diff --git a/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini b/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini index 8db9f8444f9..490c81d6bd0 100644 --- a/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini +++ b/testing/web-platform/meta/resource-timing/iframe-sequence-of-events.html.ini @@ -1,3 +1,30 @@ [iframe-sequence-of-events.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_NOTSAMESITE_ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_REMOTE_ORIGIN) with TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_REMOTE_ORIGIN->HTTP_NOTSAMESITE_ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): TIMEOUT + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_REMOTE_ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->ORIGIN) without TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->HTTP_NOTSAMESITE_ORIGIN) with TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN + + [Changing the src of an iframe (HTTP_NOTSAMESITE_ORIGIN->ORIGIN) with TAO should result in an RT entry] + expected: + if (os == "mac") and (version == "OS X 14.7.1"): NOTRUN diff --git a/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini b/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini index 4754387d3b9..0b8bcae591f 100644 --- a/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini +++ b/testing/web-platform/meta/service-workers/cache-storage/cache-storage-buckets.https.any.js.ini @@ -18,7 +18,7 @@ disabled: if privateBrowsing: https://bugzilla.mozilla.org/show_bug.cgi?id=1320796 expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "win") and not debug and (processor == "x86_64"): [OK, CRASH] [caches from different buckets have different contents] expected: FAIL diff --git a/testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini b/testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini new file mode 100644 index 00000000000..b65534f6dbe --- /dev/null +++ b/testing/web-platform/meta/speculation-rules/speculation-tags/prerender-target-hint.https.html.ini @@ -0,0 +1,2 @@ +[prerender-target-hint.https.html] + expected: ERROR diff --git a/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini b/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini index 01054d9962c..5b897ab52b7 100644 --- a/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini +++ b/testing/web-platform/meta/svg/animations/svglength-animation-LengthModeOther.html.ini @@ -1,3 +1,3 @@ [svglength-animation-LengthModeOther.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (processor == "x86") and (os == "linux"): CRASH diff --git a/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini b/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini index 602a5512bfa..85d566ff631 100644 --- a/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/idlharness.any.js.ini @@ -3,16 +3,24 @@ expected: FAIL [Memory interface: operation toFixedLengthBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: operation toResizableBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toFixedLengthBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toResizableBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [idlharness.any.worker.html] @@ -20,16 +28,24 @@ expected: FAIL [Memory interface: operation toFixedLengthBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: operation toResizableBuffer()] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toFixedLengthBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Memory interface: [object WebAssembly.Memory\] must inherit property "toResizableBuffer()" with the proper type] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [idlharness.any.shadowrealm-in-window.html] diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini index 43aa21451d4..57838baa82f 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer-shared.any.js.ini @@ -1,13 +1,18 @@ [to-fixed-length-buffer-shared.any.worker.html] [toFixedLengthBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [to-fixed-length-buffer-shared.any.html] [toFixedLengthBuffer caching behavior] - expected: FAIL - + expected: + if nightly_build: PASS + FAIL [to-fixed-length-buffer-shared.any.js] [toFixedLengthBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini index ebf77a21123..a750ddd5017 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-fixed-length-buffer.any.js.ini @@ -1,6 +1,8 @@ [to-fixed-length-buffer.any.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toFixedLengthBuffer caching behavior] expected: FAIL @@ -8,7 +10,9 @@ [to-fixed-length-buffer.any.worker.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toFixedLengthBuffer caching behavior] expected: FAIL @@ -16,7 +20,9 @@ [to-fixed-length-buffer.any.js] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toFixedLengthBuffer caching behavior] expected: FAIL diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini index cfdf4c7275a..bb11137e4f0 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer-shared.any.js.ini @@ -1,31 +1,49 @@ [to-resizable-buffer-shared.any.worker.html] [toResizableBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer max size] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [to-resizable-buffer-shared.any.html] [toResizableBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer max size] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [to-resizable-buffer-shared.any.js] [toResizableBuffer caching behavior] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer max size] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL diff --git a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini index cec054e9262..58305057a9b 100644 --- a/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini +++ b/testing/web-platform/meta/wasm/jsapi/memory/to-resizable-buffer.any.js.ini @@ -1,6 +1,8 @@ [to-resizable-buffer.any.worker.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer caching behavior] expected: FAIL @@ -9,7 +11,9 @@ expected: FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizable buffers from Memory cannot be detached by JS] expected: FAIL @@ -17,7 +21,9 @@ [to-resizable-buffer.any.html] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer caching behavior] expected: FAIL @@ -26,7 +32,9 @@ expected: FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizable buffers from Memory cannot be detached by JS] expected: FAIL @@ -34,7 +42,9 @@ [to-resizable-buffer.any.js] [API surface] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [toResizableBuffer caching behavior] expected: FAIL @@ -43,7 +53,9 @@ expected: FAIL [Resizing a Memory's resizable buffer] - expected: FAIL + expected: + if nightly_build: PASS + FAIL [Resizable buffers from Memory cannot be detached by JS] expected: FAIL diff --git a/testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini b/testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini new file mode 100644 index 00000000000..4b8a53388e2 --- /dev/null +++ b/testing/web-platform/meta/webdriver/tests/classic/get_element_text/user_prompts.py.ini @@ -0,0 +1,4 @@ +[user_prompts.py] + [test_dismiss_and_notify[alert-None\]] + expected: + if not sessionHistoryInParent and not debug: [PASS, ERROR] diff --git a/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini b/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini index 026cd676ffe..f69c2081cb0 100644 --- a/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini +++ b/testing/web-platform/meta/webdriver/tests/interop/beforeunload_prompt.py.ini @@ -2,4 +2,6 @@ disabled: if os == "android": bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1879324 expected: - if (os == "mac") and not debug: [OK, TIMEOUT] + if (os == "mac") and not debug and (version == "OS X 14.7.1"): [TIMEOUT, OK] + if (os == "mac") and not debug and (version == "OS X 14.7"): [OK, TIMEOUT] + if (os == "win") and not debug: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini b/testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini deleted file mode 100644 index ab1c729122f..00000000000 --- a/testing/web-platform/meta/webrtc/simulcast/h264.https.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[h264.https.html] - expected: - if (os == "linux") and debug: TIMEOUT - [H264 simulcast setup with two streams] - expected: - if (os == "linux") and debug: TIMEOUT diff --git a/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini b/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini index 0b2d8c032d4..89ab512e7ce 100644 --- a/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini +++ b/testing/web-platform/meta/workers/Worker-timeout-decreasing-order.html.ini @@ -1,8 +1,7 @@ [Worker-timeout-decreasing-order.html] [Tests timeouts on the worker are fired in decreasing order.] expected: - if (os == "linux") and not tsan and debug and fission: PASS - if (os == "linux") and not tsan and not debug and not fission: PASS - if (os == "android") and not debug and not sessionHistoryInParent: PASS + if (os == "linux") and (processor == "x86_64") and not tsan and debug and fission: PASS + if (os == "linux") and (processor == "x86_64") and not tsan and not debug and not fission: PASS if os == "win": PASS [PASS, FAIL] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini index dc2d9dcf409..406e64ca11e 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/adapter/requestAdapter/cts.https.html.ini @@ -34,7 +34,6 @@ [cts.https.html?q=webgpu:api,operation,adapter,requestAdapter:requestAdapter_invalid_featureLevel:*] - implementation-status: backlog [:featureLevel=""] [:featureLevel="%20"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini index 96d48de9e20..369d62d4089 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/copyTextureToTexture/cts.https.html.ini @@ -479,6 +479,7 @@ implementation-status: backlog expected: if os == "win" and debug: [TIMEOUT, CRASH] + if os == "win" and not debug: [OK, CRASH] if os == "linux" and debug: CRASH if os == "mac" and debug: [TIMEOUT, CRASH] [:srcFormat="bgra8unorm";dstFormat="bgra8unorm";dimension="2d"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini index d5f0dd073e9..dfb3dead514 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html.ini @@ -1,947 +1,3 @@ -[cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:*] - implementation-status: backlog - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] - expected: FAIL - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] - - [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] - expected: FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x10-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x12-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-4x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x4-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x5-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x6-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x8-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc1-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-r11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-r11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-rg11snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-rg11unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="3d"] - expected: - if os == "win": FAIL - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="2d"] - - [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="3d"] - expected: - if os == "win": FAIL - - [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes:*] tags: [webgpu, webgpu-long] [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] @@ -1924,19 +980,28 @@ [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes_copy_depth_stencil:*] - implementation-status: backlog + implementation-status: + if os == "win": backlog + if os == "linux": backlog [:format="depth16unorm";copyMethod="CopyT2B";aspect="depth-only"] expected: if os == "win": FAIL if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float";copyMethod="CopyT2B";aspect="depth-only"] expected: @@ -1944,14 +1009,24 @@ if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="depth-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="stencil8";copyMethod="CopyB2T";aspect="stencil-only"] expected: @@ -2718,28 +1793,48 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc4-r-unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-snorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc5-rg-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-float";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="1d"] @@ -2938,20 +2033,32 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "mac" and not debug: FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="1d"] @@ -2985,7 +2092,9 @@ [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow:*] - implementation-status: backlog + implementation-status: + if os == "win": backlog + if os == "linux" and debug: backlog expected: if os == "linux" and debug: [OK, TIMEOUT] [:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] @@ -3551,12 +2660,16 @@ [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] @@ -3583,210 +2696,280 @@ [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="astc-10x10-unorm";dimension="2d"] @@ -3877,12 +3060,16 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="eac-r11snorm";dimension="2d"] @@ -3909,226 +3096,305 @@ [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="1d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="2d"] [:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL [cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow_depth_stencil:*] - implementation-status: backlog + implementation-status: + if os == "win": backlog + if os == "linux": backlog [:format="depth16unorm";copyMethod="CopyT2B";aspect="depth-only"] expected: if os == "win": FAIL if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth24plus-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float";copyMethod="CopyT2B";aspect="depth-only"] expected: @@ -4136,14 +3402,24 @@ if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyB2T";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="depth-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="CopyT2B";aspect="stencil-only"] + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="depth32float-stencil8";copyMethod="WriteTexture";aspect="stencil-only"] - expected: FAIL + expected: + if os == "win": FAIL + if os == "linux": FAIL [:format="stencil8";copyMethod="CopyB2T";aspect="stencil-only"] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini new file mode 100644 index 00000000000..1059915193b --- /dev/null +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html.ini @@ -0,0 +1,946 @@ +[cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="CopyB2T";*] + implementation-status: backlog + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] + expected: FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: FAIL + + +[cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="WriteTexture";*] + implementation-status: + if os == "win": backlog + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc4-r-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc5-rg-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="eac-r11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-r11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="eac-rg11unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="FullCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="astc-10x10-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x6-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x8-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x10-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x12-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-4x4-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x4-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x6-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x5-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x6-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x8-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc1-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc1-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc2-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc2-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc3-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc3-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc4-r-snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc4-r-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc5-rg-snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc5-rg-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc6h-rgb-float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc6h-rgb-ufloat";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc7-rgba-unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bc7-rgba-unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bgra8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="bgra8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="eac-r11snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="eac-r11unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="eac-rg11snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="eac-rg11unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgba8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r16sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r16uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r32float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r32sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r32uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="r8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="r8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg11b10ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg16float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg16sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg16uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg32float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg32sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg32uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rg8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rg8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgb10a2uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgb10a2unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgb9e5ufloat";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba16float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba16float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba16sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba16sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba16uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba16uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba32float";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba32float";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba32sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba32sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba32uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba32uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8sint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8sint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8snorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8uint";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8uint";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8unorm";dimension="3d"] + expected: + if os == "win": FAIL + + [;checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="2d"] + + [;checkMethod="PartialCopyT2B";format="rgba8unorm-srgb";dimension="3d"] + expected: + if os == "win": FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini index cb7fc0fda58..3563427dff5 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/render_pass/clear_value/cts.https.html.ini @@ -11,66 +11,63 @@ [cts.https.html?q=webgpu:api,operation,render_pass,clear_value:stencil_clear_value:*] - implementation-status: backlog + implementation-status: + if os == "mac": backlog [:stencilFormat="depth24plus-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth24plus-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=1;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=255;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=258;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=false] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="depth32float-stencil8";stencilClearValue=65539;applyStencilClearValueAsStencilReferenceValue=true] - expected: FAIL + expected: + if os == "mac": FAIL [:stencilFormat="stencil8";stencilClearValue=0;applyStencilClearValueAsStencilReferenceValue=false] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini index 23f7eb85303..015f3c4e383 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/operation/rendering/depth_clip_clamp/cts.https.html.ini @@ -1,5 +1,6 @@ [cts.https.html?q=webgpu:api,operation,rendering,depth_clip_clamp:depth_clamp_and_clip:*] - implementation-status: backlog + implementation-status: + if os == "linux": backlog [:format="depth16unorm";unclippedDepth="_undef_";writeDepth=false;multisampled=false] [:format="depth16unorm";unclippedDepth="_undef_";writeDepth=false;multisampled=true] @@ -129,36 +130,34 @@ [:format="depth32float";unclippedDepth=true;writeDepth=true;multisampled=true] [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=false;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=false;multisampled=true] [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=true;multisampled=false] - expected: FAIL + expected: + if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth="_undef_";writeDepth=true;multisampled=true] expected: if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=false;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=false;multisampled=true] [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=true;multisampled=false] - expected: FAIL + expected: + if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth=false;writeDepth=true;multisampled=true] expected: if os == "linux": FAIL [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=false;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=false;multisampled=true] [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=true;multisampled=false] - expected: FAIL [:format="depth32float-stencil8";unclippedDepth=true;writeDepth=true;multisampled=true] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini index 71387ab645d..f05b4c39f61 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/render/draw/cts.https.html.ini @@ -101,13 +101,11 @@ [:smallIndexBuffer=false;smallVertexBuffer=true;smallInstanceBuffer=false] expected: - if os == "mac" and debug: [PASS, FAIL] - if os == "mac" and not debug: FAIL + if os == "mac": [PASS, FAIL] [:smallIndexBuffer=false;smallVertexBuffer=true;smallInstanceBuffer=true] expected: - if os == "mac" and debug: [PASS, FAIL] - if os == "mac" and not debug: FAIL + if os == "mac": [PASS, FAIL] [:smallIndexBuffer=true;smallVertexBuffer=false;smallInstanceBuffer=false] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini index ce5b40f5e41..b76c6a017e4 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/programmable/pipeline_bind_group_compat/cts.https.html.ini @@ -396,12 +396,20 @@ if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndexedIndirect";callWithZero=false] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndexedIndirect";callWithZero=true] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndirect";callWithZero=false] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:encoderType="render%20pass";call="drawIndirect";callWithZero=true] + expected: + if os == "mac": [PASS, TIMEOUT, NOTRUN] [cts.https.html?q=webgpu:api,validation,encoding,programmable,pipeline_bind_group_compat:buffer_binding,render_pipeline:*] @@ -880,8 +888,12 @@ if os == "mac": [PASS, TIMEOUT, NOTRUN] [:emptyBindGroupLayoutType="Empty";bindGroupLayoutEntryCount=4;renderCommand="drawIndexedIndirect"] + expected: + if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:emptyBindGroupLayoutType="Empty";bindGroupLayoutEntryCount=4;renderCommand="drawIndirect"] + expected: + if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:emptyBindGroupLayoutType="Null";bindGroupLayoutEntryCount=3;renderCommand="draw"] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini index ed427a8759d..458cfe5a90a 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/layout_related/cts.https.html.ini @@ -6093,170 +6093,170 @@ if os == "mac": TIMEOUT [:method="CopyB2T";format="astc-10x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-10x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x12-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-12x12-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-4x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-4x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-5x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-6x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="astc-8x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="bc1-rgba-unorm";dimension="2d"] @@ -6429,62 +6429,62 @@ [:method="CopyB2T";format="eac-r11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="eac-r11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="eac-rg11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="eac-rg11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8a1unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8a1unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgb8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgba8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="etc2-rgba8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [PASS, TIMEOUT, NOTRUN] [:method="CopyB2T";format="r16float";dimension="1d"] @@ -7337,170 +7337,170 @@ [:method="CopyT2B";format="astc-10x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-10x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x10-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x10-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x12-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-12x12-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-4x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-4x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x4-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x4-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-5x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-6x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x5-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x5-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x6-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x6-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x8-unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="astc-8x8-unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="bc1-rgba-unorm";dimension="2d"] @@ -7681,62 +7681,62 @@ [:method="CopyT2B";format="eac-r11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="eac-r11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="eac-rg11snorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="eac-rg11unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8a1unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8a1unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgb8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgba8unorm";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="etc2-rgba8unorm-srgb";dimension="2d"] expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "win": FAIL + if os == "linux": FAIL if os == "mac": [TIMEOUT, NOTRUN] [:method="CopyT2B";format="r16float";dimension="1d"] @@ -8589,172 +8589,88 @@ if os == "mac": [TIMEOUT, NOTRUN] [:method="WriteTexture";format="astc-10x10-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x10-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x6-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x6-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x8-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-10x8-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x10-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x10-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x12-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-12x12-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-4x4-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-4x4-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x4-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x4-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-5x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x6-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-6x6-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x5-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x5-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x6-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x6-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x8-unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="astc-8x8-unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="bc1-rgba-unorm";dimension="2d"] expected: @@ -8925,64 +8841,34 @@ if os == "mac": [FAIL, TIMEOUT, NOTRUN] [:method="WriteTexture";format="eac-r11snorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="eac-r11unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="eac-rg11snorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="eac-rg11unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8a1unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8a1unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgb8unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgba8unorm";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="etc2-rgba8unorm-srgb";dimension="2d"] - expected: - if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac": [PASS, TIMEOUT, NOTRUN] + expected: FAIL [:method="WriteTexture";format="r16float";dimension="1d"] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini index ebb42483b66..68a8c652f05 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini @@ -4296,66 +4296,82 @@ if os == "mac": TIMEOUT [:format="astc-10x10-unorm";usageType="texture";usageCopy="dst";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="dst";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="none";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm";usageType="texture";usageCopy="src-dest";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="none";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x10-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x5-unorm";usageType="texture";usageCopy="dst";awaitLost=false] @@ -4520,10 +4536,12 @@ [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="dst";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="none";awaitLost=false] @@ -4536,6 +4554,7 @@ [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src";awaitLost=true] @@ -4544,10 +4563,12 @@ [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-10x8-unorm-srgb";usageType="texture";usageCopy="src-dest";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-12x10-unorm";usageType="texture";usageCopy="dst";awaitLost=false] @@ -4567,6 +4588,7 @@ [:format="astc-12x10-unorm";usageType="texture";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:format="astc-12x10-unorm";usageType="texture";usageCopy="src";awaitLost=false] @@ -7332,11 +7354,13 @@ [:format="rgba16uint";usageType="render";usageCopy="none";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and not debug: [TIMEOUT, NOTRUN] [:format="rgba16uint";usageType="render";usageCopy="none";awaitLost=true] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and not debug: [TIMEOUT, NOTRUN] @@ -7392,6 +7416,7 @@ [:format="rgba16uint";usageType="storage";usageCopy="src-dest";awaitLost=false] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and not debug: [TIMEOUT, NOTRUN] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini index 60187225b57..80273edfad0 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupAdd/cts.https.html.ini @@ -6774,7 +6774,7 @@ [:case=608;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=608;type="f32";wgSize=[128,1,1\]] @@ -6789,22 +6789,22 @@ [:case=609;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=609;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=609;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=609;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=60;type="f16";wgSize=[128,1,1\]] @@ -6817,142 +6817,142 @@ [:case=610;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=610;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=610;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=610;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=611;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=612;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=613;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=614;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=615;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=616;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=617;type="f16";wgSize=[128,1,1\]] @@ -6967,7 +6967,7 @@ [:case=617;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=617;type="f32";wgSize=[64,2,1\]] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini index b2ac10b97bc..2eadaaf110b 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/subgroupMul/cts.https.html.ini @@ -8925,14 +8925,12 @@ [:case=713;type="f16";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=713;type="f16";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=713;type="f32";wgSize=[128,1,1\]] @@ -8942,8 +8940,7 @@ [:case=713;type="f32";wgSize=[64,2,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=714;type="f16";wgSize=[128,1,1\]] @@ -8960,8 +8957,7 @@ [:case=714;type="f32";wgSize=[128,1,1\]] expected: - if os == "linux" and debug: [TIMEOUT, NOTRUN] - if os == "linux" and not debug: [PASS, TIMEOUT, NOTRUN] + if os == "linux": [PASS, TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] [:case=714;type="f32";wgSize=[64,2,1\]] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini index c59dcfe31a3..37a7d00a3e0 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureGather/cts.https.html.ini @@ -5748,6 +5748,7 @@ [:stage="f";format="rgba8snorm";filt="linear";mode="c"] expected: if os == "linux": [PASS, TIMEOUT, NOTRUN] + if os == "mac" and not debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rgba8snorm";filt="linear";mode="m"] expected: @@ -8502,6 +8503,7 @@ [:stage="v";format="rgba16sint";filt="nearest";mode="r"] expected: if os == "win" and debug: [TIMEOUT, NOTRUN] + if os == "win" and not debug: [PASS, TIMEOUT, NOTRUN] if os == "linux": [TIMEOUT, NOTRUN] if os == "mac": [TIMEOUT, NOTRUN] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini index 5eeb879f827..8cd32a0c665 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureLoad/cts.https.html.ini @@ -2788,6 +2788,8 @@ [:stage="v";format="rgba8snorm"] [:stage="v";format="rgba8uint"] + expected: + if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="v";format="rgba8unorm"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini index 30e566a2481..f9a8f31c499 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleBias/cts.https.html.ini @@ -6,10157 +6,6 @@ if os == "win" and not debug: [OK, CRASH] if os == "linux": CRASH if os == "mac": CRASH - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:arrayed_3d_coords:*] @@ -12183,10157 +2032,6 @@ if os == "win" and not debug: [OK, CRASH] if os == "linux": CRASH if os == "mac": CRASH - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="linear";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="c";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="m";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";filt="nearest";modeU="r";modeV="r";offset=true] - expected: - if os == "win" and not debug: FAIL [cts.https.html?q=webgpu:shader,execution,expression,call,builtin,textureSampleBias:sampled_3d_coords:*] @@ -22344,23006 +2042,3 @@ if os == "win" and not debug: [OK, CRASH] if os == "linux": CRASH if os == "mac": CRASH - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-10x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x10-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-12x12-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-4x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x4-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-5x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-6x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x5-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x6-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="astc-8x8-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc1-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc2-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc3-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc4-r-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc5-rg-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bc7-rgba-unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="bgra8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth16unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth24plus-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="depth32float-stencil8";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-r11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="eac-rg11unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8a1unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgb8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="etc2-rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="r8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg11b10ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rg8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb10a2unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgb9e5ufloat";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba16float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba32float";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8snorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="linear";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="c";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="m";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="c";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="m";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="c";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="m";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="3d";filt="nearest";modeU="r";modeV="r";modeW="r";offset=true] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="linear";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="c";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="m";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="c";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="m";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="c";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="m";offset=false] - expected: - if os == "win" and not debug: FAIL - - [:format="rgba8unorm-srgb";dim="cube";filt="nearest";modeU="r";modeV="r";modeW="r";offset=false] - expected: - if os == "win" and not debug: FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini index e3cdbdcc663..ec741099ca4 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleCompare/cts.https.html.ini @@ -987,13 +987,19 @@ [:format="depth24plus";filt="nearest";modeU="c";modeV="c";offset=true] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=false] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="c";modeV="m";offset=true] expected: @@ -1005,13 +1011,19 @@ [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=false] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="c";modeV="r";offset=true] expected: - if debug: [FAIL, TIMEOUT, NOTRUN] - if not debug: FAIL + if os == "win" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "win" and not debug: FAIL + if os == "linux": [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac" and not debug: FAIL [:format="depth24plus";filt="nearest";modeU="m";modeV="c";offset=false] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini index 17268edb0d3..762a79cc3ae 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/execution/expression/call/builtin/textureSampleLevel/cts.https.html.ini @@ -3367,24 +3367,36 @@ if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="3d";filt="linear"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="3d";filt="nearest"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="cube";filt="linear"] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8snorm";dim="cube";filt="nearest"] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8unorm";dim="3d";filt="linear"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8unorm";dim="3d";filt="nearest"] [:stage="f";format="rg8unorm";dim="cube";filt="linear"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rg8unorm";dim="cube";filt="nearest"] + expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rgb10a2unorm";dim="3d";filt="linear"] expected: @@ -3491,6 +3503,7 @@ [:stage="f";format="rgba8unorm";dim="3d";filt="nearest"] expected: + if os == "linux" and debug: [PASS, TIMEOUT, NOTRUN] if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] [:stage="f";format="rgba8unorm";dim="cube";filt="linear"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini index 6711ba4894b..395cfad011b 100644 --- a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/expression/call/builtin/subgroupBitwise/cts.https.html.ini @@ -1769,7 +1769,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="u32"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec2%3Cabstract-float%3E"] expected: @@ -1797,7 +1797,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec2%3Cu32%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec3%3Cabstract-float%3E"] expected: @@ -1825,7 +1825,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec3%3Cu32%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec4%3Cabstract-float%3E"] expected: @@ -1853,19 +1853,19 @@ [:retType="vec2%3Cu32%3E";op="subgroupAnd";paramType="vec4%3Cu32%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="abstract-float"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="abstract-int"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="bool"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="f16"] expected: @@ -1893,7 +1893,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec2%3Cbool%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec2%3Cf16%3E"] expected: @@ -1921,7 +1921,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec3%3Cbool%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec3%3Cf16%3E"] expected: @@ -1949,7 +1949,7 @@ [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec4%3Cbool%3E"] expected: - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] + if os == "mac": [PASS, TIMEOUT, NOTRUN] [:retType="vec2%3Cu32%3E";op="subgroupOr";paramType="vec4%3Cf16%3E"] expected: diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html index 4c10b641ab1..8948a42959d 100644 --- a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html +++ b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/cts.https.html @@ -33,7 +33,6 @@ - diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html new file mode 100644 index 00000000000..6b6e01d9415 --- /dev/null +++ b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/operation/command_buffer/image_copy/image_copy__mip_levels/cts.https.html @@ -0,0 +1,37 @@ + + + + +WebGPU CTS + + + + + + + + + + + diff --git a/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html b/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html index dd1a32a15ae..590e960830f 100644 --- a/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html +++ b/testing/web-platform/tests/css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html @@ -23,6 +23,8 @@ + + + + +
  • + Item 1 +
  • + + + diff --git a/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html b/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html index 9d6137d9c52..f554bf7c2ec 100644 --- a/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html +++ b/testing/web-platform/tests/service-workers/service-worker/tentative/static-router/static-router-resource-timing.https.html @@ -56,10 +56,12 @@ function test_resource_timing(options) { assert_equals(entry.workerStart, 0, description); assert_equals(entry.workerCacheLookupStart, 0, description); assert_less_than_equal(entry.workerRouterEvaluationStart, entry.fetchStart, description); + assert_greater_than(entry.encodedBodySize, 0, description); break; case 'cache': assert_equals(entry.workerStart, 0, description); assert_greater_than_equal(entry.workerCacheLookupStart, entry.workerRouterEvaluationStart, description); + assert_greater_than(entry.encodedBodySize, 0, description); if (entry.workerFinalSourceType === 'cache') { assert_equals(entry.fetchStart, entry.responseStart, description); assert_less_than_equal(entry.workerCacheLookupStart, entry.responseStart, description); @@ -70,6 +72,7 @@ function test_resource_timing(options) { break; case 'race-network-and-fetch-handler': assert_equals(entry.workerCacheLookupStart, 0, description); + assert_greater_than(entry.encodedBodySize, 0, description); if (entry.workerFinalSourceType === 'network') { assert_equals(entry.workerStart, 0, description); assert_less_than_equal(entry.workerRouterEvaluationStart, entry.fetchStart, description); @@ -79,6 +82,8 @@ function test_resource_timing(options) { } break; case 'fetch-event': + assert_greater_than(entry.encodedBodySize, 0, description); + break; case '': // i.e. no matching rules assert_equals(entry.workerCacheLookupStart, 0, description); assert_greater_than_equal(entry.workerStart, entry.workerRouterEvaluationStart, description); diff --git a/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html b/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html index 643d4db3869..3d1baaf1907 100644 --- a/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html +++ b/testing/web-platform/tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https.html @@ -39,7 +39,7 @@ promise_test(async t => { // Inputs and expectations: // "def" is duplicate. "\x19" is invalid. "undefined" indicates no tag. const rulesetTag = "def"; - const ruleTags = ["jkl", "def", "null", "\x19", "abc", undefined, "ghi"]; + const ruleTags = ["def", "jkl", "def", "null", "\x19", "abc", undefined, "ghi"]; // "def" should be deduped. // "\x19" and "undefined" should be ignored (should not send null tag). const expectedTags = '"abc", "def", "ghi", "jkl", "null"'; @@ -72,4 +72,210 @@ promise_test(async t => { assert_equals(headers.get("sec-speculation-tags"), expectedTags); }, "Sec-Speculation-Tags: deduped and sorted tags"); +// Test the case where multiple tags (including duplicate tags, invalid tags, +// and no tags) specified only on the rule level. These should be deduped and +// sorted before sent as the header. Unlike the previous test, no tag on the +// rule should result in the null tag. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + // No ruleset level tag. + const rulesetTag = undefined; + // "def" is duplicate. "\x19" is invalid. "undefined" indicates no tag. + const ruleTags = ["def", "jkl", "def", "null", "\x19", "abc", undefined, "ghi"]; + // 5 rules are (no ruleset level tag) + (rule level tag) = + // "abc" only, "def" only, "ghi" only, "jkl" only, "null" only. + // 1 rule is (no ruleset level tag) + (no rule level tag) = null only. + // 2 rule are duplicate or invalid. + // + // All 6 effective rules, including the null rule, get combined to match + // expectedTags. + const expectedTags = 'null, "abc", "def", "ghi", "jkl", "null"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRule = constructSpeculationRule( + preloadingType, url, rulesetTag, ruleTags); + return referrerRC.executeScript((speculationRule) => { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = speculationRule; + document.head.append(script); + }, [speculationRule]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: deduped and sorted tags within rules"); + +// Test the case where multiple tags specified on multiple rulesets. These +// should be deduped and sorted before sent as the header. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + // "def" and "jkl" are duplicate. + const rulesetTag1 = "def"; + const ruleTags1 = ["jkl", "abc"]; + const rulesetTag2 = "jkl"; + const ruleTags2 = ["def", "ghi"]; + // "def" and "jkl" should be deduped. + const expectedTags = '"abc", "def", "ghi", "jkl"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRules = [ + constructSpeculationRule( + preloadingType, url, rulesetTag1, ruleTags1), + constructSpeculationRule( + preloadingType, url, rulesetTag2, ruleTags2) + ]; + return referrerRC.executeScript((speculationRules) => { + for (const ruleText of speculationRules) { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = ruleText; + document.head.append(script); + } + }, [speculationRules]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: deduped and sorted tags within multiple rulesets"); + +// Test the case where multiple "null" tags and no tags specified on multiple +// rulesets. These should be deduped and sorted before sent as the header. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + const rulesetTag1 = undefined; + const ruleTags1 = [undefined, "null", "abc"]; + const rulesetTag2 = undefined; + const ruleTags2 = ["def", undefined, "null"]; + // 4 rules are (no ruleset level tag) + (rule level tag) = + // "abc" only, "def" only, "null" only. + // 2 rules are (no ruleset level tag) + (no rule level tag) = null only. + // + // All rules, including the null rules, get combined to match expectedTags. + const expectedTags = 'null, "abc", "def", "null"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRules = [ + constructSpeculationRule( + preloadingType, url, rulesetTag1, ruleTags1), + constructSpeculationRule( + preloadingType, url, rulesetTag2, ruleTags2) + ]; + return referrerRC.executeScript((speculationRules) => { + for (const ruleText of speculationRules) { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = ruleText; + document.head.append(script); + } + }, [speculationRules]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: 'null' tags and no tags within multiple rulesets"); + +// Test the case where 2 rulesets are added but the first ruleset is immediately +// removed before they are processed. Only tags specified on the second ruleset +// should be sent. +promise_test(async t => { + const params = new URLSearchParams(window.location.search); + const preloadingType = params.get('type'); + + // Inputs and expectations: + // Only the first ruleset includes "abc". + const rulesetTag1 = "def"; + const ruleTags1 = ["jkl", "abc"]; + const rulesetTag2 = "jkl"; + const ruleTags2 = ["def", "ghi"]; + // "abc" should not be sent, as the first ruleset is removed. The other + // common tags should be sent regardless of the removal. + const expectedTags = '"def", "ghi", "jkl"'; + + const rcHelper = new RemoteContextHelper(); + const referrerRC = await rcHelper.addWindow(undefined, { features: 'noopener' }); + + const extraConfig = {}; + const preloadedRC = await referrerRC.helper.createContext({ + executorCreator(url) { + const speculationRules = [ + constructSpeculationRule( + preloadingType, url, rulesetTag1, ruleTags1), + constructSpeculationRule( + preloadingType, url, rulesetTag2, ruleTags2) + ]; + return referrerRC.executeScript((speculationRules) => { + const scripts = []; + for (const ruleText of speculationRules) { + const script = document.createElement("script"); + script.type = "speculationrules"; + script.textContent = ruleText; + document.head.append(script); + scripts.push(script); + } + // Remove the first ruleset. + scripts[0].remove(); + }, [speculationRules]); + }, extraConfig + }); + + // Navigate to the preloaded page. + await referrerRC.navigateTo(preloadedRC.url); + + const headers = await preloadedRC.getRequestHeaders(); + // Make sure the page is preloaded. + assert_equals( + headers.get("sec-purpose"), + preloadingType === "prefetch" ? "prefetch" : "prefetch;prerender"); + assert_equals(headers.get("sec-speculation-tags"), expectedTags); +}, "Sec-Speculation-Tags: removed ruleset"); + diff --git a/testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html b/testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html new file mode 100644 index 00000000000..cab8f4586c5 --- /dev/null +++ b/testing/web-platform/tests/speculation-rules/speculation-tags/prerender-target-hint.https.html @@ -0,0 +1,65 @@ + +Sec-Speculation-Tags request headers + + + + + + + + + diff --git a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py index 5c9624e64c0..e587a082c03 100644 --- a/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py +++ b/testing/web-platform/tests/tools/webdriver/webdriver/bidi/modules/emulation.py @@ -9,11 +9,11 @@ class CoordinatesOptions(Dict[str, Any]): self, latitude: float, longitude: float, - accuracy: float = None, - altitude: float = None, - altitude_accuracy: float = None, - heading: float = None, - speed: float = None, + accuracy: Optional[float] = None, + altitude: Optional[float] = None, + altitude_accuracy: Optional[float] = None, + heading: Optional[float] = None, + speed: Optional[float] = None, ): self["latitude"] = latitude self["longitude"] = longitude diff --git a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py index b3f1fe2af8f..1ef583007d4 100644 --- a/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py +++ b/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/chrome.py @@ -161,6 +161,10 @@ def executor_kwargs(logger, test_type, test_environment, run_info_data, subsuite # Disable overlay scrollbar animations to prevent flaky wpt screenshots based on timing. chrome_options["args"].append("--disable-features=ScrollbarAnimations") + # Always enable ViewTransitions long callback timeout to avoid erroneous + # failures due to implicit timeout within the API. + blink_features = ['ViewTransitionLongCallbackTimeoutForTesting'] + if kwargs["enable_mojojs"]: blink_features = ['MojoJS', 'MojoJSTest'] chrome_options["args"].append("--enable-blink-features=" + ','.join(blink_features)) diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py index 2ac62c6fbd1..ed0885ebf6c 100755 --- a/testing/xpcshell/runxpcshelltests.py +++ b/testing/xpcshell/runxpcshelltests.py @@ -131,7 +131,7 @@ def cleanup_encoding(s): points, etc. If it is a byte string, it is assumed to be UTF-8, but it may not be *correct* UTF-8. Return a sanitized unicode object.""" - if not isinstance(s, (str,)): + if not isinstance(s, str): if isinstance(s, bytes): return six.ensure_str(s) else: @@ -711,7 +711,7 @@ class XPCShellTestThread(Thread): def log_line(self, line): """Log a line of output (either a parser json object or text output from the test process""" - if isinstance(line, (str,)) or isinstance(line, bytes): + if isinstance(line, (str, bytes)): line = self.fix_text_output(line).rstrip("\r\n") self.log.process_output(self.proc_ident, line, command=self.command) else: diff --git a/testing/xpcshell/selftest.py b/testing/xpcshell/selftest.py index 4204201da12..41fe05cd7e9 100755 --- a/testing/xpcshell/selftest.py +++ b/testing/xpcshell/selftest.py @@ -509,7 +509,7 @@ class XPCShellTestsTests(unittest.TestCase): """ testlines = [] for t in tests: - testlines.append('["%s"]' % (t if isinstance(t, (str,)) else t[0])) + testlines.append('["%s"]' % (t if isinstance(t, str) else t[0])) if isinstance(t, tuple): testlines.extend(t[1:]) prefslines = [] diff --git a/third_party/fmt/moz.build b/third_party/fmt/moz.build index b51fbec26dd..348e60c2846 100644 --- a/third_party/fmt/moz.build +++ b/third_party/fmt/moz.build @@ -4,7 +4,8 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -FINAL_LIBRARY = "mozglue" +if CONFIG["MOZ_BUILD_APP"] != "memory": + FINAL_LIBRARY = "mozglue" with Files('**'): BUG_COMPONENT = ('Core', 'mozglue') diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/AUTHORS.md b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/AUTHORS.md similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/AUTHORS.md rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/AUTHORS.md diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/LICENSE b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/LICENSE similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/LICENSE rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/LICENSE diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/METADATA b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/METADATA similarity index 99% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/METADATA rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/METADATA index d85a935efa8..bac1de49109 100644 --- a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/METADATA +++ b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: glean_parser -Version: 17.0.1 +Version: 17.1.0 Summary: Parser tools for Mozilla's Glean telemetry Home-page: https://github.com/mozilla/glean_parser Author: The Glean Team @@ -79,6 +79,10 @@ $ glean_parser check < ping.json ## Unreleased +## 17.1.0 + +- Permit object metrics named 'glean.attribution.ext' or 'glean.distribution.ext' even if allow_reserved is false ([bug 1955428](https://bugzilla.mozilla.org/show_bug.cgi?id=1955428)) + ## 17.0.1 - BUGFIX: Fix missing `ping_arg` "`uploader_capabilities`" in util.py ([#786](https://github.com/mozilla/glean_parser/pull/786)) diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/RECORD b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/RECORD similarity index 83% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/RECORD rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/RECORD index f5c5be12b7d..4b7a9840bc8 100644 --- a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/RECORD +++ b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/RECORD @@ -6,10 +6,10 @@ glean_parser/go_server.py,sha256=NOx66OpNDVIos6n3ejoJeFM5Dk4u7E3u86XV2G54tww,558 glean_parser/javascript.py,sha256=w4ZhNBHBKWYk0h3t7G0Ud2tR__hRqzn9dlEXNKLdQrA,11230 glean_parser/javascript_server.py,sha256=BJpVFuKG3tKFP0_xVyrR9Pn0UrvhumObCEgLeE0Lxhk,9028 glean_parser/kotlin.py,sha256=X2YNmx4boQ6Yb5CPoCIyRFDADrXPKIcIC-AyjkaSLtM,9519 -glean_parser/lint.py,sha256=ktdkR2GjR0wuR4IpLTiZ-q17vI4dk_Nebp4XU3pqzsk,21103 +glean_parser/lint.py,sha256=XqNsb_Km6I1AlAdJuIcaoykoL7bGPXTQoz62icIPHNY,20827 glean_parser/markdown.py,sha256=GkCr1CrV6mnRQseT6FO1-JJ7Eup8X3lxUfRMBTxXpe4,9066 glean_parser/metrics.py,sha256=3_ERPI63CsH_QvXVKNBVKIQTv4KWir2SfSbtn6J8a9Q,15842 -glean_parser/parser.py,sha256=3bJwUGYhnzIHYJ7UBdO63Oi0_n1_Twvr2IOUUe_koME,18132 +glean_parser/parser.py,sha256=IsDMTOLpt_H5GRPXX3G0HQdjeRIPeYFs3TGpVjH1ubA,19383 glean_parser/pings.py,sha256=l4hKmnKigS46vlHFI4aWueKVHcZQL36QfhK0VC8OiFA,3924 glean_parser/python_server.py,sha256=ERpYcbSwF19xKFagxX0mZAvlR1y6D7Ah5DSvW8LipCY,4791 glean_parser/ruby_server.py,sha256=e5lkfcLQAUMUBQDCjqNU82LkdUzT5x-G6HOnsUInbsU,5190 @@ -22,7 +22,7 @@ glean_parser/translation_options.py,sha256=Lxzr6G7MP0tC_ZYlZXftS4j0SLiqO-5mGVTEc glean_parser/util.py,sha256=yTx_-Q8w8rNNSZ_xbno0B90WR7pZZptG2bUWU0sCHZk,16580 glean_parser/validate_ping.py,sha256=0TNvILH6dtzJDys3W8Kqorw6kk03me73OCUDtpoHcXU,2118 glean_parser/schemas/metrics.1-0-0.schema.yaml,sha256=cND3cvi6iBfPUVmtfIBQfGJV9AALpbvN7nu8E33_J-o,19566 -glean_parser/schemas/metrics.2-0-0.schema.yaml,sha256=ieFMxezBuySCvUorx8eGqXRUcoeTql4Z9FxkbkG9XFQ,26715 +glean_parser/schemas/metrics.2-0-0.schema.yaml,sha256=7BrN0qON_j8x9xm4TubGOluViGTG-gIqPyEmYPtKgf4,26716 glean_parser/schemas/pings.1-0-0.schema.yaml,sha256=hwCnsKpEysmrmVp-QHGBArEkVY3vaU1rVsxlTwhAzws,4315 glean_parser/schemas/pings.2-0-0.schema.yaml,sha256=FQBsEt8Eg_ypBUnhJ1THZWXIgtuiYfyXcp_J9pGJUnE,7001 glean_parser/schemas/tags.1-0-0.schema.yaml,sha256=OGXIJlvvVW1vaqB_NVZnwKeZ-sLlfH57vjBSHbj6DNI,1231 @@ -40,10 +40,10 @@ glean_parser/templates/ruby_server.jinja2,sha256=B0pbuld3j_0s7uMjoaCo8_6ehJUZeTX glean_parser/templates/rust.jinja2,sha256=hX8p5HXQNEeVz_sF6SDIyUNus6CcaCG9KWLl6uQLiOU,7285 glean_parser/templates/rust_server.jinja2,sha256=JJdeU5jiWx9aWpF0qiXIYztJ14OQKxV3VFdAbCrtR_0,12841 glean_parser/templates/swift.jinja2,sha256=L_JpwGLVzmOf1FYLoCzFu_RnGTExCIDup7iR1tWzD3o,6912 -glean_parser-17.0.1.dist-info/AUTHORS.md,sha256=yxgj8MioO4wUnrh0gmfb8l3DJJrf-l4HmmEDbQsbbNI,455 -glean_parser-17.0.1.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725 -glean_parser-17.0.1.dist-info/METADATA,sha256=fX3p807Z0tgo8pjTGNX4Fxw3gPXT6dJrW_Cw7lnAE_4,36761 -glean_parser-17.0.1.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91 -glean_parser-17.0.1.dist-info/entry_points.txt,sha256=mf9d3sv8BwSjjR58x9KDnpVkONCnv3fPQC2NjJl15Xg,68 -glean_parser-17.0.1.dist-info/top_level.txt,sha256=q7T3duD-9tYZFyDry6Wv2LcdMsK2jGnzdDFhxWcT2Z8,13 -glean_parser-17.0.1.dist-info/RECORD,, +glean_parser-17.1.0.dist-info/AUTHORS.md,sha256=yxgj8MioO4wUnrh0gmfb8l3DJJrf-l4HmmEDbQsbbNI,455 +glean_parser-17.1.0.dist-info/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725 +glean_parser-17.1.0.dist-info/METADATA,sha256=8JtbrOR7bidnVKiBahDVVmNSQj1cLb-wyKicTA2U4hw,36957 +glean_parser-17.1.0.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91 +glean_parser-17.1.0.dist-info/entry_points.txt,sha256=mf9d3sv8BwSjjR58x9KDnpVkONCnv3fPQC2NjJl15Xg,68 +glean_parser-17.1.0.dist-info/top_level.txt,sha256=q7T3duD-9tYZFyDry6Wv2LcdMsK2jGnzdDFhxWcT2Z8,13 +glean_parser-17.1.0.dist-info/RECORD,, diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/WHEEL b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/WHEEL similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/WHEEL rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/WHEEL diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/entry_points.txt b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/entry_points.txt similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/entry_points.txt rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/entry_points.txt diff --git a/third_party/python/glean_parser/glean_parser-17.0.1.dist-info/top_level.txt b/third_party/python/glean_parser/glean_parser-17.1.0.dist-info/top_level.txt similarity index 100% rename from third_party/python/glean_parser/glean_parser-17.0.1.dist-info/top_level.txt rename to third_party/python/glean_parser/glean_parser-17.1.0.dist-info/top_level.txt diff --git a/third_party/python/glean_parser/glean_parser/lint.py b/third_party/python/glean_parser/glean_parser/lint.py index 4449d660a31..3605618eeec 100644 --- a/third_party/python/glean_parser/glean_parser/lint.py +++ b/third_party/python/glean_parser/glean_parser/lint.py @@ -134,7 +134,6 @@ def check_unit_in_name( time_unit = getattr(metric, "time_unit", None) memory_unit = getattr(metric, "memory_unit", None) - unit = getattr(metric, "unit", None) if time_unit is not None: if ( @@ -175,14 +174,6 @@ def check_unit_in_name( "Confirm the unit is correct and only include memory_unit." ) - elif unit is not None: - if unit_in_name == unit: - yield ( - f"Suffix '{unit_in_name}' is redundant with unit param " - f"'{unit}'. " - "Only include unit." - ) - def check_category_generic( category_name: str, metrics: Iterable[metrics.Metric] diff --git a/third_party/python/glean_parser/glean_parser/parser.py b/third_party/python/glean_parser/glean_parser/parser.py index 3f0536a5e9b..c4f8ab07ea6 100644 --- a/third_party/python/glean_parser/glean_parser/parser.py +++ b/third_party/python/glean_parser/glean_parser/parser.py @@ -188,19 +188,32 @@ def _instantiate_metrics( if category_key == "no_lint": continue if not config.get("allow_reserved") and category_key.split(".")[0] == "glean": - yield util.format_error( - filepath, - f"For category '{category_key}'", - "Categories beginning with 'glean' are reserved for " - "Glean internal use.", - ) - continue + if category_key not in ("glean.attribution", "glean.distribution"): + yield util.format_error( + filepath, + f"For category '{category_key}'", + "Categories beginning with 'glean' are reserved for " + "Glean internal use.", + ) + continue all_objects.setdefault(category_key, DictWrapper()) if not isinstance(category_val, dict): raise TypeError(f"Invalid content for {category_key}") for metric_key, metric_val in sorted(category_val.items()): + if ( + not config.get("allow_reserved") + and category_key in ("glean.attribution", "glean.distribution") + and metric_key != "ext" + ): + yield util.format_error( + filepath, + f"For {category_key}.{metric_key}", + f"May only use semi-reserved category {category_key} with metric name 'ext'", + metric_val.defined_in["line"], + ) + continue try: metric_obj = Metric.make_metric( category_key, metric_key, metric_val, validated=True, config=config @@ -214,18 +227,28 @@ def _instantiate_metrics( ) metric_obj = None else: - if ( - not config.get("allow_reserved") - and "all-pings" in metric_obj.send_in_pings - ): - yield util.format_error( - filepath, - f"On instance {category_key}.{metric_key}", - 'Only internal metrics may specify "all-pings" ' - 'in "send_in_pings"', - metric_val.defined_in["line"], - ) - metric_obj = None + if not config.get("allow_reserved"): + if "all-pings" in metric_obj.send_in_pings: + yield util.format_error( + filepath, + f"On instance {category_key}.{metric_key}", + 'Only internal metrics may specify "all-pings" ' + 'in "send_in_pings"', + metric_val.defined_in["line"], + ) + metric_obj = None + elif ( + metric_obj.identifier() + in ("glean.attribution.ext", "glean.distribution.ext") + and metric_obj.type != "object" + ): + yield util.format_error( + filepath, + f"On instance {category_key}.{metric_key}", + "Extended attribution/distribution metrics must be of type 'object'", + metric_val.defined_in["line"], + ) + metric_obj = None if metric_obj is not None: metric_obj.no_lint = sorted(set(metric_obj.no_lint + global_no_lint)) @@ -481,16 +504,16 @@ def parse_objects( raise TypeError(f"Invalid content for {filepath}") for category_key, category_val in sorted(content.items()): - if category_key.startswith("$"): - continue + if category_key.startswith("$"): + continue - interesting_metrics_dict.setdefault(category_key, DictWrapper()) + interesting_metrics_dict.setdefault(category_key, DictWrapper()) - if not isinstance(category_val, dict): - raise TypeError(f"Invalid category_val for {category_key}") + if not isinstance(category_val, dict): + raise TypeError(f"Invalid category_val for {category_key}") - for metric_key, metric_val in sorted(category_val.items()): - interesting_metrics_dict[category_key][metric_key] = metric_val + for metric_key, metric_val in sorted(category_val.items()): + interesting_metrics_dict[category_key][metric_key] = metric_val for category_key, category_val in all_objects.items(): if category_key == "tags": diff --git a/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml b/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml index 3af3c5d5cfa..66ba46d0a4d 100644 --- a/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml +++ b/third_party/python/glean_parser/glean_parser/schemas/metrics.2-0-0.schema.yaml @@ -565,7 +565,7 @@ definitions: Use is limited to Firefox Desktop only. Has no effect when used with non-FOG outputters. See FOG's documentation on mirroring for details - - https://firefox-source-docs.mozilla.org/toolkit/components/glean/mirroring.html + https://firefox-source-docs.mozilla.org/toolkit/components/glean/user/gifft.html type: string minLength: 6 diff --git a/third_party/python/pyproject.toml b/third_party/python/pyproject.toml index 489a71851a3..575a3ddd829 100644 --- a/third_party/python/pyproject.toml +++ b/third_party/python/pyproject.toml @@ -21,7 +21,7 @@ dependencies = [ "filelock~=3.6", "fluent-migrate==0.13.2", "fluent-syntax==0.19.0", - "glean-parser==17.0.1", + "glean-parser==17.1.0", "importlib-metadata==6.0.0", # Required for compatibility with Flask >= 2 in tools/tryselect/selectors/chooser "jinja2==3.1.2", diff --git a/third_party/python/requirements.txt b/third_party/python/requirements.txt index 0b98e3099cc..cb7883021a4 100644 --- a/third_party/python/requirements.txt +++ b/third_party/python/requirements.txt @@ -358,9 +358,9 @@ gitignorant==0.3.1 \ giturlparse==0.12.0 \ --hash=sha256:c0fff7c21acc435491b1779566e038757a205c1ffdcb47e4f81ea52ad8c3859a \ --hash=sha256:412b74f2855f1da2fefa89fd8dde62df48476077a72fc19b62039554d27360eb -glean-parser==17.0.1 \ - --hash=sha256:764a3b5aaa22d6100100d97a6ce58515687f4e0d06660180024e3101a507f580 \ - --hash=sha256:922b75be353461875802a50dfd052215414dbc2965d153b95ff31d85081c40b7 +glean-parser==17.1.0 \ + --hash=sha256:a59ab66dd734a8bea7d7a2cb632276602dd899411ee1c1cb89f439a833ba1598 \ + --hash=sha256:d353c7eae4f369f6ec198cb61432e7c24d1d06b14aecc05b367f6c498053defc idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 diff --git a/third_party/python/uv.lock b/third_party/python/uv.lock index 506c752a66f..9d719f590b8 100644 --- a/third_party/python/uv.lock +++ b/third_party/python/uv.lock @@ -598,7 +598,7 @@ wheels = [ [[package]] name = "glean-parser" -version = "17.0.1" +version = "17.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -608,9 +608,9 @@ dependencies = [ { name = "platformdirs" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7d/fd/895160c0fbc1ced0803bd19a2c2473f537efd8e6afa38aae2af12d5535b9/glean_parser-17.0.1.tar.gz", hash = "sha256:764a3b5aaa22d6100100d97a6ce58515687f4e0d06660180024e3101a507f580", size = 290273 } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5e/a2c499e871398869372361a733dc612bb108079c3113ea35f67b6846e58d/glean_parser-17.1.0.tar.gz", hash = "sha256:a59ab66dd734a8bea7d7a2cb632276602dd899411ee1c1cb89f439a833ba1598", size = 291725 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/02/dcc2f155ef74fb2c83d51b7170236f4648adb49f645bac4e5786dc3ac77c/glean_parser-17.0.1-py3-none-any.whl", hash = "sha256:922b75be353461875802a50dfd052215414dbc2965d153b95ff31d85081c40b7", size = 124106 }, + { url = "https://files.pythonhosted.org/packages/8a/bd/be94c7243ff7666ee6c3170fc52791323b0b4d70d9522a9da1911dbbe40d/glean_parser-17.1.0-py3-none-any.whl", hash = "sha256:d353c7eae4f369f6ec198cb61432e7c24d1d06b14aecc05b367f6c498053defc", size = 124309 }, ] [[package]] @@ -925,7 +925,7 @@ requires-dist = [ { name = "filelock", specifier = "~=3.6" }, { name = "fluent-migrate", specifier = "==0.13.2" }, { name = "fluent-syntax", specifier = "==0.19.0" }, - { name = "glean-parser", specifier = "==17.0.1" }, + { name = "glean-parser", specifier = "==17.1.0" }, { name = "importlib-metadata", specifier = "==6.0.0" }, { name = "jinja2", specifier = "==3.1.2" }, { name = "jsmin", specifier = "==3.0.0" }, diff --git a/third_party/python/uv.lock.hash b/third_party/python/uv.lock.hash index 54259ca4172..481932e3d93 100644 --- a/third_party/python/uv.lock.hash +++ b/third_party/python/uv.lock.hash @@ -1 +1 @@ -6811e7a47781ee2d8b491fa59de0ad7a40375d04beeab0f203d5e423f0db5e48 \ No newline at end of file +bef15c648652b3186718606fe950f1a885a86c4abb19b28d8a95f2ad60e2e039 \ No newline at end of file diff --git a/third_party/rust/glean-core/.cargo-checksum.json b/third_party/rust/glean-core/.cargo-checksum.json index 85a4d137a37..146abf79a3d 100644 --- a/third_party/rust/glean-core/.cargo-checksum.json +++ b/third_party/rust/glean-core/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"0359eee0959129d95bc83af3048a2830b7d1f5e87befdf66631da955485a62f8","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"026495898699b54608eb4ec16074ffafc57920d80ccb59961c501a1ea28c9985","build.rs":"4857bea99c6b8c08db8818efa9d3738716f52d3acb68159323957ae52892a3eb","src/common_metric_data.rs":"02dd1628fed6587621c089952dd0cb80bed3c352cdacfb33be7e218ad1d847e9","src/core/mod.rs":"cc723d90c1738bec63b7522793eddfbd4c6d14c792bea49a60cbb361faaa84a1","src/core_metrics.rs":"a877e42e0f8b932adb52a5681ad76fd977808cb48c7eeb29b1e4bbe804f1ea96","src/coverage.rs":"49613fd310bd24d779472720975fbe6c97ec370a95eb55f10afa43f67539c942","src/database/mod.rs":"d9c01ecf92b69a0fe826abf1abf81569ab0dbe61d7f3d8c41201f3a21ac1b13b","src/debug.rs":"7bd9e199d0d5c8170f6dbb9a725a18eaca1df34309d32b02081574962a86816e","src/dispatcher/global.rs":"17493b1a5e926ca1e9c1cda2ee031773402a19183911eb80048630d60266d89e","src/dispatcher/mod.rs":"391310269947452d7e0de24c848c183110c60149d75e345ba6d5d146f222dace","src/error.rs":"b93c7d3e243b21bb9eafc95f17860aba1a942b2f2b0a7f43307690f05fece516","src/error_recording.rs":"32c1f58ff080cb22184bca37e356faadbfe846386880fb0898b773adb3a97d8c","src/event_database/mod.rs":"33519a9f648b6b8a014c23a47c8aa74420511027b9c6984e0c77a4e6192c02c6","src/fd_logger.rs":"0c9def6fa53db1a2ab93c85795f8a7df57797bcfd3978146923e151752e291a6","src/glean.udl":"413784d0c8ef2f0ee34e7535fb10d2f31058dfd558d0121d5ad77d9f00aded96","src/glean_metrics.rs":"9414fb1453d19f6832df33e4c6ef7383d62203e47026bf5bc9552b083101ddd1","src/histogram/exponential.rs":"0f2c0857782d6910754a01438b1b4cd77bf0d3b847fd9ef969ba4da3705c5f5b","src/histogram/functional.rs":"22b2e64c3c1930e055beeebb832e3212e22b65b28e2ebb94c6bb3aff7ca31ba3","src/histogram/linear.rs":"bc33060cbbbb9c777539074cf5f788ab0f1a4ccecce0bf2cae2a697dd5089ea0","src/histogram/mod.rs":"c5eca9f6b0e1e309a7b41c2427d4c1da9c30e832d358d65ba347ba522abfd9c7","src/internal_metrics.rs":"b07018078a09c46ab3416818ddab6bd31a4d5beeeaf677ed6edba10b2b524326","src/internal_pings.rs":"3957a9fe256977a05d8d9e3beeec4c1fd08029db1c516fec4f6b59888e46ef39","src/lib.rs":"b9d89f63cde771d31fea5659ed534478df5f63595254e6a4648ba7c9ad7f8d85","src/lib_unit_tests.rs":"470dca51a00acf316e7afd30d337731724116308553c8596db1890ea8d127388","src/metrics/boolean.rs":"2b9ef57e3582c9bd8b2cca8ab94c962a4871ecc00e837b913c9b0349ba9dff08","src/metrics/counter.rs":"b4a52a8167fb0edd6354f952525e59f3eadb4261de3483374f03c94449d30b92","src/metrics/custom_distribution.rs":"1ec4fd2ecebf547bef0ed28ae6854f641be447bcbf4066a8580f6af16a23e37f","src/metrics/datetime.rs":"e4405762fc71718299fa1b208e3d5fda654bd1b82fe908c884c284e3530de2ec","src/metrics/denominator.rs":"95e8442f90bad97f80fc74b146782f215344b52c5f3825ae0a8baffdc001a714","src/metrics/event.rs":"cd52e200d313e2e6f31707419d4a7fe1cab34916ee145f8136440d6da34aaad4","src/metrics/experiment.rs":"5f9278cca4e133eb8df33bbfe36d1fe0ef3eade8c09f1b46db3c4d0790515412","src/metrics/labeled.rs":"e6afd55c7f7632c962c84de842b302b53df11660ed59b586f85e6e92808a23d8","src/metrics/memory_distribution.rs":"d3f02a6a78ed103024a2479975cd7617153e3f082e20f8f45c8e7afd052cec45","src/metrics/memory_unit.rs":"ee32e020cb303dd631457374048a3ed53a2e7cbacc29c54d17d836fb15507538","src/metrics/mod.rs":"777f89015c1642ed73536b07edc0763d179dbf608e2a0394439fe002cbc2fb53","src/metrics/numerator.rs":"937dfd583b797ac798a525cedca95c5a36262356760a89670d8113983c263154","src/metrics/object.rs":"2a1f1cc31973b576e55ba464b35c41b9420f62471eebba51273bca6856459538","src/metrics/ping.rs":"3b4524e8d17d55fe993746061636fb7d9566b51ac511765e173e7247907f0493","src/metrics/quantity.rs":"1315ae3216ebeec5b5a5baab88d63f88469875f538501e8320716516ef82bddf","src/metrics/rate.rs":"603cc45c149c7a27c93b6a80146bf43f8ce70d9655f905bb5be6bc2c15bcb22b","src/metrics/recorded_experiment.rs":"33958abee79d8b55dec4cb5d20742640423713010f76314075cefde18b5c118a","src/metrics/remote_settings_config.rs":"c85af9f9fef87ddfc578af4f2637c9bdcae18fbc6735ccc87a13a9b0ee0319ab","src/metrics/string.rs":"88beb1a847e5df9898b72ca7ed8ced3b7d2b40d83ff3670baf66f83a3e6cb005","src/metrics/string_list.rs":"ed53a095184c3e8224d0511809b5d7601ba3166505a39b0570f24ebeb0a5b97c","src/metrics/text.rs":"757f6919124d74e0512faa5bb9751a729b6bbc63ebe4d16ca81e9087f5595eaf","src/metrics/time_unit.rs":"4704703e19e799933aec3f39e3d3a125058756d7c7ba04f8729885c7843df447","src/metrics/timespan.rs":"e239c618f459c34f2799c73a4da3e3c6c0b2089ba42d584c2ddd12ed067586e6","src/metrics/timing_distribution.rs":"c61a2cd32a54e018b4b0bb60f030bada40fcbe68d6e6346eac8212cf416e14a3","src/metrics/url.rs":"589ae1f8047367ad8c19b57a48ca8130d5f36cf3ce5954124150f0eb89c620ea","src/metrics/uuid.rs":"cacffd95ab30ed327ec2fa5feaf1359e667706746401f1e2c1195ad9553c4b54","src/ping/mod.rs":"70c6f4966d760e95d450d60bc9e720dec4576febfc487de3634fefacd9f2d8e7","src/scheduler.rs":"eb8131ed075e2d92bf0dc0a2c2a7e67c73bb61042d574c21965b1699cd1239aa","src/storage/mod.rs":"91f02556f113799e0d88d732ab342bda443f43461369e8b41c424c074d742591","src/system.rs":"e3d1b54e1d39cafe6f4dc7ff5021b08c879733f909951b0e1332b3efa9ed97bd","src/traits/boolean.rs":"be0e130f8043215705becc956d45b126c340568f1b24a396c0af9b4334a41ced","src/traits/counter.rs":"c686d26e131d854cd7a7df83c900ca7c17a03c663a30cf58ab48c7259476ce85","src/traits/custom_distribution.rs":"0bd1d425e4c059cca6af2dfb13c78e5e4c6c07fb46c7e31489ad0c5959854833","src/traits/datetime.rs":"636ac1456b1b042e38cf5ae6193c5b232ea0b80df62f583a2097891baef9641b","src/traits/event.rs":"a02235aae630aba7a45a3166b756927252b397af3ecdfab7236931e62725ac49","src/traits/labeled.rs":"c633c68e70a44e73f8aff88aaab1029c0faded3cad08d822590ed8838f24b4fd","src/traits/memory_distribution.rs":"55bb8f45e948319fbba9d28a50d8742da134b066a42e480887db7c7e435f4096","src/traits/mod.rs":"3560fdf3b81dceabbac9d97b0356aa8f883e477dcb787c81a09529047fda7161","src/traits/numerator.rs":"6e4f236bdc448f1bde7a8c249dcd086204c2c69990d3f444e746290929226ed3","src/traits/object.rs":"c03bad670ec7affbc578247f9e1904e898c1870b9bf25750c5094113f995623f","src/traits/ping.rs":"8831c106c03afeb458b0b028fa1ce61f056ebf8e82bc0a171a1bff255d920748","src/traits/quantity.rs":"6ffe25c913bef4315573d747308c182de740b2a4e02ba22cd21d0c33ba521f31","src/traits/rate.rs":"f000790440e0f389f0b160526a9a9a266e58d1405915ae56ac550f482858222c","src/traits/string.rs":"0c3c88382ff2e8eba89c7cfe129c4b84e31140af717819533c14919541ad790c","src/traits/string_list.rs":"14e56b62c2c2be1dd8013f12001f235b084abd2a0d5aa2f7932843877af49ac0","src/traits/text.rs":"8af7d3a0c87cfd8c6d33d6ad47532b431055bbdd395f9110da5630222c23cf93","src/traits/timespan.rs":"52be325a9c061916f34c5b638a07a93b4a14aa89fe365783103d2e06b998f547","src/traits/timing_distribution.rs":"0d35acddd9e35a7f8859cf007162460b5fd0bf06d205cd195ed1c857bbe58c42","src/traits/url.rs":"c27f7add23214ff051078b65b88120b620560d2841a1056c7214d5237e86b9e4","src/traits/uuid.rs":"81322e71c7e847bacaf827a2cd58f6193bdc208355524207f7f38db039da6aa8","src/upload/directory.rs":"363ddc345845c2d543f833a5a63f1c778455e68b36ac77ffce605cef29f0d5cb","src/upload/mod.rs":"edae31e4c2172fb1e8e8b2c5542812b1e29c3bfa2f1c7b08227cb7cc4260dd48","src/upload/policy.rs":"c250957a37783e74af8002cd80ba06ef9780a389fb0f61b8b665b79688f0a360","src/upload/request.rs":"de5532fc3d18e773330c05fe000643d87b9c4912a2d838099b8783538c5033ed","src/upload/result.rs":"c956266c54595d27d5e8b11abffe28fad5fea82995922618805b66cfdcc21d54","src/util.rs":"ee7500434d9758a320dd410f18d7e18da956591e19d2555db87eef9623e4b916","tests/boolean.rs":"76d6014ff108cb6514d9bceb1b2b14749a55b09921f4595a5e30f1bd3546e9f0","tests/collection_enabled.rs":"85f4b2eb49ac23437ae225ae2c44f354c952c24b7c806e2f2ee5dbe78e02c8db","tests/common/mod.rs":"a8f74c906dccfe747d5cf9dd83dd6e4d1ef25d0402d39a2d74105cddab80e54c","tests/counter.rs":"4c59def10e64de0d7a0241dde0267fd02c828b38be8cc67fba90a76004ca6721","tests/custom_distribution.rs":"41c593a0b4561e21f29d1a5b948de964a866253c58ca76ffefebe370fca150e0","tests/datetime.rs":"ec3c9760e70bb2cbc61ab23281c891bc1ec493c5c545466c29fd13e4f05c2c96","tests/event.rs":"5db675dad1bcbcee0451bfe5e93f05f28d7ef8098d19cd302c8bac262567cf0c","tests/labeled.rs":"6f2c6489bcb297b2b64740712b4902e4997fb5c0ba9cb3552a5f6c1fddd45d2f","tests/memory_distribution.rs":"3d9a5b8f99e03f783e3396e4320ee4dc974c895cfef2cec0b14d2a9a9f9b736f","tests/object.rs":"8c35676e04f6ccf54a28764700915e753fc0355bfa5d7804d72caba66fd564cd","tests/ping.rs":"eff68d3b47b04c58d8123214dd66e8d06d11f82ed3fd4f703224f84effb319bb","tests/ping_maker.rs":"20954903888798f63ca83a03ba4703f60ee7ba40dce13f225e8d8e73425d3605","tests/quantity.rs":"55e7dca346fd1d27f0974b78ca3fb12427cb5da2ee637afc08a54f360f947361","tests/rate.rs":"94a3a7d0ccafea02a991ed9dd038cbfab8a534695b374b1ce6ed81285616e9f6","tests/storage.rs":"990dd1d13b9ffa8af0686977a6ac3502c6befb9eaa83649587e2660f51c596c9","tests/string.rs":"397fcfd27c25f0e81e2a40db3265b0d7dc0dd56b190319c1f86cb1c2c0ed4f9d","tests/string_list.rs":"34efa2afe3e89e6635f21ec9c80650d5816e35e9cb85163d894d600a5b3a4e3a","tests/text.rs":"1d43f6b90a43124311cacf0a6ee16f9e1e9263bcd11fee8b996d6efd81633638","tests/timespan.rs":"3d05739a93f3e0ea7264e8fdea876bd948714e5b44e82b8fd7c0218fdb597bb3","tests/timing_distribution.rs":"072ad950b2162e503150e411119b9a000573538bd2cff93c1c1a3616d1589ef4","tests/uuid.rs":"e0e58614319f5e973126f5b4e68d9289ccd6d65e428aca215bf7dcc8a0504889","uniffi.toml":"6ddc98b686b0925a81abd9d1c769e5c98ac29771b210a1c535931a46dec9a8e3"},"package":"a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753"} \ No newline at end of file +{"files":{"Cargo.toml":"ffc8000a6fb68eb9465dff661e40e43b95fef93cf874a03bc8c4bc9642c6e766","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"026495898699b54608eb4ec16074ffafc57920d80ccb59961c501a1ea28c9985","build.rs":"4857bea99c6b8c08db8818efa9d3738716f52d3acb68159323957ae52892a3eb","src/common_metric_data.rs":"02dd1628fed6587621c089952dd0cb80bed3c352cdacfb33be7e218ad1d847e9","src/core/mod.rs":"e749d51f05fcfc9651e4021cd90682dafc107e58db0083e1b48f8df277d4581c","src/core_metrics.rs":"fb9707a4df04113d84e7608a15a7a4fd6a826a97b9aad73ec3438a8cad92b4b0","src/coverage.rs":"49613fd310bd24d779472720975fbe6c97ec370a95eb55f10afa43f67539c942","src/database/mod.rs":"d9c01ecf92b69a0fe826abf1abf81569ab0dbe61d7f3d8c41201f3a21ac1b13b","src/debug.rs":"7bd9e199d0d5c8170f6dbb9a725a18eaca1df34309d32b02081574962a86816e","src/dispatcher/global.rs":"17493b1a5e926ca1e9c1cda2ee031773402a19183911eb80048630d60266d89e","src/dispatcher/mod.rs":"391310269947452d7e0de24c848c183110c60149d75e345ba6d5d146f222dace","src/error.rs":"b93c7d3e243b21bb9eafc95f17860aba1a942b2f2b0a7f43307690f05fece516","src/error_recording.rs":"32c1f58ff080cb22184bca37e356faadbfe846386880fb0898b773adb3a97d8c","src/event_database/mod.rs":"33519a9f648b6b8a014c23a47c8aa74420511027b9c6984e0c77a4e6192c02c6","src/fd_logger.rs":"0c9def6fa53db1a2ab93c85795f8a7df57797bcfd3978146923e151752e291a6","src/glean.udl":"74a2334177724f571eb6986015aa5514766472fccf1686e888baaa909881d6f2","src/glean_metrics.rs":"9414fb1453d19f6832df33e4c6ef7383d62203e47026bf5bc9552b083101ddd1","src/histogram/exponential.rs":"0f2c0857782d6910754a01438b1b4cd77bf0d3b847fd9ef969ba4da3705c5f5b","src/histogram/functional.rs":"22b2e64c3c1930e055beeebb832e3212e22b65b28e2ebb94c6bb3aff7ca31ba3","src/histogram/linear.rs":"bc33060cbbbb9c777539074cf5f788ab0f1a4ccecce0bf2cae2a697dd5089ea0","src/histogram/mod.rs":"c5eca9f6b0e1e309a7b41c2427d4c1da9c30e832d358d65ba347ba522abfd9c7","src/internal_metrics.rs":"54228cf409b4dd634fe0983f2619d2e0922efdd5fbce0f85a92454488967c854","src/internal_pings.rs":"3957a9fe256977a05d8d9e3beeec4c1fd08029db1c516fec4f6b59888e46ef39","src/lib.rs":"ac31e3136bd0077c33fe32554b39a0528a44396e4bb61d5a38b2978ffa52872b","src/lib_unit_tests.rs":"82ea06a5d6a8894c1670f99d0c236d8fa75eb9947fc8a1a53061a5e4c26b0b1d","src/metrics/boolean.rs":"2b9ef57e3582c9bd8b2cca8ab94c962a4871ecc00e837b913c9b0349ba9dff08","src/metrics/counter.rs":"b4a52a8167fb0edd6354f952525e59f3eadb4261de3483374f03c94449d30b92","src/metrics/custom_distribution.rs":"1ec4fd2ecebf547bef0ed28ae6854f641be447bcbf4066a8580f6af16a23e37f","src/metrics/datetime.rs":"e4405762fc71718299fa1b208e3d5fda654bd1b82fe908c884c284e3530de2ec","src/metrics/denominator.rs":"95e8442f90bad97f80fc74b146782f215344b52c5f3825ae0a8baffdc001a714","src/metrics/event.rs":"cd52e200d313e2e6f31707419d4a7fe1cab34916ee145f8136440d6da34aaad4","src/metrics/experiment.rs":"5f9278cca4e133eb8df33bbfe36d1fe0ef3eade8c09f1b46db3c4d0790515412","src/metrics/labeled.rs":"79acae98b7bd8536edcde5150c1402ed8560a8eb0ad5c04b79b7c67743d0aa71","src/metrics/memory_distribution.rs":"d3f02a6a78ed103024a2479975cd7617153e3f082e20f8f45c8e7afd052cec45","src/metrics/memory_unit.rs":"ee32e020cb303dd631457374048a3ed53a2e7cbacc29c54d17d836fb15507538","src/metrics/mod.rs":"777f89015c1642ed73536b07edc0763d179dbf608e2a0394439fe002cbc2fb53","src/metrics/numerator.rs":"937dfd583b797ac798a525cedca95c5a36262356760a89670d8113983c263154","src/metrics/object.rs":"2a1f1cc31973b576e55ba464b35c41b9420f62471eebba51273bca6856459538","src/metrics/ping.rs":"3b4524e8d17d55fe993746061636fb7d9566b51ac511765e173e7247907f0493","src/metrics/quantity.rs":"1315ae3216ebeec5b5a5baab88d63f88469875f538501e8320716516ef82bddf","src/metrics/rate.rs":"603cc45c149c7a27c93b6a80146bf43f8ce70d9655f905bb5be6bc2c15bcb22b","src/metrics/recorded_experiment.rs":"33958abee79d8b55dec4cb5d20742640423713010f76314075cefde18b5c118a","src/metrics/remote_settings_config.rs":"c85af9f9fef87ddfc578af4f2637c9bdcae18fbc6735ccc87a13a9b0ee0319ab","src/metrics/string.rs":"88beb1a847e5df9898b72ca7ed8ced3b7d2b40d83ff3670baf66f83a3e6cb005","src/metrics/string_list.rs":"ed53a095184c3e8224d0511809b5d7601ba3166505a39b0570f24ebeb0a5b97c","src/metrics/text.rs":"757f6919124d74e0512faa5bb9751a729b6bbc63ebe4d16ca81e9087f5595eaf","src/metrics/time_unit.rs":"4704703e19e799933aec3f39e3d3a125058756d7c7ba04f8729885c7843df447","src/metrics/timespan.rs":"e239c618f459c34f2799c73a4da3e3c6c0b2089ba42d584c2ddd12ed067586e6","src/metrics/timing_distribution.rs":"c61a2cd32a54e018b4b0bb60f030bada40fcbe68d6e6346eac8212cf416e14a3","src/metrics/url.rs":"589ae1f8047367ad8c19b57a48ca8130d5f36cf3ce5954124150f0eb89c620ea","src/metrics/uuid.rs":"cacffd95ab30ed327ec2fa5feaf1359e667706746401f1e2c1195ad9553c4b54","src/ping/mod.rs":"a4cc6b37443392aed79957a1b5d6943307e14bd3ead9fa9880c20aee48472ae2","src/scheduler.rs":"eb8131ed075e2d92bf0dc0a2c2a7e67c73bb61042d574c21965b1699cd1239aa","src/storage/mod.rs":"91f02556f113799e0d88d732ab342bda443f43461369e8b41c424c074d742591","src/system.rs":"e3d1b54e1d39cafe6f4dc7ff5021b08c879733f909951b0e1332b3efa9ed97bd","src/traits/boolean.rs":"be0e130f8043215705becc956d45b126c340568f1b24a396c0af9b4334a41ced","src/traits/counter.rs":"c686d26e131d854cd7a7df83c900ca7c17a03c663a30cf58ab48c7259476ce85","src/traits/custom_distribution.rs":"0bd1d425e4c059cca6af2dfb13c78e5e4c6c07fb46c7e31489ad0c5959854833","src/traits/datetime.rs":"636ac1456b1b042e38cf5ae6193c5b232ea0b80df62f583a2097891baef9641b","src/traits/event.rs":"a02235aae630aba7a45a3166b756927252b397af3ecdfab7236931e62725ac49","src/traits/labeled.rs":"1b2f8eea8d59e1635f64993936d880084a5e3f65cfd7a26ddf6968366890187d","src/traits/memory_distribution.rs":"55bb8f45e948319fbba9d28a50d8742da134b066a42e480887db7c7e435f4096","src/traits/mod.rs":"3560fdf3b81dceabbac9d97b0356aa8f883e477dcb787c81a09529047fda7161","src/traits/numerator.rs":"6e4f236bdc448f1bde7a8c249dcd086204c2c69990d3f444e746290929226ed3","src/traits/object.rs":"c03bad670ec7affbc578247f9e1904e898c1870b9bf25750c5094113f995623f","src/traits/ping.rs":"8831c106c03afeb458b0b028fa1ce61f056ebf8e82bc0a171a1bff255d920748","src/traits/quantity.rs":"6ffe25c913bef4315573d747308c182de740b2a4e02ba22cd21d0c33ba521f31","src/traits/rate.rs":"f000790440e0f389f0b160526a9a9a266e58d1405915ae56ac550f482858222c","src/traits/string.rs":"0c3c88382ff2e8eba89c7cfe129c4b84e31140af717819533c14919541ad790c","src/traits/string_list.rs":"14e56b62c2c2be1dd8013f12001f235b084abd2a0d5aa2f7932843877af49ac0","src/traits/text.rs":"8af7d3a0c87cfd8c6d33d6ad47532b431055bbdd395f9110da5630222c23cf93","src/traits/timespan.rs":"52be325a9c061916f34c5b638a07a93b4a14aa89fe365783103d2e06b998f547","src/traits/timing_distribution.rs":"0d35acddd9e35a7f8859cf007162460b5fd0bf06d205cd195ed1c857bbe58c42","src/traits/url.rs":"c27f7add23214ff051078b65b88120b620560d2841a1056c7214d5237e86b9e4","src/traits/uuid.rs":"81322e71c7e847bacaf827a2cd58f6193bdc208355524207f7f38db039da6aa8","src/upload/directory.rs":"363ddc345845c2d543f833a5a63f1c778455e68b36ac77ffce605cef29f0d5cb","src/upload/mod.rs":"edae31e4c2172fb1e8e8b2c5542812b1e29c3bfa2f1c7b08227cb7cc4260dd48","src/upload/policy.rs":"c250957a37783e74af8002cd80ba06ef9780a389fb0f61b8b665b79688f0a360","src/upload/request.rs":"de5532fc3d18e773330c05fe000643d87b9c4912a2d838099b8783538c5033ed","src/upload/result.rs":"c956266c54595d27d5e8b11abffe28fad5fea82995922618805b66cfdcc21d54","src/util.rs":"ee7500434d9758a320dd410f18d7e18da956591e19d2555db87eef9623e4b916","tests/boolean.rs":"76d6014ff108cb6514d9bceb1b2b14749a55b09921f4595a5e30f1bd3546e9f0","tests/collection_enabled.rs":"85f4b2eb49ac23437ae225ae2c44f354c952c24b7c806e2f2ee5dbe78e02c8db","tests/common/mod.rs":"a8f74c906dccfe747d5cf9dd83dd6e4d1ef25d0402d39a2d74105cddab80e54c","tests/counter.rs":"4c59def10e64de0d7a0241dde0267fd02c828b38be8cc67fba90a76004ca6721","tests/custom_distribution.rs":"41c593a0b4561e21f29d1a5b948de964a866253c58ca76ffefebe370fca150e0","tests/datetime.rs":"ec3c9760e70bb2cbc61ab23281c891bc1ec493c5c545466c29fd13e4f05c2c96","tests/event.rs":"5db675dad1bcbcee0451bfe5e93f05f28d7ef8098d19cd302c8bac262567cf0c","tests/labeled.rs":"3efddb05556e92a372f50a19b025ecf4ccd818c7c477250058db0706eb992079","tests/memory_distribution.rs":"3d9a5b8f99e03f783e3396e4320ee4dc974c895cfef2cec0b14d2a9a9f9b736f","tests/object.rs":"8c35676e04f6ccf54a28764700915e753fc0355bfa5d7804d72caba66fd564cd","tests/ping.rs":"eff68d3b47b04c58d8123214dd66e8d06d11f82ed3fd4f703224f84effb319bb","tests/ping_maker.rs":"64900bb24642127df559fa6ace4c7f0a4a4bf858321874c9b3758039df0ffa04","tests/quantity.rs":"55e7dca346fd1d27f0974b78ca3fb12427cb5da2ee637afc08a54f360f947361","tests/rate.rs":"94a3a7d0ccafea02a991ed9dd038cbfab8a534695b374b1ce6ed81285616e9f6","tests/storage.rs":"990dd1d13b9ffa8af0686977a6ac3502c6befb9eaa83649587e2660f51c596c9","tests/string.rs":"397fcfd27c25f0e81e2a40db3265b0d7dc0dd56b190319c1f86cb1c2c0ed4f9d","tests/string_list.rs":"34efa2afe3e89e6635f21ec9c80650d5816e35e9cb85163d894d600a5b3a4e3a","tests/text.rs":"1d43f6b90a43124311cacf0a6ee16f9e1e9263bcd11fee8b996d6efd81633638","tests/timespan.rs":"3d05739a93f3e0ea7264e8fdea876bd948714e5b44e82b8fd7c0218fdb597bb3","tests/timing_distribution.rs":"072ad950b2162e503150e411119b9a000573538bd2cff93c1c1a3616d1589ef4","tests/uuid.rs":"e0e58614319f5e973126f5b4e68d9289ccd6d65e428aca215bf7dcc8a0504889","uniffi.toml":"6ddc98b686b0925a81abd9d1c769e5c98ac29771b210a1c535931a46dec9a8e3"},"package":"5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e"} \ No newline at end of file diff --git a/third_party/rust/glean-core/Cargo.toml b/third_party/rust/glean-core/Cargo.toml index f4a8c1f6e9c..32ff1696c18 100644 --- a/third_party/rust/glean-core/Cargo.toml +++ b/third_party/rust/glean-core/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.82" name = "glean-core" -version = "64.0.1" +version = "64.1.1" authors = [ "Jan-Erik Rediger ", "The Glean Team ", @@ -40,7 +40,7 @@ license = "MPL-2.0" repository = "https://github.com/mozilla/glean" [package.metadata.glean] -glean-parser = "17.0.1" +glean-parser = "17.1.0" [lib] name = "glean_core" diff --git a/third_party/rust/glean-core/src/core/mod.rs b/third_party/rust/glean-core/src/core/mod.rs index 302f90d134e..d60af5363dc 100644 --- a/third_party/rust/glean-core/src/core/mod.rs +++ b/third_party/rust/glean-core/src/core/mod.rs @@ -24,8 +24,9 @@ use crate::storage::{StorageManager, INTERNAL_STORAGE}; use crate::upload::{PingUploadManager, PingUploadTask, UploadResult, UploadTaskAction}; use crate::util::{local_now_with_offset, sanitize_application_id}; use crate::{ - scheduler, system, CommonMetricData, ErrorKind, InternalConfiguration, Lifetime, PingRateLimit, - Result, DEFAULT_MAX_EVENTS, GLEAN_SCHEMA_VERSION, GLEAN_VERSION, KNOWN_CLIENT_ID, + scheduler, system, AttributionMetrics, CommonMetricData, DistributionMetrics, ErrorKind, + InternalConfiguration, Lifetime, PingRateLimit, Result, DEFAULT_MAX_EVENTS, + GLEAN_SCHEMA_VERSION, GLEAN_VERSION, KNOWN_CLIENT_ID, }; static GLEAN: OnceCell> = OnceCell::new(); @@ -1084,4 +1085,76 @@ impl Glean { scheduler::schedule(self); } } + + /// Updates attribution fields with new values. + /// AttributionMetrics fields with `None` values will not overwrite older values. + pub fn update_attribution(&self, attribution: AttributionMetrics) { + if let Some(source) = attribution.source { + self.core_metrics.attribution_source.set_sync(self, source); + } + if let Some(medium) = attribution.medium { + self.core_metrics.attribution_medium.set_sync(self, medium); + } + if let Some(campaign) = attribution.campaign { + self.core_metrics + .attribution_campaign + .set_sync(self, campaign); + } + if let Some(term) = attribution.term { + self.core_metrics.attribution_term.set_sync(self, term); + } + if let Some(content) = attribution.content { + self.core_metrics + .attribution_content + .set_sync(self, content); + } + } + + /// **TEST-ONLY Method** + /// + /// Returns the current attribution metrics. + pub fn test_get_attribution(&self) -> AttributionMetrics { + AttributionMetrics { + source: self + .core_metrics + .attribution_source + .get_value(self, Some("glean_client_info")), + medium: self + .core_metrics + .attribution_medium + .get_value(self, Some("glean_client_info")), + campaign: self + .core_metrics + .attribution_campaign + .get_value(self, Some("glean_client_info")), + term: self + .core_metrics + .attribution_term + .get_value(self, Some("glean_client_info")), + content: self + .core_metrics + .attribution_content + .get_value(self, Some("glean_client_info")), + } + } + + /// Updates distribution fields with new values. + /// DistributionMetrics fields with `None` values will not overwrite older values. + pub fn update_distribution(&self, distribution: DistributionMetrics) { + if let Some(name) = distribution.name { + self.core_metrics.distribution_name.set_sync(self, name); + } + } + + /// **TEST-ONLY Method** + /// + /// Returns the current distribution metrics. + pub fn test_get_distribution(&self) -> DistributionMetrics { + DistributionMetrics { + name: self + .core_metrics + .distribution_name + .get_value(self, Some("glean_client_info")), + } + } } diff --git a/third_party/rust/glean-core/src/core_metrics.rs b/third_party/rust/glean-core/src/core_metrics.rs index baa2b8515bc..c3ed9f2ec45 100644 --- a/third_party/rust/glean-core/src/core_metrics.rs +++ b/third_party/rust/glean-core/src/core_metrics.rs @@ -42,6 +42,58 @@ pub struct ClientInfoMetrics { pub locale: Option, } +/// Optional product attribution metrics carried in `client_info.attribution`. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct AttributionMetrics { + /// The attribution source (e.g. "google-play"). + pub source: Option, + /// The attribution medium (e.g. "organic" for a search engine). + pub medium: Option, + /// The attribution campaign (e.g. "mozilla-org"). + pub campaign: Option, + /// The attribution term (e.g. "browser with developer tools for android"). + pub term: Option, + /// The attribution content (e.g. "firefoxview"). + pub content: Option, +} + +impl AttributionMetrics { + /// Update self with any non-`None` fields from `other`. + pub fn update(&mut self, other: AttributionMetrics) { + if let Some(source) = other.source { + self.source = Some(source); + } + if let Some(medium) = other.medium { + self.medium = Some(medium); + } + if let Some(campaign) = other.campaign { + self.campaign = Some(campaign); + } + if let Some(term) = other.term { + self.term = Some(term); + } + if let Some(content) = other.content { + self.content = Some(content); + } + } +} + +/// Optional product distribution metrics carried in `client_info.distribution`. +#[derive(Clone, Debug, Default, PartialEq)] +pub struct DistributionMetrics { + /// The distribution name (e.g. "MozillaOnline"). + pub name: Option, +} + +impl DistributionMetrics { + /// Update self with any non-`None` fields from `other`. + pub fn update(&mut self, other: DistributionMetrics) { + if let Some(name) = other.name { + self.name = Some(name); + } + } +} + /// Metrics included in every ping as `client_info`. impl ClientInfoMetrics { /// Creates the client info with dummy values for all. @@ -204,3 +256,62 @@ pub mod internal_metrics { ) }); } + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn update_attribution() { + let mut attr: AttributionMetrics = Default::default(); + let empty: AttributionMetrics = Default::default(); + + // Ensure the identity operation works. + attr.update(empty.clone()); + assert_eq!(None, attr.source); + + // Ensure simple updates work. + attr.update(AttributionMetrics { + source: Some("a source".into()), + ..Default::default() + }); + assert_eq!(Some("a source".into()), attr.source); + + // Ensure None doesn't overwrite. + attr.update(empty); + assert_eq!(Some("a source".into()), attr.source); + + // Ensure updates of Some work. + attr.update(AttributionMetrics { + source: Some("another source".into()), + ..Default::default() + }); + assert_eq!(Some("another source".into()), attr.source); + } + + #[test] + fn update_distribution() { + let mut dist: DistributionMetrics = Default::default(); + let empty: DistributionMetrics = Default::default(); + + // Ensure the identity operation works. + dist.update(empty.clone()); + assert_eq!(None, dist.name); + + // Ensure simple updates work. + dist.update(DistributionMetrics { + name: Some("a name".into()), + }); + assert_eq!(Some("a name".into()), dist.name); + + // Ensure None doesn't overwrite. + dist.update(empty); + assert_eq!(Some("a name".into()), dist.name); + + // Ensure updates of Some work. + dist.update(DistributionMetrics { + name: Some("another name".into()), + }); + assert_eq!(Some("another name".into()), dist.name); + } +} diff --git a/third_party/rust/glean-core/src/glean.udl b/third_party/rust/glean-core/src/glean.udl index d8f3aa17905..fb7cdfe69e2 100644 --- a/third_party/rust/glean-core/src/glean.udl +++ b/third_party/rust/glean-core/src/glean.udl @@ -71,6 +71,18 @@ namespace glean { PingUploadTask glean_get_upload_task(); UploadTaskAction glean_process_ping_upload_response(string uuid, UploadResult result); + + // Updates attribution fields with new values. + // AttributionMetrics fields with no values will not overwrite older values. + void glean_update_attribution(AttributionMetrics attribution); + // Returns the current attribution metrics, if any. + AttributionMetrics glean_test_get_attribution(); + + // Updates distribution fields with new values. + // DistributionMetrics fields with no values will not overwrite older values. + void glean_update_distribution(DistributionMetrics distribution); + // Returns the current distribution metrics, if any. + DistributionMetrics glean_test_get_distribution(); }; // A `Cow<'static, str>`, but really it's always the owned part. @@ -138,6 +150,18 @@ dictionary ClientInfoMetrics { i64? windows_build_number = null; }; +dictionary AttributionMetrics { + string? source = null; + string? medium = null; + string? campaign = null; + string? term = null; + string? content = null; +}; + +dictionary DistributionMetrics { + string? name = null; +}; + [Error] enum CallbackError { "UnexpectedError", diff --git a/third_party/rust/glean-core/src/internal_metrics.rs b/third_party/rust/glean-core/src/internal_metrics.rs index 7c0f697eed6..372ec32a9ad 100644 --- a/third_party/rust/glean-core/src/internal_metrics.rs +++ b/third_party/rust/glean-core/src/internal_metrics.rs @@ -11,6 +11,12 @@ pub struct CoreMetrics { pub client_id: UuidMetric, pub first_run_date: DatetimeMetric, pub os: StringMetric, + pub attribution_source: StringMetric, + pub attribution_medium: StringMetric, + pub attribution_campaign: StringMetric, + pub attribution_term: StringMetric, + pub attribution_content: StringMetric, + pub distribution_name: StringMetric, } #[derive(Debug)] @@ -65,6 +71,60 @@ impl CoreMetrics { disabled: false, dynamic_label: None, }), + + attribution_source: StringMetric::new(CommonMetricData { + name: "source".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_medium: StringMetric::new(CommonMetricData { + name: "medium".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_campaign: StringMetric::new(CommonMetricData { + name: "campaign".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_term: StringMetric::new(CommonMetricData { + name: "term".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + attribution_content: StringMetric::new(CommonMetricData { + name: "content".into(), + category: "attribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), + + distribution_name: StringMetric::new(CommonMetricData { + name: "name".into(), + category: "distribution".into(), + send_in_pings: vec!["glean_client_info".into()], + lifetime: Lifetime::User, + disabled: false, + dynamic_label: None, + }), } } } diff --git a/third_party/rust/glean-core/src/lib.rs b/third_party/rust/glean-core/src/lib.rs index aac594e2099..50da8bb8dfa 100644 --- a/third_party/rust/glean-core/src/lib.rs +++ b/third_party/rust/glean-core/src/lib.rs @@ -59,7 +59,7 @@ mod fd_logger; pub use crate::common_metric_data::{CommonMetricData, Lifetime}; pub use crate::core::Glean; -pub use crate::core_metrics::ClientInfoMetrics; +pub use crate::core_metrics::{AttributionMetrics, ClientInfoMetrics, DistributionMetrics}; pub use crate::error::{Error, ErrorKind, Result}; pub use crate::error_recording::{test_get_num_recorded_errors, ErrorType}; pub use crate::histogram::HistogramType; @@ -102,6 +102,10 @@ static PRE_INIT_SOURCE_TAGS: Mutex> = Mutex::new(Vec::new()); static PRE_INIT_PING_REGISTRATION: Mutex> = Mutex::new(Vec::new()); static PRE_INIT_PING_ENABLED: Mutex> = Mutex::new(Vec::new()); +/// Keep track of attribution and distribution supplied before Glean is initialized. +static PRE_INIT_ATTRIBUTION: Mutex> = Mutex::new(None); +static PRE_INIT_DISTRIBUTION: Mutex> = Mutex::new(None); + /// Global singleton of the handles of the glean.init threads. /// For joining. For tests. /// (Why a Vec? There might be more than one concurrent call to initialize.) @@ -448,6 +452,15 @@ fn initialize_inner( glean.set_ping_enabled(ping, *enabled); } + // The attribution and distribution might have been set before initialize, + // take the cached values and set them. + if let Some(attribution) = PRE_INIT_ATTRIBUTION.lock().unwrap().take() { + glean.update_attribution(attribution); + } + if let Some(distribution) = PRE_INIT_DISTRIBUTION.lock().unwrap().take() { + glean.update_distribution(distribution); + } + // If this is the first time ever the Glean SDK runs, make sure to set // some initial core metrics in case we need to generate early pings. // The next times we start, we would have them around already. @@ -874,7 +887,7 @@ pub fn glean_set_collection_enabled(enabled: bool) { /// and all pending pings of that type to be deleted. pub fn set_ping_enabled(ping: &PingType, enabled: bool) { let ping = ping.clone(); - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(move |glean| glean.set_ping_enabled(&ping, enabled)); } else { let m = &PRE_INIT_PING_ENABLED; @@ -889,7 +902,7 @@ pub(crate) fn register_ping_type(ping: &PingType) { // we dispatch ping registration on the thread pool. // Registering a ping should not block the application. // Submission itself is also dispatched, so it will always come after the registration. - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { let ping = ping.clone(); crate::launch_with_glean_mut(move |glean| { glean.register_ping_type(&ping); @@ -1003,7 +1016,7 @@ pub fn glean_apply_server_knobs_config(json: String) { /// This will return `false` in case `tag` is not a valid tag and `true` otherwise. /// If called before Glean is initialized it will always return `true`. pub fn glean_set_debug_view_tag(tag: String) -> bool { - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(move |glean| { glean.set_debug_view_tag(&tag); }); @@ -1041,7 +1054,7 @@ pub fn glean_get_debug_view_tag() -> Option { /// * `tags` - A vector of at most 5 valid HTTP header values. Individual /// tags must match the regex: "[a-zA-Z0-9-]{1,20}". pub fn glean_set_source_tags(tags: Vec) -> bool { - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(|glean| { glean.set_source_tags(tags); }); @@ -1066,7 +1079,7 @@ pub fn glean_set_source_tags(tags: Vec) -> bool { /// /// * `value` - The value of the log pings option pub fn glean_set_log_pings(value: bool) { - if was_initialize_called() { + if was_initialize_called() && core::global_glean().is_some() { crate::launch_with_glean_mut(move |glean| { glean.set_log_pings(value); }); @@ -1163,7 +1176,8 @@ pub fn glean_submit_ping_by_name_sync(ping_name: String, reason: Option) return false; } - core::with_glean(|glean| glean.submit_ping_by_name(&ping_name, reason.as_deref())) + core::with_opt_glean(|glean| glean.submit_ping_by_name(&ping_name, reason.as_deref())) + .unwrap_or(false) } /// EXPERIMENTAL: Register a listener object to recieve notifications of event recordings. @@ -1255,6 +1269,52 @@ pub fn glean_set_dirty_flag(new_value: bool) { core::with_glean(|glean| glean.set_dirty_flag(new_value)) } +/// Updates attribution fields with new values. +/// AttributionMetrics fields with `None` values will not overwrite older values. +pub fn glean_update_attribution(attribution: AttributionMetrics) { + if was_initialize_called() && core::global_glean().is_some() { + core::with_glean(|glean| glean.update_attribution(attribution)); + } else { + PRE_INIT_ATTRIBUTION + .lock() + .unwrap() + .get_or_insert(Default::default()) + .update(attribution); + } +} + +/// **TEST-ONLY Method** +/// +/// Returns the current attribution metrics. +/// Panics if called before init. +pub fn glean_test_get_attribution() -> AttributionMetrics { + join_init(); + core::with_glean(|glean| glean.test_get_attribution()) +} + +/// Updates distribution fields with new values. +/// DistributionMetrics fields with `None` values will not overwrite older values. +pub fn glean_update_distribution(distribution: DistributionMetrics) { + if was_initialize_called() && core::global_glean().is_some() { + core::with_glean(|glean| glean.update_distribution(distribution)); + } else { + PRE_INIT_DISTRIBUTION + .lock() + .unwrap() + .get_or_insert(Default::default()) + .update(distribution); + } +} + +/// **TEST-ONLY Method** +/// +/// Returns the current distribution metrics. +/// Panics if called before init. +pub fn glean_test_get_distribution() -> DistributionMetrics { + join_init(); + core::with_glean(|glean| glean.test_get_distribution()) +} + #[cfg(all(not(target_os = "android"), not(target_os = "ios")))] static FD_LOGGER: OnceCell = OnceCell::new(); diff --git a/third_party/rust/glean-core/src/lib_unit_tests.rs b/third_party/rust/glean-core/src/lib_unit_tests.rs index 005cf92b416..5b17597f3e4 100644 --- a/third_party/rust/glean-core/src/lib_unit_tests.rs +++ b/third_party/rust/glean-core/src/lib_unit_tests.rs @@ -396,6 +396,58 @@ fn client_id_is_set_to_random_value_when_uploading_enabled_at_start() { assert_ne!(*KNOWN_CLIENT_ID, current_client_id.unwrap()); } +#[test] +fn attribution_and_distribution_are_correctly_stored() { + let dir = tempfile::tempdir().unwrap(); + let tmpname = dir.path().display().to_string(); + let glean = Glean::with_options(&tmpname, GLOBAL_APPLICATION_ID, true, true); + + // On a fresh Glean, no attribution or distribution information is set. + assert_eq!( + ::default(), + glean.test_get_attribution() + ); + assert_eq!( + ::default(), + glean.test_get_distribution() + ); + + let mut attribution = AttributionMetrics { + source: Some("source".into()), + medium: Some("medium".into()), + campaign: Some("campaign".into()), + term: Some("term".into()), + content: Some("content".into()), + }; + let distribution = DistributionMetrics { + name: Some("name".into()), + }; + + // Set them all at once. + glean.update_attribution(attribution.clone()); + glean.update_distribution(distribution.clone()); + + assert_eq!(attribution, glean.test_get_attribution()); + assert_eq!(distribution, glean.test_get_distribution()); + + let attribution_update = AttributionMetrics { + campaign: Some("new campaign".into()), + ..Default::default() + }; + let distribution_update = DistributionMetrics { + name: Some("new name".into()), + }; + + // Perform updates. + glean.update_attribution(attribution_update); + glean.update_distribution(distribution_update.clone()); + + // Ensure only the updated fields took over + attribution.campaign = Some("new campaign".into()); + assert_eq!(attribution, glean.test_get_attribution()); + assert_eq!(distribution_update, glean.test_get_distribution()); +} + #[test] fn enabling_when_already_enabled_is_a_noop() { let dir = tempfile::tempdir().unwrap(); diff --git a/third_party/rust/glean-core/src/metrics/labeled.rs b/third_party/rust/glean-core/src/metrics/labeled.rs index 4824a6999d0..fd15e4c18b8 100644 --- a/third_party/rust/glean-core/src/metrics/labeled.rs +++ b/third_party/rust/glean-core/src/metrics/labeled.rs @@ -17,7 +17,7 @@ use crate::Glean; const MAX_LABELS: usize = 16; const OTHER_LABEL: &str = "__other__"; -const MAX_LABEL_LENGTH: usize = 71; +const MAX_LABEL_LENGTH: usize = 111; /// A labeled counter. pub type LabeledCounter = LabeledMetric; @@ -265,7 +265,7 @@ where /// only the first 16 unique labels will be used. /// After that, any additional labels will be recorded under the special `OTHER_LABEL` label. /// - /// Labels must be `snake_case` and less than 30 characters. + /// Labels must have a maximum of 111 characters, and may comprise any printable ASCII characters. /// If an invalid label is used, the metric will be recorded in the special `OTHER_LABEL` label. pub fn get>(&self, label: S) -> Arc { let label = label.as_ref(); diff --git a/third_party/rust/glean-core/src/ping/mod.rs b/third_party/rust/glean-core/src/ping/mod.rs index 089c38d8caf..cd52427c474 100644 --- a/third_party/rust/glean-core/src/ping/mod.rs +++ b/third_party/rust/glean-core/src/ping/mod.rs @@ -176,8 +176,36 @@ impl PingMaker { StorageManager.snapshot_as_json(glean.storage(), "glean_client_info", true) { let client_info_obj = client_info.as_object().unwrap(); // safe unwrap, snapshot always returns an object. - for (_key, value) in client_info_obj { - merge(&mut map, value); + for (_metric_type, metrics) in client_info_obj { + merge(&mut map, metrics); + } + let map = map.as_object_mut().unwrap(); // safe unwrap, we created the object above. + let mut attribution = serde_json::Map::new(); + let mut distribution = serde_json::Map::new(); + map.retain(|name, value| { + // Only works because we ensure no client_info metric categories contain '.'. + let mut split = name.split('.'); + let category = split.next(); + let name = split.next(); + if let (Some(category), Some(name)) = (category, name) { + if category == "attribution" { + attribution.insert(name.into(), value.take()); + false + } else if category == "distribution" { + distribution.insert(name.into(), value.take()); + false + } else { + true + } + } else { + true + } + }); + if !attribution.is_empty() { + map.insert("attribution".into(), serde_json::Value::from(attribution)); + } + if !distribution.is_empty() { + map.insert("distribution".into(), serde_json::Value::from(distribution)); } } else { log::warn!("Empty client info data."); diff --git a/third_party/rust/glean-core/src/traits/labeled.rs b/third_party/rust/glean-core/src/traits/labeled.rs index 2979ee2ee90..54f937a2386 100644 --- a/third_party/rust/glean-core/src/traits/labeled.rs +++ b/third_party/rust/glean-core/src/traits/labeled.rs @@ -21,7 +21,7 @@ where /// only the first 16 unique labels will be used. /// After that, any additional labels will be recorded under the special `OTHER_LABEL` label. /// - /// Labels must be `snake_case` and less than 30 characters. + /// Labels must have a maximum of 111 characters, and may comprise any printable ASCII characters. /// If an invalid label is used, the metric will be recorded in the special `OTHER_LABEL` label. fn get(&self, label: &str) -> T; diff --git a/third_party/rust/glean-core/tests/labeled.rs b/third_party/rust/glean-core/tests/labeled.rs index 69687d3737f..bd999c4d515 100644 --- a/third_party/rust/glean-core/tests/labeled.rs +++ b/third_party/rust/glean-core/tests/labeled.rs @@ -387,7 +387,7 @@ fn dynamic_labels_too_long() { None, ); - let metric = labeled.get("1".repeat(72)); + let metric = labeled.get("1".repeat(112)); metric.add_sync(&glean, 1); let snapshot = StorageManager diff --git a/third_party/rust/glean-core/tests/ping_maker.rs b/third_party/rust/glean-core/tests/ping_maker.rs index 2d51f648b4d..6cd15b62f47 100644 --- a/third_party/rust/glean-core/tests/ping_maker.rs +++ b/third_party/rust/glean-core/tests/ping_maker.rs @@ -4,6 +4,8 @@ mod common; use crate::common::*; +use glean_core::{AttributionMetrics, DistributionMetrics}; +use serde_json::json; use glean_core::metrics::*; use glean_core::ping::PingMaker; @@ -306,3 +308,69 @@ fn metadata_is_correctly_added_when_necessary() { let headers = metadata.as_ref().unwrap().get("headers").unwrap(); assert_eq!(headers.get("X-Debug-ID").unwrap(), "valid-tag"); } + +#[test] +fn attribution_and_distribution_appear_in_client_info() { + let (glean, ping_maker, ping_type, _t) = set_up_basic_ping(); + + let attribution = AttributionMetrics { + source: Some("source".into()), + medium: Some("medium".into()), + campaign: Some("campaign".into()), + term: Some("term".into()), + content: Some("content".into()), + }; + let distribution = DistributionMetrics { + name: Some("name".into()), + }; + glean.update_attribution(attribution); + glean.update_distribution(distribution); + + let ping = ping_maker + .collect(&glean, &ping_type, None, "", "") + .unwrap(); + let client_info = ping.content["client_info"].as_object().unwrap(); + + assert_eq!(json!({"name": "name"}), client_info["distribution"]); + assert_eq!( + json!({ + "source": "source", + "medium": "medium", + "campaign": "campaign", + "term": "term", + "content": "content", + }), + client_info["attribution"] + ); + + // Now let's test updated values. + let attribution_update = AttributionMetrics { + content: Some("what a boring word".into()), + ..Default::default() + }; + let distribution_update = DistributionMetrics { + name: Some("what's in a name".into()), + }; + glean.update_attribution(attribution_update); + glean.update_distribution(distribution_update); + + let ping = ping_maker + .collect(&glean, &ping_type, None, "", "") + .unwrap(); + let client_info = ping.content["client_info"].as_object().unwrap(); + + assert_eq!( + json!({"name": "what's in a name"}), + client_info["distribution"] + ); + assert_eq!( + json!({ + "source": "source", + "medium": "medium", + "campaign": "campaign", + "term": "term", + "content": "what a boring word", + }), + client_info["attribution"] + ); +} diff --git a/third_party/rust/glean/.cargo-checksum.json b/third_party/rust/glean/.cargo-checksum.json index 794bfa5e8c9..ad172ae53bd 100644 --- a/third_party/rust/glean/.cargo-checksum.json +++ b/third_party/rust/glean/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"61c7d6620026e84a7bb067305d92ffb8c51a59261c339d3ef6a8406d03bbfd92","Cargo.toml":"bec966c61ac0670d367556c54f9156aad7b2cd72dce2d09c783fdf421f49c563","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"5627cc81e6187ab6c2b4dff061af16d559edcab64ba786bac39daa69c703c595","src/common_test.rs":"c86cccfb7da1506cfed29cb2ee13d839b7ac7cffdfd70793c9665bb44e0b684f","src/configuration.rs":"de65ab99a26b4547be20803bc195cb50a6ab40b1a3f49a2e6230fed5a9d7a8d8","src/core_metrics.rs":"fef8fb4e5fa57c179836c6eb2cf59278fe3b8b036dbe57b0ff02971b4acd822f","src/lib.rs":"61b56a35c2bc6cd60bba2225b399881512d4b9a7d8cadca7fbed37ee6959d74c","src/net/http_uploader.rs":"0a94ac3cd87cb021529dee46d537765ab8d923e0f4ac7615225e878d3739e6dc","src/net/mod.rs":"09ba010b03d045fd8a2ccbe4f205c5275bb622bceb34cb81a0aa8f7d33804e2e","src/private/event.rs":"f299c79e4e2acb657f06004f3038bd8909e287719458566bc7f96262d8665e62","src/private/mod.rs":"66e90c41de74d1e80c5d3f49b8f1a86b8396be0b8c4a80f1a28903fe6d105ecf","src/private/object.rs":"7f17a7a658e8f7aa19a6bedf70f60f3f42713316d5d60298d682bb045caaafb7","src/private/ping.rs":"d2fb45e9e178ff6b17aa9c1b5258dfcd2ed91a2b43b44dec826de256ef5e8520","src/system.rs":"d602804a72258bfd65e51c571946631732ee27d81342d8aa406e47fdd241bbfa","src/test.rs":"bfbea9416dfdc96ebc1f9af5005b5b23f2285b74ef82c74cdab11635322ea3e3","tests/collection_enabled.rs":"3327a949dbdeec493d661261abda68ffa71acc50ab24cba4fde5302749e6f16b","tests/collection_enabled_bin.rs":"d3a6458b84012a447e5cb792f2292a06951ed252fad803b9166b437bacba542c","tests/common/mod.rs":"2fd391c5eb45f56fdfa3261dd631406c67ed36b10b0d5432febe2483da5c9d89","tests/custom_distribution_buffered.rs":"47c13d1f39adf3881e10caa19e0c08235f08958809e234bf37a79d37d7322cd5","tests/init_fails.rs":"ca7fa1b3dd6a21a9e005b7a4f0a18664c4bceb952dd463db8316500f72280d5b","tests/interruptible_shutdown.rs":"3d954bbe47d4f5fd103c51a4ff99f151662143c25c826da9734a00cd215909b9","tests/memory_distribution_buffered.rs":"db487475a5cf17a0864ccf150984ebdd28bf616573772cf678246cc1bdbcbc0f","tests/metric_metadata.rs":"05c947d3decf0a3281378dbb108080a05319ad8f130af5b07f9b049b80e5f04f","tests/near-empty-c0ffee-db.safe.bin":"89afb3bb8fc94430fb0ed0fe55f85f3f8bcc8fd0fed69a9df13cc560294ec9f5","tests/never_init.rs":"51fff5618f6603bc0945d70131698d10a1c6275f43bbc22a2de5807f8a79229f","tests/no_time_to_init.rs":"2ede23df6618ff1cb5ae3b7bbf95900ad0fd92072afa2e0319bf147b4f75cefc","tests/overflowing_preinit.rs":"985e140460a100986fd051ce901b787a3a7a9747a856cd06066b740ac7d2381c","tests/persist_ping_lifetime_nopanic.rs":"18379d3ffbf4a2c8c684c04ff7a0660b86dfbbb447db2d24dfed6073cb7ddf8f","tests/schema.rs":"23b49005402b914e55a0c5c155f30c2662c609f79be78d1385ec25b3600b3547","tests/simple.rs":"15c76a1b5a336fd6abfbdebafc971f5c6a9b75107ddbca65f0031cde3e2886da","tests/test-delayed-ping-data.sh":"4a6db98b4df6b77898ace6a8b4e8b4c60d3e5c44873bbf38c62e83583e27a3ff","tests/test-enabled-pings.sh":"06656e38f63e65475006b107dd6bd179b0cbaa1fad1470de38e679e91a9315a3","tests/test-pending-gets-removed.sh":"e335f2f00fa97a61b6d94e0005fb3b9de8c8db8076111a67ca47d85392039ea9","tests/test-ping-lifetime-flush.sh":"e8f118ea2f6fd973809e38d5e828a03cfccfe0b0f497ccde5ec92d6d1380c071","tests/test-shutdown-blocking.sh":"a44d8d4bbe2ee3ede9e48121150ae7a5386025160c5cef2181ca142232c5fb27","tests/test-thread-crashing.sh":"f3cd0cc8a7b4fe82bef0fe6fbfbbe45fbad6da3afe0f82578bc5cfb2d6527ac6","tests/timing_distribution_buffered.rs":"501f7289c0c28f0ab83838c88b058999b19436d0f2b693be0787513d7b67e06d","tests/timing_distribution_single_sample.rs":"4f9498b6ef29913da0356027efe5f572c81d2f426e8538c068b54a1cfa33c1b8","tests/upload_timing.rs":"b3b9db197bc2ec41556388969a6bf289e7ef19e05b9019bc2bd98c823fcf6ea3","tests/uploader_capabilities.rs":"347f19e534a50a211ea179d6818631270d1b4ec468098e6b6abcde1e4a6a9bca"},"package":"251b9cb685554b96dcf785dba69ce90447006dd6d9229db783336c981c3777e1"} \ No newline at end of file +{"files":{"Cargo.lock":"add20d32d164cac0a56ddac41468eaf0b23b9616f32e94a8434f5841d14b3a97","Cargo.toml":"99107d6ac4ef4ff33e2d206e8498875df879001e4621ba94e9d4ccf14267f39c","LICENSE":"1f256ecad192880510e84ad60474eab7589218784b9a50bc7ceee34c2b91f1d5","README.md":"5627cc81e6187ab6c2b4dff061af16d559edcab64ba786bac39daa69c703c595","src/common_test.rs":"c86cccfb7da1506cfed29cb2ee13d839b7ac7cffdfd70793c9665bb44e0b684f","src/configuration.rs":"de65ab99a26b4547be20803bc195cb50a6ab40b1a3f49a2e6230fed5a9d7a8d8","src/core_metrics.rs":"fef8fb4e5fa57c179836c6eb2cf59278fe3b8b036dbe57b0ff02971b4acd822f","src/lib.rs":"998359d04ba0f71aaa360b8999c716f22c9efaf1ff4e1fdce80f1d3af5e584b0","src/net/http_uploader.rs":"0a94ac3cd87cb021529dee46d537765ab8d923e0f4ac7615225e878d3739e6dc","src/net/mod.rs":"09ba010b03d045fd8a2ccbe4f205c5275bb622bceb34cb81a0aa8f7d33804e2e","src/private/event.rs":"f299c79e4e2acb657f06004f3038bd8909e287719458566bc7f96262d8665e62","src/private/mod.rs":"66e90c41de74d1e80c5d3f49b8f1a86b8396be0b8c4a80f1a28903fe6d105ecf","src/private/object.rs":"7f17a7a658e8f7aa19a6bedf70f60f3f42713316d5d60298d682bb045caaafb7","src/private/ping.rs":"d2fb45e9e178ff6b17aa9c1b5258dfcd2ed91a2b43b44dec826de256ef5e8520","src/system.rs":"d602804a72258bfd65e51c571946631732ee27d81342d8aa406e47fdd241bbfa","src/test.rs":"8ff4d5072d23d9fbf5444e474d21b41a31e86a37e2a25fc2f2a92976e7642cbb","tests/collection_enabled.rs":"3327a949dbdeec493d661261abda68ffa71acc50ab24cba4fde5302749e6f16b","tests/collection_enabled_bin.rs":"d3a6458b84012a447e5cb792f2292a06951ed252fad803b9166b437bacba542c","tests/common/mod.rs":"2fd391c5eb45f56fdfa3261dd631406c67ed36b10b0d5432febe2483da5c9d89","tests/custom_distribution_buffered.rs":"47c13d1f39adf3881e10caa19e0c08235f08958809e234bf37a79d37d7322cd5","tests/init_fails.rs":"ca7fa1b3dd6a21a9e005b7a4f0a18664c4bceb952dd463db8316500f72280d5b","tests/interruptible_shutdown.rs":"3d954bbe47d4f5fd103c51a4ff99f151662143c25c826da9734a00cd215909b9","tests/memory_distribution_buffered.rs":"db487475a5cf17a0864ccf150984ebdd28bf616573772cf678246cc1bdbcbc0f","tests/metric_metadata.rs":"05c947d3decf0a3281378dbb108080a05319ad8f130af5b07f9b049b80e5f04f","tests/near-empty-c0ffee-db.safe.bin":"89afb3bb8fc94430fb0ed0fe55f85f3f8bcc8fd0fed69a9df13cc560294ec9f5","tests/never_init.rs":"51fff5618f6603bc0945d70131698d10a1c6275f43bbc22a2de5807f8a79229f","tests/no_time_to_init.rs":"2ede23df6618ff1cb5ae3b7bbf95900ad0fd92072afa2e0319bf147b4f75cefc","tests/overflowing_preinit.rs":"985e140460a100986fd051ce901b787a3a7a9747a856cd06066b740ac7d2381c","tests/persist_ping_lifetime_nopanic.rs":"18379d3ffbf4a2c8c684c04ff7a0660b86dfbbb447db2d24dfed6073cb7ddf8f","tests/schema.rs":"23b49005402b914e55a0c5c155f30c2662c609f79be78d1385ec25b3600b3547","tests/simple.rs":"15c76a1b5a336fd6abfbdebafc971f5c6a9b75107ddbca65f0031cde3e2886da","tests/test-delayed-ping-data.sh":"4a6db98b4df6b77898ace6a8b4e8b4c60d3e5c44873bbf38c62e83583e27a3ff","tests/test-enabled-pings.sh":"06656e38f63e65475006b107dd6bd179b0cbaa1fad1470de38e679e91a9315a3","tests/test-pending-gets-removed.sh":"e335f2f00fa97a61b6d94e0005fb3b9de8c8db8076111a67ca47d85392039ea9","tests/test-ping-lifetime-flush.sh":"e8f118ea2f6fd973809e38d5e828a03cfccfe0b0f497ccde5ec92d6d1380c071","tests/test-shutdown-blocking.sh":"a44d8d4bbe2ee3ede9e48121150ae7a5386025160c5cef2181ca142232c5fb27","tests/test-thread-crashing.sh":"f3cd0cc8a7b4fe82bef0fe6fbfbbe45fbad6da3afe0f82578bc5cfb2d6527ac6","tests/timing_distribution_buffered.rs":"501f7289c0c28f0ab83838c88b058999b19436d0f2b693be0787513d7b67e06d","tests/timing_distribution_single_sample.rs":"4f9498b6ef29913da0356027efe5f572c81d2f426e8538c068b54a1cfa33c1b8","tests/upload_timing.rs":"b3b9db197bc2ec41556388969a6bf289e7ef19e05b9019bc2bd98c823fcf6ea3","tests/uploader_capabilities.rs":"347f19e534a50a211ea179d6818631270d1b4ec468098e6b6abcde1e4a6a9bca"},"package":"95024f4707705270208e36983976cbac235dd7fc33c9f1cb0dee396ec1ce295d"} \ No newline at end of file diff --git a/third_party/rust/glean/Cargo.lock b/third_party/rust/glean/Cargo.lock index 728b31a6e9d..012b87a0b21 100644 --- a/third_party/rust/glean/Cargo.lock +++ b/third_party/rust/glean/Cargo.lock @@ -135,9 +135,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -242,7 +242,7 @@ dependencies = [ [[package]] name = "glean" -version = "64.0.1" +version = "64.1.1" dependencies = [ "crossbeam-channel", "env_logger", @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "glean-core" -version = "64.0.1" +version = "64.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49d1d62648ddeed8cb996373046ea45de93f1d1ff956aba054b9304bc305753" +checksum = "5ca0df94fb37669287b77e8aa300913ad1d14426d7f9e443b0ce1185349c817e" dependencies = [ "android_logger", "bincode", diff --git a/third_party/rust/glean/Cargo.toml b/third_party/rust/glean/Cargo.toml index 7b7c3937b8f..4af49a88bec 100644 --- a/third_party/rust/glean/Cargo.toml +++ b/third_party/rust/glean/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.82" name = "glean" -version = "64.0.1" +version = "64.1.1" authors = [ "Jan-Erik Rediger ", "The Glean Team ", @@ -115,7 +115,7 @@ path = "tests/uploader_capabilities.rs" version = "0.5" [dependencies.glean-core] -version = "64.0.1" +version = "64.1.1" [dependencies.inherent] version = "1" diff --git a/third_party/rust/glean/src/lib.rs b/third_party/rust/glean/src/lib.rs index d0fd006dbf3..62ec3204014 100644 --- a/third_party/rust/glean/src/lib.rs +++ b/third_party/rust/glean/src/lib.rs @@ -39,8 +39,8 @@ pub use glean_core::{ Datetime, DistributionData, MemoryUnit, MetricIdentifier, Rate, RecordedEvent, TimeUnit, TimerId, }, - traits, CommonMetricData, Error, ErrorType, Glean, HistogramType, LabeledMetricData, Lifetime, - PingRateLimit, RecordedExperiment, Result, + traits, AttributionMetrics, CommonMetricData, DistributionMetrics, Error, ErrorType, Glean, + HistogramType, LabeledMetricData, Lifetime, PingRateLimit, RecordedExperiment, Result, }; mod configuration; @@ -356,5 +356,31 @@ pub fn get_registered_ping_names() -> Vec { glean_core::glean_get_registered_ping_names() } +/// Updates attribution fields with new values. +/// AttributionMetrics fields with `None` values will not overwrite older values. +pub fn update_attribution(attribution: AttributionMetrics) { + glean_core::glean_update_attribution(attribution); +} + +/// **TEST-ONLY Method** +/// +/// Returns the current attribution metrics. +pub fn test_get_attribution() -> AttributionMetrics { + glean_core::glean_test_get_attribution() +} + +/// Updates distribution fields with new values. +/// DistributionMetrics fields with `None` values will not overwrite older values. +pub fn update_distribution(distribution: DistributionMetrics) { + glean_core::glean_update_distribution(distribution); +} + +/// **TEST-ONLY Method** +/// +/// Returns the current distribution metrics. +pub fn test_get_distribution() -> DistributionMetrics { + glean_core::glean_test_get_distribution() +} + #[cfg(test)] mod test; diff --git a/third_party/rust/glean/src/test.rs b/third_party/rust/glean/src/test.rs index d7e1c668c12..72e766d68a6 100644 --- a/third_party/rust/glean/src/test.rs +++ b/third_party/rust/glean/src/test.rs @@ -1501,3 +1501,49 @@ fn pings_ride_along_builtin_pings() { let url = r.recv().unwrap(); assert!(url.contains("ride-along")); } + +#[test] +fn test_attribution_and_distribution_updates_before_glean_inits() { + let _lock = lock_test(); + let dir = tempfile::tempdir().unwrap(); + let tmpname = dir.path().to_path_buf(); + + destroy_glean(true, &tmpname); + + // No Glean, let's set and update some attribution + distribution. + let mut attribution = AttributionMetrics { + source: Some("source".into()), + medium: Some("medium".into()), + campaign: Some("campaign".into()), + term: Some("term".into()), + content: Some("content".into()), + }; + let distribution = DistributionMetrics { + name: Some("name".into()), + }; + update_attribution(attribution.clone()); + update_distribution(distribution); + + let attribution_update = AttributionMetrics { + term: Some("new term".into()), + ..Default::default() + }; + let distribution_update = DistributionMetrics { + name: Some("different name".into()), + }; + update_attribution(attribution_update); + update_distribution(distribution_update.clone()); + + test_reset_glean( + ConfigurationBuilder::new(true, tmpname, GLOBAL_APPLICATION_ID) + .with_server_endpoint("invalid-test-host") + .build(), + ClientInfoMetrics::unknown(), + false, + ); + + // Ensure the updated attribution + distribution are correctly stored. + attribution.term = Some("new term".into()); + assert_eq!(attribution, test_get_attribution()); + assert_eq!(distribution_update, test_get_distribution()); +} diff --git a/third_party/rust/itertools/.cargo-checksum.json b/third_party/rust/itertools/.cargo-checksum.json index a4f2873c5c2..13a46812888 100644 --- a/third_party/rust/itertools/.cargo-checksum.json +++ b/third_party/rust/itertools/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"ed6c781d541c40d4a19eaecd794cadebb94b3f4d51e32367803542c88f0457ee","Cargo.toml":"6dcbab25126c0cdf64f5089156de0d4346914c6d47c557d370b8e20e039ca7d3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"3acfeb07424200ae70bf571ef63a96bae954c298bddf447c9bea0ea9394825cc","benches/bench1.rs":"bb06f39db0544b1380cd4929139ccf521a9eecab7ca3f910b9499f965ec0a047","benches/combinations.rs":"51523ee1ca438a56f14711f0b04ee943895062d35859fbe23a2714d2fca3289d","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/extra/mod.rs":"6ca290d72302a1945078621610b5788060b0de29639decebbdc557a80044aa97","benches/extra/zipslices.rs":"40e9f68a7c00f8429193fca463caef18851fa49b33355cc136bad3ccc840d655","benches/fold_specialization.rs":"5a517bbe29d366a15f6f751660e17ab1aa3e7b21552a1983048c662e34f0d69e","benches/powerset.rs":"6fd9d69a3483b37dc2411f99fb4efa6131577696f2dbdc8d1de9e4d7642fe3a3","benches/tree_fold1.rs":"539232e74f9aaea295a42069ac5af707811e90dc1c71c6e0a9064ffc731999de","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5a620783ae203e9ff9623d10d2c7fe9911d8b6c811cbad7613afa30e390c759d","clippy.toml":"33ffb83bbddb772575b3aa565b7136a8158ee386c216ffc2588fed9e83fa3826","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"1b465ed6a417180913104bc95a545fd9d1a3d67d121871ab737ad87e31b8be37","src/adaptors/coalesce.rs":"a0073325d40f297d29101538d18a267aef81889a999338dc09cb43a31cb4ec8b","src/adaptors/map.rs":"241971e856e468d71323071fb4a09867fbcedb83877320be132dc03516fe60e8","src/adaptors/mod.rs":"7f3bd7d011a348ce5e4bea486ef2e6346b64c7fe27540334d56d3f147f981d59","src/adaptors/multi_product.rs":"bb43e6dce68c815c21006d5b01c56e038d54b0c3bb8ee6bb8a4de11e2952c7ad","src/combinations.rs":"fb25babb459389093f886721016c72bf9f00e51d02735f638d871bb3a447ffd0","src/combinations_with_replacement.rs":"463011a574facbdd84278386b533a90e4dd517f0417e05adb82d182049db1f50","src/concat_impl.rs":"03b1ed61cbed242c286c3c4c5c848dbd57e02ab83fcef264f3a592b58107f324","src/cons_tuples_impl.rs":"c253d03b861831c01d62cacc57b49715ee62f6171e69f6886bb5a6ca0863bc3a","src/diff.rs":"a7800e9ce7a87b53ebe2338481335751fb43d44fa6a1ca719aceaaab40e5c8fe","src/duplicates_impl.rs":"f62fe4b642f501f785721ce5a505cf622a771e457210726dd0fb8b30be7ebbbc","src/either_or_both.rs":"76b13fbfac6bc959b4c1d8b7c99ce51726e95f994ca5429477e523a3d3950e4a","src/exactly_one_err.rs":"aa50081f6a31b5109b30e3ed305e3ec2413c6908dedc8990ec5378a99cee2b39","src/extrema_set.rs":"2a25b0b86eed2fd5d05622d591a3085cab823973d450816c2c3b8cb76e9c187e","src/flatten_ok.rs":"fe209fd886ecd9cb98d99625aa0c7274af7e644eff4a10de15b4dec8bbbc934a","src/format.rs":"a8192d85c0f9de8e633c202456e3cde0f3bc50f19b6bd8a4b2cfa3ef5123de1a","src/free.rs":"dfc57b7f56a08d4986a96b679018b41346576a7a34b668e008cc01109e728750","src/group_map.rs":"f7b02c964f63505d3e36280cfdc1755e05287714201efe983dacf702eee61434","src/groupbylazy.rs":"4f2181c022a45ff8444597708861fc6863eceb6f7555ea81cf3eeba19b492971","src/grouping_map.rs":"cbc45ac563345c96f3ac50c78f73c83d870523436a7ab88c1c9a685d204461d3","src/impl_macros.rs":"4f829b458873bed556f1aff2ae4e88dbd576766e2b5bcc07ff3ac8756758e6f4","src/intersperse.rs":"b9717242495846a4a979c95d93d5681caccb7c07a0d889eab763ad3d49a46125","src/k_smallest.rs":"603eb34314c01769ff7f6def2a24cf7a7b38507e6f3658b7aafc23a3b2e9b322","src/kmerge_impl.rs":"a347b0f6fa7715afd8a54d85ce139ed5b14c9e58a16c2b3648f5b288fdb5375f","src/lazy_buffer.rs":"834f6ef7fdf9f00c8a6329beb38eaefb706847ceeec309c221dce705c2c1e05b","src/lib.rs":"fadb0045279aafe8e8cccb45fadc383c7b358197b83c9c38fba87ada4cb2f84a","src/merge_join.rs":"1016113f6c983a9498bae5dc0570190437e1357b3333f6e19ea95c88599a1225","src/minmax.rs":"96d3897c28c8c63284d4729becc9ada6855e0953cac6e1bd35cf6f38c50b0ec0","src/multipeek_impl.rs":"35162bca4456bfa20a08e8d40e4d1cc6783dc662778789fdcded60371e975122","src/pad_tail.rs":"04be2ca73abb85815b06b5524c99d6feb2919180c486a4646f9cc6c87462f67b","src/peek_nth.rs":"6a0a51f2f373ce14d3d58595c46464878a14976bf00841a7396c03f9f9ab07ac","src/peeking_take_while.rs":"2b1b77c8882be32cfd76e973d303aa62f73370efd470c60764add0cdcca524d5","src/permutations.rs":"97831e7e26904c3cae68c97e74f7c6981ceb2fb2f2217282a0e5e54083a565fc","src/powerset.rs":"e0ee6b1316b4dd314c1e81502b90ae8113e1cda12168322520c5a65410e584b2","src/process_results_impl.rs":"9ed7fa46c8316238272ef47577387a386c1a109b50377dd3caf4291b6587cb73","src/put_back_n_impl.rs":"821e047fecd6ca0036290029f4febe7638a3abf1faa05e1e747a3bf9d80ff464","src/rciter_impl.rs":"5b156082ef2d25a94a4ad01d94cba2813c4b3e72e212515a8ad0fc8588f8045d","src/repeatn.rs":"bfc8f9145c9d8a3ea651f012b7d5a8d2fbbcbefdee76eafd098d02e7c54cda90","src/size_hint.rs":"021e57aad7df8f1e70ef588e9e9b8a1695aab183b1098f1848561f96c5dc9bcb","src/sources.rs":"61637f32c2cea2290ecfc1980c0b2d0f68463839ac09bd81006f8258ab8ecaae","src/tee.rs":"665832aa547389a420c3441470ff2494249f0ed2841be0c6a578367fe9dbd381","src/tuple_impl.rs":"00a9b61942425fb477b9691c3348646c0f9f534ff94f6321027f38c61ce2478c","src/unique_impl.rs":"3b89cdd668b74cc0a0eabb1522489e2305a0d2d8da25d6a1884e8626bbdb5959","src/unziptuple.rs":"84b50e5d29b9ddbf21a46a1cc2fd7877729c7f7da9bdc8ae1966dbaf2d2f6f60","src/with_position.rs":"c8a9b3476b3b90986b004a8877c19ff54b4c6800c5ac7ca1458d914036dacfe9","src/zip_eq_impl.rs":"4a41dc6dfe99359585d50ce648bdc85f15276c602048872b1d152e90841d8cad","src/zip_longest.rs":"f7cf5fffc3ca053ee80b410a05b27de1a475021f6de3181aea981010d7e8453f","src/ziptuple.rs":"7f9df12bf6556f382bbd4ad8cf17eb8b60c1c47fadbce016141133ba0f3384a1","tests/adaptors_no_collect.rs":"f459f36d54f5d475b2b2e83f5a1c98109c15062756ae822fa379486f3eeed666","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/macros_hygiene.rs":"522afa0106e3f11a5149e9218f89c2329e405546d2ef0ea756d6a27e8a0e9ca3","tests/merge_join.rs":"b08c4ee6529d234c68d411a413b8781455d18a1eab17872d1828bb75a4fcf79b","tests/peeking_take_while.rs":"4b1c394e44a9ef9bc0de707ae080b45803db722f79834c20f15b826d7c3f1f2e","tests/quick.rs":"6fcc0649b9270f024b169b1f499dd4cc7fecb0c9aec0dfc155b264916cc626e7","tests/specializations.rs":"fdd16dc663330033fedcc478609b393d4aa369dc07dc8cda31a75219fb793087","tests/test_core.rs":"32576ba90aa8e5db985b6e6ffe30e3046bc6a11d392db8f6b4bdd2ba48d9b24d","tests/test_std.rs":"f28a78a1912c950e7c37be1e82867e70dc585d60afecdebc7a97965194eee8e6","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"99af365fe6054ef1c6089d3e604e34da8fea66e55861ae4be9e7336ec8de4b56"},"package":"b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"} \ No newline at end of file +{"files":{"CHANGELOG.md":"60ec9a1801e015e49f7fbb299b608ac730d5b1a3fb298e6cf7935c0695ddf7fe","CONTRIBUTING.md":"d5787d0fd4df15481e2e09a37234ac5dec22c007c890826991f633d890efa29e","Cargo.lock":"4422e732d4ce6f650afb53a1dcffb1e53c86dd066c3dcd66bc9620acd898b99e","Cargo.toml":"77735549383196a4156a2246dd1cd6742029b223679b3004531456d33562b0ce","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545","README.md":"7dba3f55ea54eff2606f8b9f005e369cf9885dd972cb481432fce00234ee7750","benches/bench1.rs":"d632c8b839d7b318d1cb7b81b9c62570c77dcdf0696b8ce3d52067c79c930f78","benches/combinations.rs":"5b3bd243336d6b6bdc111d66218f3f0a4ecdb10fb72e90db79959e3d8bb2cf6f","benches/combinations_with_replacement.rs":"11f29160652a2d90ce7ca4b1c339c4457888ab6867e2456ce1c62e3adf9be737","benches/fold_specialization.rs":"66ab13fd8576a662afb59ef72c5565f5c3d27f7f30a976450ee5a14958654fa2","benches/k_smallest.rs":"c1bb2aa597def7f7c282d1196f9d70be6d10e1acbae03279c05bc8065544bb8e","benches/powerset.rs":"dc1fd729584147e5d8e4d19c6ca6f8706087d41c3c5beb7293d9ea43b4beab14","benches/specializations.rs":"daa989877d83ccd58e8de529184d50905b3d6fa60a9eeae917f38bd570d72fa4","benches/tree_reduce.rs":"fa4f22f042b76df89094ddf6e925ba42c4c3992f8195e719ed035f2e7cfa05bd","benches/tuple_combinations.rs":"16366158743307a0289fc1df423a3cec45009807d410a9fe9922d5b6f8b7d002","benches/tuples.rs":"5ab542aca40df4390de0ebf3819665df402d924a7dd6f4280e6ffc942bbd25c4","examples/iris.data":"596ffd580471ca4d4880f8e439c7281f3b50d8249a5960353cb200b1490f63a0","examples/iris.rs":"42c1b2fc148df52a050b013a57b577ad19911f1fe85b9525863df501979b5cd1","src/adaptors/coalesce.rs":"b57157c205ae077dd398740b61c7f49023aa80868abd8a071a6fe89ae6ecc9ad","src/adaptors/map.rs":"4952ee770cb54e98b2f649efd9c98f18951689358eb9b6bee10f139d056353ae","src/adaptors/mod.rs":"1e0cf7409c7291a923cf87f1c6d27cc57bd9f71ca52f7dd08a429aa994daa6ce","src/adaptors/multi_product.rs":"ad501e8ae4e5089b9d2f2be1f9a4713da6a2103b14daa759e09918409f88e321","src/combinations.rs":"9c4490bc4c7488fe9a8dba656a30493d90abb33006f7abbe3e266c237ffc986b","src/combinations_with_replacement.rs":"c7d6b7a122057e9aab075b2de41440ccd2973a6985fba75c2e93af13de55ef90","src/concat_impl.rs":"d61c00d43eca1193f135e25d3b6afd840c02ef1c573c29b264c47ee3429a45e8","src/cons_tuples_impl.rs":"7f46da33168107860b2b15d05d8edfe618e41bbc66ff0e16baf82d7373c4356d","src/diff.rs":"6e5ba3705a3a076d4fc360594014c90f1dfc597e61e8a629f96efa050e2433f5","src/duplicates_impl.rs":"1be37249b4566edc8da611ed9766ec851a526e7513bd13d80fe97482dcfcf7f3","src/either_or_both.rs":"cac278666b5d3c1fd103d97d15ce4c40960ea459441aeae83c6502087fd2ad8d","src/exactly_one_err.rs":"90b6204551161d27394af72107765dbfe3b51a77f4770c2e506fa4938985a184","src/extrema_set.rs":"11de200d853941716e9aa9a9b520b006704827c3c43a0c5f067906b0941e51d1","src/flatten_ok.rs":"62c18e5221a27949a00de49414306d6dfd601515817c1c8ae6189e3275756dd3","src/format.rs":"3ae6414043e0040f7358028c560437ea49afdbb2416df138a2410169e2619589","src/free.rs":"00ec21acee2ae2b30bf99e62472f9684c0a1719fbafc8dd2e4195ea8377c5b5d","src/group_map.rs":"c9da201137c6bb479b9308bfc38398b76950e39905f4ce8bc435c5318371522c","src/groupbylazy.rs":"5862629719258703aad47977ba1060f20fff15e962e18e6142758ebf6cd4a61c","src/grouping_map.rs":"3896c46ba4bd8ea886e5344a245658235626a104758d5ccecf223544a9ba471b","src/impl_macros.rs":"97fc5f39574805e0c220aa462cf1ae7dcac5c1082d6ee5500e7d71c120db5f88","src/intersperse.rs":"55031819e985c3184275e254c9600ecbe01e9fb49f198039c5da82a87ea5b90e","src/iter_index.rs":"1b0ff8376a4ad855d44db8c662450c777db84e0f4997b53ca575c65b107bb83b","src/k_smallest.rs":"a6840980e4c1aedd6987f93c904d362aa09a101537e447121fff58bb2473638d","src/kmerge_impl.rs":"3f999d55d7def904f71f2ca88b36707461f7f23b32966e0ccaf31d808886d843","src/lazy_buffer.rs":"baa01490fceb5a8dd7bd9c2634e19ce8a785bd1df352a9dd77d1344e3e0f8892","src/lib.rs":"e7f144351cca5018dc12270b4c33f0562afddb92452acfa85153cb276aebd6e9","src/merge_join.rs":"f2f257e63c84ed772b235229cc787ebe9ae009d7c80ed2087002a6b62c5e2133","src/minmax.rs":"0ec34b172ca8efc4aacb96f3e5771bdc5e8ac882876ee0f59d698c3924717c48","src/multipeek_impl.rs":"79eef0be49ad66f15d41808e72c03976c4f7cff5838b69d17975d3ece266f3f8","src/next_array.rs":"295924058891c08f9fe6313a1d9dd0042dcf60f0a514c6a6e009a1396d804fc9","src/pad_tail.rs":"e6bb5b086478600b0dbb8726cae8364bf83ab36d989ef467e1264eea43933b50","src/peek_nth.rs":"093f1a157b1c917f041af5244a5a46311affa2922126e36dc0ee2c501c79b58c","src/peeking_take_while.rs":"075ce13475c84e2cfdfaf1a7a0d0695332102c82a61914ed4c00a7d2634b1d34","src/permutations.rs":"b316084ee14e9e138d22f177367b3bfa24cb3e5e90ab20b9b00a9a23d653496f","src/powerset.rs":"7ab24fefc914b339dd92a6c8e639d0cad34479e09293b3346078856d6bc02d34","src/process_results_impl.rs":"6b5d82447eef4e87fef7b2a8e56b906ac7b000886a468ce421252f34ec86e371","src/put_back_n_impl.rs":"5a58d7a31c03029f0726e4d42de3be869580cf76b73c6d1ef70dd40c240b03a0","src/rciter_impl.rs":"081fd206ba4a601bd65e2f3b8d7c95e3e4a3564beb7c98944bd2e7986959c230","src/repeatn.rs":"dd9a5bf5a63ef9cc6ec5c8a6137c7ffba80f13568b6d001e189daaa29ffbaf39","src/size_hint.rs":"6022c2327ddc6df7e7b939eb60a93ee66ea9aa4d3aab49b9952e663ff4bff10b","src/sources.rs":"ef942af209ca1effcd28a95abedad8c45b659ae2a15b66c2158cb604f6e325f8","src/take_while_inclusive.rs":"1973a9f5322b3dae3b5ccded5912a08a8e2e975b9a5eac666192b118b230d305","src/tee.rs":"dad50ca162627cf0a67786f0993ef27d06cdefc14d412463e58c07824ef409d8","src/tuple_impl.rs":"0213261109e7c65746ccc22425d19141907bf7ea1e3dd4c40e9f278e6148e272","src/unique_impl.rs":"1efc280226f13ddd7dd5f7eedeec0093b704596652c942f3a0b2f8c90fa2e2f7","src/unziptuple.rs":"f3f6a2ee2658fa07db7592f2c344c2e3b1263a21fc75e1325f2be32c9dc1e750","src/with_position.rs":"9ca1eb195d04690b0c3a62a6c0eea349b8042e11c4ca4b80744f54103e1c7355","src/zip_eq_impl.rs":"3282b177e7dece5d3fbdc9b03563f209589a399ea45e70abf23ccca3b5512ac7","src/zip_longest.rs":"5572699564dd5717cc074b7733333ed238c2e9f3e6819d45e33e3a2dbda74478","src/ziptuple.rs":"d3a12221d39c8a5514574adb3ad2ccd1803d514b1cb09fbcd9253e3ddd628310","tests/adaptors_no_collect.rs":"7e6240878b1fc13b6384fdde0317d5d7ccca3e417b10a201ba61eb5255400fda","tests/flatten_ok.rs":"b7894874132918b8229c7150b2637511d8e3e14197d8eeb9382d46b2a514efa2","tests/laziness.rs":"89e6caec10da3d7aeadf9e30d5caf03cda36d07cee8415ff134b5b8e2a2cf144","tests/macros_hygiene.rs":"c2d517badf593c0ba9b70e987a6f8482ed8997547b2e88bbec70babd9b677aa2","tests/merge_join.rs":"5fb506b989f4a331d46cdec5775ea594656985134196099eaf8d3905bdddcdd5","tests/peeking_take_while.rs":"f834361c5520dda15eb9e9ebe87507c905462201412b21859d9f83dab91d0e0b","tests/quick.rs":"d463bf8712b32742c93bc2cf3993031aeaba1f5b0505ca0ecd347313c3da0582","tests/specializations.rs":"fefbdac83bb774186882e3d31be619c9ce1dbfc4191a99ed2ac90aa764737a8f","tests/test_core.rs":"9bbc6772e97a60d93d4021c184b9e4de1c0440a1c48b991a92edc189699fd20d","tests/test_std.rs":"b0e56deefe309b9c11804bd069c744b5caea7960cd4b68244531f6edf38b9741","tests/tuples.rs":"014e4da776174bfe923270e2a359cd9c95b372fce4b952b8138909d6e2c52762","tests/zip.rs":"457e34761d9bf2943a43abd9020d2b1a4492ebff9e4d94efe4c730652fbf62af"},"package":"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"} \ No newline at end of file diff --git a/third_party/rust/itertools/CHANGELOG.md b/third_party/rust/itertools/CHANGELOG.md index d2b40b5dbd1..6b08f68309a 100644 --- a/third_party/rust/itertools/CHANGELOG.md +++ b/third_party/rust/itertools/CHANGELOG.md @@ -1,5 +1,192 @@ # Changelog +## 0.14.0 + +### Breaking +- Increased MSRV to 1.63.0 (#960) +- Removed generic parameter from `cons_tuples` (#988) + +### Added +- Added `array_combinations` (#991) +- Added `k_smallest_relaxed` and variants (#925) +- Added `next_array` and `collect_array` (#560) +- Implemented `DoubleEndedIterator` for `FilterOk` (#948) +- Implemented `DoubleEndedIterator` for `FilterMapOk` (#950) + +### Changed +- Allow `Q: ?Sized` in `Itertools::contains` (#971) +- Improved hygiene of `chain!` (#943) +- Improved `into_group_map_by` documentation (#1000) +- Improved `tree_reduce` documentation (#955) +- Improved discoverability of `merge_join_by` (#966) +- Improved discoverability of `take_while_inclusive` (#972) +- Improved documentation of `find_or_last` and `find_or_first` (#984) +- Prevented exponentially large type sizes in `tuple_combinations` (#945) +- Added `track_caller` attr for `asser_equal` (#976) + +### Notable Internal Changes +- Fixed clippy lints (#956, #987, #1008) +- Addressed warnings within doctests (#964) +- CI: Run most tests with miri (#961) +- CI: Speed up "cargo-semver-checks" action (#938) +- Changed an instance of `default_features` in `Cargo.toml` to `default-features` (#985) + +## 0.13.0 + +### Breaking +- Removed implementation of `DoubleEndedIterator` for `ConsTuples` (#853) +- Made `MultiProduct` fused and fixed on an empty iterator (#835, #834) +- Changed `iproduct!` to return tuples for maxi one iterator too (#870) +- Changed `PutBack::put_back` to return the old value (#880) +- Removed deprecated `repeat_call, Itertools::{foreach, step, map_results, fold_results}` (#878) +- Removed `TakeWhileInclusive::new` (#912) + +### Added +- Added `Itertools::{smallest_by, smallest_by_key, largest, largest_by, largest_by_key}` (#654, #885) +- Added `Itertools::tail` (#899) +- Implemented `DoubleEndedIterator` for `ProcessResults` (#910) +- Implemented `Debug` for `FormatWith` (#931) +- Added `Itertools::get` (#891) + +### Changed +- Deprecated `Itertools::group_by` (renamed `chunk_by`) (#866, #879) +- Deprecated `unfold` (use `std::iter::from_fn` instead) (#871) +- Optimized `GroupingMapBy` (#873, #876) +- Relaxed `Fn` bounds to `FnMut` in `diff_with, Itertools::into_group_map_by` (#886) +- Relaxed `Debug/Clone` bounds for `MapInto` (#889) +- Documented the `use_alloc` feature (#887) +- Optimized `Itertools::set_from` (#888) +- Removed badges in `README.md` (#890) +- Added "no-std" categories in `Cargo.toml` (#894) +- Fixed `Itertools::k_smallest` on short unfused iterators (#900) +- Deprecated `Itertools::tree_fold1` (renamed `tree_reduce`) (#895) +- Deprecated `GroupingMap::fold_first` (renamed `reduce`) (#902) +- Fixed `Itertools::k_smallest(0)` to consume the iterator, optimized `Itertools::k_smallest(1)` (#909) +- Specialized `Combinations::nth` (#914) +- Specialized `MergeBy::fold` (#920) +- Specialized `CombinationsWithReplacement::nth` (#923) +- Specialized `FlattenOk::{fold, rfold}` (#927) +- Specialized `Powerset::nth` (#924) +- Documentation fixes (#882, #936) +- Fixed `assert_equal` for iterators longer than `i32::MAX` (#932) +- Updated the `must_use` message of non-lazy `KMergeBy` and `TupleCombinations` (#939) + +### Notable Internal Changes +- Tested iterator laziness (#792) +- Created `CONTRIBUTING.md` (#767) + +## 0.12.1 + +### Added +- Documented iteration order guarantee for `Itertools::[tuple_]combinations` (#822) +- Documented possible panic in `iterate` (#842) +- Implemented `Clone` and `Debug` for `Diff` (#845) +- Implemented `Debug` for `WithPosition` (#859) +- Implemented `Eq` for `MinMaxResult` (#838) +- Implemented `From>` for `Option>` (#843) +- Implemented `PeekingNext` for `RepeatN` (#855) + +### Changed +- Made `CoalesceBy` lazy (#801) +- Optimized `Filter[Map]Ok::next`, `Itertools::partition`, `Unique[By]::next[_back]` (#818) +- Optimized `Itertools::find_position` (#837) +- Optimized `Positions::next[_back]` (#816) +- Optimized `ZipLongest::fold` (#854) +- Relaxed `Debug` bounds for `GroupingMapBy` (#860) +- Specialized `ExactlyOneError::fold` (#826) +- Specialized `Interleave[Shortest]::fold` (#849) +- Specialized `MultiPeek::fold` (#820) +- Specialized `PadUsing::[r]fold` (#825) +- Specialized `PeekNth::fold` (#824) +- Specialized `Positions::[r]fold` (#813) +- Specialized `PutBackN::fold` (#823) +- Specialized `RepeatN::[r]fold` (#821) +- Specialized `TakeWhileInclusive::fold` (#851) +- Specialized `ZipLongest::rfold` (#848) + +### Notable Internal Changes +- Added test coverage in CI (#847, #856) +- Added semver check in CI (#784) +- Enforced `clippy` in CI (#740) +- Enforced `rustdoc` in CI (#840) +- Improved specialization tests (#807) +- More specialization benchmarks (#806) + +## 0.12.0 + +### Breaking +- Made `take_while_inclusive` consume iterator by value (#709) +- Added `Clone` bound to `Unique` (#777) + +### Added +- Added `Itertools::try_len` (#723) +- Added free function `sort_unstable` (#796) +- Added `GroupMap::fold_with` (#778, #785) +- Added `PeekNth::{peek_mut, peek_nth_mut}` (#716) +- Added `PeekNth::{next_if, next_if_eq}` (#734) +- Added conversion into `(Option,Option)` to `EitherOrBoth` (#713) +- Added conversion from `Either` to `EitherOrBoth` (#715) +- Implemented `ExactSizeIterator` for `Tuples` (#761) +- Implemented `ExactSizeIterator` for `(Circular)TupleWindows` (#752) +- Made `EitherOrBoth` a shorthand for `EitherOrBoth` (#719) + +### Changed +- Added missing `#[must_use]` annotations on iterator adaptors (#794) +- Made `Combinations` lazy (#795) +- Made `Intersperse(With)` lazy (#797) +- Made `Permutations` lazy (#793) +- Made `Product` lazy (#800) +- Made `TupleWindows` lazy (#602) +- Specialized `Combinations::{count, size_hint}` (#729) +- Specialized `CombinationsWithReplacement::{count, size_hint}` (#737) +- Specialized `Powerset::fold` (#765) +- Specialized `Powerset::count` (#735) +- Specialized `TupleCombinations::{count, size_hint}` (#763) +- Specialized `TupleCombinations::fold` (#775) +- Specialized `WhileSome::fold` (#780) +- Specialized `WithPosition::fold` (#772) +- Specialized `ZipLongest::fold` (#774) +- Changed `{min, max}_set*` operations require `alloc` feature, instead of `std` (#760) +- Improved documentation of `tree_fold1` (#787) +- Improved documentation of `permutations` (#724) +- Fixed typo in documentation of `multiunzip` (#770) + +### Notable Internal Changes +- Improved specialization tests (#799, #786, #782) +- Simplified implementation of `Permutations` (#739, #748, #790) +- Combined `Merge`/`MergeBy`/`MergeJoinBy` implementations (#736) +- Simplified `Permutations::size_hint` (#739) +- Fix wrapping arithmetic in benchmarks (#770) +- Enforced `rustfmt` in CI (#751) +- Disallowed compile warnings in CI (#720) +- Used `cargo hack` to check MSRV (#754) + +## 0.11.0 + +### Breaking +- Make `Itertools::merge_join_by` also accept functions returning bool (#704) +- Implement `PeekingNext` transitively over mutable references (#643) +- Change `with_position` to yield `(Position, Item)` instead of `Position` (#699) + +### Added +- Add `Itertools::take_while_inclusive` (#616) +- Implement `PeekingNext` for `PeekingTakeWhile` (#644) +- Add `EitherOrBoth::{just_left, just_right, into_left, into_right, as_deref, as_deref_mut, left_or_insert, right_or_insert, left_or_insert_with, right_or_insert_with, insert_left, insert_right, insert_both}` (#629) +- Implement `Clone` for `CircularTupleWindows` (#686) +- Implement `Clone` for `Chunks` (#683) +- Add `Itertools::process_results` (#680) + +### Changed +- Use `Cell` instead of `RefCell` in `Format` and `FormatWith` (#608) +- CI tweaks (#674, #675) +- Document and test the difference between stable and unstable sorts (#653) +- Fix documentation error on `Itertools::max_set_by_key` (#692) +- Move MSRV metadata to `Cargo.toml` (#672) +- Implement `equal` with `Iterator::eq` (#591) + +## 0.10.5 + - Maintenance + ## 0.10.4 - Add `EitherOrBoth::or` and `EitherOrBoth::or_else` (#593) - Add `min_set`, `max_set` et al. (#613, #323) @@ -7,6 +194,9 @@ - Documentation fixes (#612, #625, #632, #633, #634, #638) - Code maintenance (#623, #624, #627, #630) +## 0.10.3 + - Maintenance + ## 0.10.2 - Add `Itertools::multiunzip` (#362, #565) - Add `intersperse` and `intersperse_with` free functions (#555) diff --git a/third_party/rust/itertools/CONTRIBUTING.md b/third_party/rust/itertools/CONTRIBUTING.md new file mode 100644 index 00000000000..1dbf6f59dd5 --- /dev/null +++ b/third_party/rust/itertools/CONTRIBUTING.md @@ -0,0 +1,189 @@ +# Contributing to itertools + +We use stable Rust only. +Please check the minimum version of Rust we use in `Cargo.toml`. + +_If you are proposing a major change to CI or a new iterator adaptor for this crate, +then **please first file an issue** describing your proposal._ +[Usual concerns about new methods](https://github.com/rust-itertools/itertools/issues/413#issuecomment-657670781). + +To pass CI tests successfully, your code must be free of "compiler warnings" and "clippy warnings" and be "rustfmt" formatted. + +Note that small PRs are easier to review and therefore are more easily merged. + +## Write a new method/adaptor for `Itertools` trait +In general, the code logic should be tested with [quickcheck](https://crates.io/crates/quickcheck) tests in `tests/quick.rs` +which allow us to test properties about the code with randomly generated inputs. + +### Behind `use_std`/`use_alloc` feature? +If it needs the "std" (such as using hashes) then it should be behind the `use_std` feature, +or if it requires heap allocation (such as using vectors) then it should be behind the `use_alloc` feature. +Otherwise it should be able to run in `no_std` context. + +This mostly applies to your new module, each import from it, and to your new `Itertools` method. + +### Pick the right receiver +`self`, `&mut self` or `&self`? From [#710](https://github.com/rust-itertools/itertools/pull/710): + +- Take by value when: + - It transfers ownership to another iterator type, such as `filter`, `map`... + - It consumes the iterator completely, such as `count`, `last`, `max`... +- Mutably borrow when it consumes only part of the iterator, such as `find`, `all`, `try_collect`... +- Immutably borrow when there is no change, such as `size_hint`. + +### Laziness +Iterators are [lazy](https://doc.rust-lang.org/std/iter/index.html#laziness): + +- structs of iterator adaptors should have `#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]` ; +- structs of iterators should have `#[must_use = "iterators are lazy and do nothing unless consumed"]`. + +Those behaviors are **tested** in `tests/laziness.rs`. + +## Specialize `Iterator` methods +It might be more performant to specialize some methods. +However, each specialization should be thoroughly tested. + +Correctly specializing methods can be difficult, and _we do not require that you do it on your initial PR_. + +Most of the time, we want specializations of: + +- [`size_hint`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.size_hint): + It mostly allows allocation optimizations. + When always exact, it also enables to implement `ExactSizeIterator`. + See our private module `src/size_hint.rs` for helpers. +- [`fold`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.fold) + might make iteration faster than calling `next` repeatedly. +- [`count`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.count), + [`last`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.last), + [`nth`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.nth) + as we might be able to avoid iterating on every item with `next`. + +Additionally, + +- `for_each`, `reduce`, `max/min[_by[_key]]` and `partition` all rely on `fold` so you should specialize it instead. +- `all`, `any`, `find`, `find_map`, `cmp`, `partial_cmp`, `eq`, `ne`, `lt`, `le`, `gt`, `ge` and `position` all rely (by default) on `try_fold` + which we can not specialize on stable rust, so you might want to wait it stabilizes + or specialize each of them. +- `DoubleEndedIterator::{nth_back, rfold, rfind}`: similar reasoning. + +An adaptor might use the inner iterator specializations for its own specializations. + +They are **tested** in `tests/specializations.rs` and **benchmarked** in `benches/specializations.rs` +(build those benchmarks is slow so you might want to temporarily remove the ones you do not want to measure). + +## Additional implementations +### The [`Debug`](https://doc.rust-lang.org/std/fmt/trait.Debug.html) implementation +All our iterators should implement `Debug`. + +When one of the field is not debuggable (such as _functions_), you must not derive `Debug`. +Instead, manually implement it and _ignore this field_ in our helper macro `debug_fmt_fields`. + +
    +4 examples (click to expand) + +```rust +use std::fmt; + +/* ===== Simple derive. ===== */ +#[derive(Debug)] +struct Name1 { + iter: I, +} + +/* ===== With an unclonable field. ===== */ +struct Name2 { + iter: I, + func: F, +} + +// No `F: Debug` bound and the field `func` is ignored. +impl fmt::Debug for Name2 { + // it defines the `fmt` function from a struct name and the fields you want to debug. + debug_fmt_fields!(Name2, iter); +} + +/* ===== With an unclonable field, but another bound to add. ===== */ +struct Name3 { + iter: I, + item: Option, + func: F, +} + +// Same about `F` and `func`, similar about `I` but we must add the `I::Item: Debug` bound. +impl fmt::Debug for Name3 +where + I::Item: fmt::Debug, +{ + debug_fmt_fields!(Name3, iter, item); +} + +/* ===== With an unclonable field for which we can provide some information. ===== */ +struct Name4 { + iter: I, + func: Option, +} + +// If ignore a field is not good enough, implement Debug fully manually. +impl fmt::Debug for Name4 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let func = if self.func.is_some() { "Some(_)" } else { "None" }; + f.debug_struct("Name4") + .field("iter", &self.iter) + .field("func", &func) + .finish() + } +} +``` +
    + +### When/How to implement [`Clone`](https://doc.rust-lang.org/std/clone/trait.Clone.html) +All our iterators should implement `Clone` when possible. + +Note that a mutable reference is never clonable so `struct Name<'a, I: 'a> { iter: &'a mut I }` can not implement `Clone`. + +Derive `Clone` on a generic struct adds the bound `Clone` on each generic parameter. +It might be an issue in which case you should manually implement it with our helper macro `clone_fields` (it defines the `clone` function calling `clone` on each field) and be careful about the bounds. + +### When to implement [`std::iter::FusedIterator`](https://doc.rust-lang.org/std/iter/trait.FusedIterator.html) +This trait should be implemented _by all iterators that always return `None` after returning `None` once_, because it allows to optimize `Iterator::fuse()`. + +The conditions on which it should be implemented are usually the ones from the `Iterator` implementation, eventually refined to ensure it behaves in a fused way. + +### When to implement [`ExactSizeIterator`](https://doc.rust-lang.org/std/iter/trait.ExactSizeIterator.html) +_When we are always able to return an exact non-overflowing length._ + +Therefore, we do not implement it on adaptors that makes the iterator longer as the resulting length could overflow. + +One should not override `ExactSizeIterator::len` method but rely on an exact `Iterator::size_hint` implementation, meaning it returns `(length, Some(length))` (unless you could make `len` more performant than the default). + +The conditions on which it should be implemented are usually the ones from the `Iterator` implementation, probably refined to ensure the size hint is exact. + +### When to implement [`DoubleEndedIterator`](https://doc.rust-lang.org/std/iter/trait.DoubleEndedIterator.html) +When the iterator structure allows to handle _iterating on both fronts simultaneously_. +The iteration might stop in the middle when both fronts meet. + +The conditions on which it should be implemented are usually the ones from the `Iterator` implementation, probably refined to ensure we can iterate on both fronts simultaneously. + +### When to implement [`itertools::PeekingNext`](https://docs.rs/itertools/latest/itertools/trait.PeekingNext.html) +TODO + +This is currently **tested** in `tests/test_std.rs`. + +## About lending iterators +TODO + + +## Other notes +No guideline about using `#[inline]` yet. + +### `.fold` / `.for_each` / `.try_fold` / `.try_for_each` +In the Rust standard library, it's quite common for `fold` to be implemented in terms of `try_fold`. But it's not something we do yet because we can not specialize `try_fold` methods yet (it uses the unstable `Try`). + +From [#781](https://github.com/rust-itertools/itertools/pull/781), the general rule to follow is something like this: + +- If you need to completely consume an iterator: + - Use `fold` if you need an _owned_ access to an accumulator. + - Use `for_each` otherwise. +- If you need to partly consume an iterator, the same applies with `try_` versions: + - Use `try_fold` if you need an _owned_ access to an accumulator. + - Use `try_for_each` otherwise. diff --git a/third_party/rust/itertools/Cargo.lock b/third_party/rust/itertools/Cargo.lock new file mode 100644 index 00000000000..fbf369b2fab --- /dev/null +++ b/third_party/rust/itertools/Cargo.lock @@ -0,0 +1,740 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "bitflags", + "clap_lex", + "indexmap", + "textwrap", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "criterion" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c76e09c1aae2bc52b3d2f29e13c6572553b30c4aa1b8a49fd70de6412654cb" +dependencies = [ + "anes", + "atty", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.10.5", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +dependencies = [ + "criterion", + "either", + "paste", + "permutohedron", + "quickcheck", + "rand", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "permutohedron" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b687ff7b5da449d39e418ad391e5e08da53ec334903ddbb921db208908fc372c" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quickcheck" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" +dependencies = [ + "rand", + "rand_core", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/third_party/rust/itertools/Cargo.toml b/third_party/rust/itertools/Cargo.toml index 40be7e48f0e..96f9597712b 100644 --- a/third_party/rust/itertools/Cargo.toml +++ b/third_party/rust/itertools/Cargo.toml @@ -3,71 +3,165 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies +# to registry (e.g., crates.io) dependencies. # -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. [package] edition = "2018" +rust-version = "1.63.0" name = "itertools" -version = "0.10.5" +version = "0.14.0" authors = ["bluss"] -exclude = ["/bors.toml"] +build = false +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false description = "Extra iterator adaptors, iterator methods, free functions, and macros." documentation = "https://docs.rs/itertools/" readme = "README.md" -keywords = ["iterator", "data-structure", "zip", "product", "group-by"] -categories = ["algorithms", "rust-patterns"] -license = "MIT/Apache-2.0" +keywords = [ + "iterator", + "data-structure", + "zip", + "product", +] +categories = [ + "algorithms", + "rust-patterns", + "no-std", + "no-std::no-alloc", +] +license = "MIT OR Apache-2.0" repository = "https://github.com/rust-itertools/itertools" -[package.metadata.release] -no-dev-version = true -[profile.bench] -debug = true + +[features] +default = ["use_std"] +use_alloc = [] +use_std = [ + "use_alloc", + "either/use_std", +] [lib] +name = "itertools" +path = "src/lib.rs" test = false bench = false -[[bench]] -name = "tuple_combinations" -harness = false +[[example]] +name = "iris" +path = "examples/iris.rs" -[[bench]] +[[test]] +name = "adaptors_no_collect" +path = "tests/adaptors_no_collect.rs" + +[[test]] +name = "flatten_ok" +path = "tests/flatten_ok.rs" + +[[test]] +name = "laziness" +path = "tests/laziness.rs" + +[[test]] +name = "macros_hygiene" +path = "tests/macros_hygiene.rs" + +[[test]] +name = "merge_join" +path = "tests/merge_join.rs" + +[[test]] +name = "peeking_take_while" +path = "tests/peeking_take_while.rs" + +[[test]] +name = "quick" +path = "tests/quick.rs" + +[[test]] +name = "specializations" +path = "tests/specializations.rs" + +[[test]] +name = "test_core" +path = "tests/test_core.rs" + +[[test]] +name = "test_std" +path = "tests/test_std.rs" + +[[test]] name = "tuples" -harness = false +path = "tests/tuples.rs" -[[bench]] -name = "fold_specialization" -harness = false - -[[bench]] -name = "combinations_with_replacement" -harness = false - -[[bench]] -name = "tree_fold1" -harness = false +[[test]] +name = "zip" +path = "tests/zip.rs" [[bench]] name = "bench1" +path = "benches/bench1.rs" harness = false [[bench]] name = "combinations" +path = "benches/combinations.rs" +harness = false + +[[bench]] +name = "combinations_with_replacement" +path = "benches/combinations_with_replacement.rs" +harness = false + +[[bench]] +name = "fold_specialization" +path = "benches/fold_specialization.rs" +harness = false + +[[bench]] +name = "k_smallest" +path = "benches/k_smallest.rs" harness = false [[bench]] name = "powerset" +path = "benches/powerset.rs" harness = false + +[[bench]] +name = "specializations" +path = "benches/specializations.rs" +harness = false + +[[bench]] +name = "tree_reduce" +path = "benches/tree_reduce.rs" +harness = false + +[[bench]] +name = "tuple_combinations" +path = "benches/tuple_combinations.rs" +harness = false + +[[bench]] +name = "tuples" +path = "benches/tuples.rs" +harness = false + [dependencies.either] version = "1.0" default-features = false + [dev-dependencies.criterion] -version = "=0" +version = "0.4.0" +features = ["html_reports"] [dev-dependencies.paste] version = "1.0.0" @@ -82,7 +176,5 @@ default-features = false [dev-dependencies.rand] version = "0.7" -[features] -default = ["use_std"] -use_alloc = [] -use_std = ["use_alloc", "either/use_std"] +[profile.bench] +debug = 2 diff --git a/third_party/rust/itertools/README.md b/third_party/rust/itertools/README.md index a911127f455..46acc3fcae0 100644 --- a/third_party/rust/itertools/README.md +++ b/third_party/rust/itertools/README.md @@ -4,14 +4,11 @@ Extra iterator adaptors, functions and macros. Please read the [API documentation here](https://docs.rs/itertools/). -[![build_status](https://github.com/rust-itertools/itertools/actions/workflows/ci.yml/badge.svg)](https://github.com/rust-itertools/itertools/actions) -[![crates.io](https://img.shields.io/crates/v/itertools.svg)](https://crates.io/crates/itertools) - How to use with Cargo: ```toml [dependencies] -itertools = "0.10.5" +itertools = "0.14.0" ``` How to use in your crate: @@ -21,17 +18,9 @@ use itertools::Itertools; ``` ## How to contribute +If you're not sure what to work on, try checking the [help wanted](https://github.com/rust-itertools/itertools/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) label. -- Fix a bug or implement a new thing -- Include tests for your new feature, preferably a QuickCheck test -- Make a Pull Request - -For new features, please first consider filing a PR to [rust-lang/rust](https://github.com/rust-lang/rust), -adding your new feature to the `Iterator` trait of the standard library, if you believe it is reasonable. -If it isn't accepted there, proposing it for inclusion in ``itertools`` is a good idea. -The reason for doing is this is so that we avoid future breakage as with ``.flatten()``. -However, if your feature involves heap allocation, such as storing elements in a ``Vec``, -then it can't be accepted into ``libcore``, and you should propose it for ``itertools`` directly instead. +See our [CONTRIBUTING.md](https://github.com/rust-itertools/itertools/blob/master/CONTRIBUTING.md) for a detailed guide. ## License diff --git a/third_party/rust/itertools/benches/bench1.rs b/third_party/rust/itertools/benches/bench1.rs index 71278d17b6b..53e77b0da46 100644 --- a/third_party/rust/itertools/benches/bench1.rs +++ b/third_party/rust/itertools/benches/bench1.rs @@ -1,22 +1,20 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use itertools::Itertools; +use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; use itertools::free::cloned; use itertools::iproduct; +use itertools::Itertools; -use std::iter::repeat; use std::cmp; +use std::iter::repeat; use std::ops::{Add, Range}; -mod extra; - -use crate::extra::ZipSlices; - fn slice_iter(c: &mut Criterion) { let xs: Vec<_> = repeat(1i32).take(20).collect(); c.bench_function("slice iter", move |b| { - b.iter(|| for elt in xs.iter() { - black_box(elt); + b.iter(|| { + for elt in xs.iter() { + black_box(elt); + } }) }); } @@ -25,8 +23,10 @@ fn slice_iter_rev(c: &mut Criterion) { let xs: Vec<_> = repeat(1i32).take(20).collect(); c.bench_function("slice iter rev", move |b| { - b.iter(|| for elt in xs.iter().rev() { - black_box(elt); + b.iter(|| { + for elt in xs.iter().rev() { + black_box(elt); + } }) }); } @@ -116,72 +116,6 @@ fn zip_slices_ziptuple(c: &mut Criterion) { }); } -fn zipslices(c: &mut Criterion) { - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - c.bench_function("zipslices", move |b| { - b.iter(|| { - for (&x, &y) in ZipSlices::new(&xs, &ys) { - black_box(x); - black_box(y); - } - }) - }); -} - -fn zipslices_mut(c: &mut Criterion) { - let xs = vec![0; 1024]; - let ys = vec![0; 768]; - let xs = black_box(xs); - let mut ys = black_box(ys); - - c.bench_function("zipslices mut", move |b| { - b.iter(|| { - for (&x, &mut y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { - black_box(x); - black_box(y); - } - }) - }); -} - -fn zipdot_i32_zipslices(c: &mut Criterion) { - let xs = vec![2; 1024]; - let ys = vec![2; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - c.bench_function("zipdot i32 zipslices", move |b| { - b.iter(|| { - let mut s = 0i32; - for (&x, &y) in ZipSlices::new(&xs, &ys) { - s += x * y; - } - s - }) - }); -} - -fn zipdot_f32_zipslices(c: &mut Criterion) { - let xs = vec![2f32; 1024]; - let ys = vec![2f32; 768]; - let xs = black_box(xs); - let ys = black_box(ys); - - c.bench_function("zipdot f32 zipslices", move |b| { - b.iter(|| { - let mut s = 0.; - for (&x, &y) in ZipSlices::new(&xs, &ys) { - s += x * y; - } - s - }) - }); -} - fn zip_checked_counted_loop(c: &mut Criterion) { let xs = vec![0; 1024]; let ys = vec![0; 768]; @@ -307,10 +241,10 @@ fn zip_unchecked_counted_loop(c: &mut Criterion) { let len = cmp::min(xs.len(), ys.len()); for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - black_box(x); - black_box(y); + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + black_box(x); + black_box(y); } } }) @@ -329,9 +263,9 @@ fn zipdot_i32_unchecked_counted_loop(c: &mut Criterion) { let mut s = 0i32; for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - s += x * y; + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + s += x * y; } } s @@ -351,9 +285,9 @@ fn zipdot_f32_unchecked_counted_loop(c: &mut Criterion) { let mut s = 0f32; for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - s += x * y; + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + s += x * y; } } s @@ -374,19 +308,19 @@ fn zip_unchecked_counted_loop3(c: &mut Criterion) { let len = cmp::min(xs.len(), cmp::min(ys.len(), zs.len())); for i in 0..len { unsafe { - let x = *xs.get_unchecked(i); - let y = *ys.get_unchecked(i); - let z = *zs.get_unchecked(i); - black_box(x); - black_box(y); - black_box(z); + let x = *xs.get_unchecked(i); + let y = *ys.get_unchecked(i); + let z = *zs.get_unchecked(i); + black_box(x); + black_box(y); + black_box(z); } } }) }); } -fn group_by_lazy_1(c: &mut Criterion) { +fn chunk_by_lazy_1(c: &mut Criterion) { let mut data = vec![0; 1024]; for (index, elt) in data.iter_mut().enumerate() { *elt = index / 10; @@ -394,10 +328,10 @@ fn group_by_lazy_1(c: &mut Criterion) { let data = black_box(data); - c.bench_function("group by lazy 1", move |b| { + c.bench_function("chunk by lazy 1", move |b| { b.iter(|| { - for (_key, group) in &data.iter().group_by(|elt| **elt) { - for elt in group { + for (_key, chunk) in &data.iter().chunk_by(|elt| **elt) { + for elt in chunk { black_box(elt); } } @@ -405,7 +339,7 @@ fn group_by_lazy_1(c: &mut Criterion) { }); } -fn group_by_lazy_2(c: &mut Criterion) { +fn chunk_by_lazy_2(c: &mut Criterion) { let mut data = vec![0; 1024]; for (index, elt) in data.iter_mut().enumerate() { *elt = index / 2; @@ -413,10 +347,10 @@ fn group_by_lazy_2(c: &mut Criterion) { let data = black_box(data); - c.bench_function("group by lazy 2", move |b| { + c.bench_function("chunk by lazy 2", move |b| { b.iter(|| { - for (_key, group) in &data.iter().group_by(|elt| **elt) { - for elt in group { + for (_key, chunk) in &data.iter().chunk_by(|elt| **elt) { + for elt in chunk { black_box(elt); } } @@ -432,8 +366,8 @@ fn slice_chunks(c: &mut Criterion) { c.bench_function("slice chunks", move |b| { b.iter(|| { - for group in data.chunks(sz) { - for elt in group { + for chunk in data.chunks(sz) { + for elt in chunk { black_box(elt); } } @@ -449,8 +383,8 @@ fn chunks_lazy_1(c: &mut Criterion) { c.bench_function("chunks lazy 1", move |b| { b.iter(|| { - for group in &data.iter().chunks(sz) { - for elt in group { + for chunk in &data.iter().chunks(sz) { + for elt in chunk { black_box(elt); } } @@ -464,17 +398,15 @@ fn equal(c: &mut Criterion) { let alpha = black_box(&data[1..]); let beta = black_box(&data[..l - 1]); - c.bench_function("equal", move |b| { - b.iter(|| { - itertools::equal(alpha, beta) - }) - }); + c.bench_function("equal", move |b| b.iter(|| itertools::equal(alpha, beta))); } fn merge_default(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -493,9 +425,7 @@ fn merge_default(c: &mut Criterion) { let data2 = black_box(data2); c.bench_function("merge default", move |b| { - b.iter(|| { - data1.iter().merge(&data2).count() - }) + b.iter(|| data1.iter().merge(&data2).count()) }); } @@ -503,6 +433,8 @@ fn merge_by_cmp(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -521,9 +453,7 @@ fn merge_by_cmp(c: &mut Criterion) { let data2 = black_box(data2); c.bench_function("merge by cmp", move |b| { - b.iter(|| { - data1.iter().merge_by(&data2, PartialOrd::le).count() - }) + b.iter(|| data1.iter().merge_by(&data2, PartialOrd::le).count()) }); } @@ -531,6 +461,8 @@ fn merge_by_lt(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -549,9 +481,7 @@ fn merge_by_lt(c: &mut Criterion) { let data2 = black_box(data2); c.bench_function("merge by lt", move |b| { - b.iter(|| { - data1.iter().merge_by(&data2, |a, b| a <= b).count() - }) + b.iter(|| data1.iter().merge_by(&data2, |a, b| a <= b).count()) }); } @@ -559,6 +489,8 @@ fn kmerge_default(c: &mut Criterion) { let mut data1 = vec![0; 1024]; let mut data2 = vec![0; 800]; let mut x = 0; + + #[allow(clippy::explicit_counter_loop, clippy::unused_enumerate_index)] for (_, elt) in data1.iter_mut().enumerate() { *elt = x; x += 1; @@ -578,9 +510,7 @@ fn kmerge_default(c: &mut Criterion) { let its = &[data1.iter(), data2.iter()]; c.bench_function("kmerge default", move |b| { - b.iter(|| { - its.iter().cloned().kmerge().count() - }) + b.iter(|| its.iter().cloned().kmerge().count()) }); } @@ -589,7 +519,7 @@ fn kmerge_tenway(c: &mut Criterion) { let mut state = 1729u16; fn rng(state: &mut u16) -> u16 { - let new = state.wrapping_mul(31421) + 6927; + let new = state.wrapping_mul(31421).wrapping_add(6927); *state = new; new } @@ -600,10 +530,10 @@ fn kmerge_tenway(c: &mut Criterion) { let mut chunks = Vec::new(); let mut rest = &mut data[..]; - while rest.len() > 0 { + while !rest.is_empty() { let chunk_len = 1 + rng(&mut state) % 512; let chunk_len = cmp::min(rest.len(), chunk_len as usize); - let (fst, tail) = {rest}.split_at_mut(chunk_len); + let (fst, tail) = { rest }.split_at_mut(chunk_len); fst.sort(); chunks.push(fst.iter().cloned()); rest = tail; @@ -612,15 +542,14 @@ fn kmerge_tenway(c: &mut Criterion) { // println!("Chunk lengths: {}", chunks.iter().format_with(", ", |elt, f| f(&elt.len()))); c.bench_function("kmerge tenway", move |b| { - b.iter(|| { - chunks.iter().cloned().kmerge().count() - }) + b.iter(|| chunks.iter().cloned().kmerge().count()) }); } fn fast_integer_sum(iter: I) -> I::Item - where I: IntoIterator, - I::Item: Default + Add +where + I: IntoIterator, + I::Item: Default + Add, { iter.into_iter().fold(<_>::default(), |x, y| x + y) } @@ -629,9 +558,7 @@ fn step_vec_2(c: &mut Criterion) { let v = vec![0; 1024]; c.bench_function("step vec 2", move |b| { - b.iter(|| { - fast_integer_sum(cloned(v.iter().step_by(2))) - }) + b.iter(|| fast_integer_sum(cloned(v.iter().step_by(2)))) }); } @@ -639,9 +566,7 @@ fn step_vec_10(c: &mut Criterion) { let v = vec![0; 1024]; c.bench_function("step vec 10", move |b| { - b.iter(|| { - fast_integer_sum(cloned(v.iter().step_by(10))) - }) + b.iter(|| fast_integer_sum(cloned(v.iter().step_by(10)))) }); } @@ -649,9 +574,7 @@ fn step_range_2(c: &mut Criterion) { let v = black_box(0..1024); c.bench_function("step range 2", move |b| { - b.iter(|| { - fast_integer_sum(v.clone().step_by(2)) - }) + b.iter(|| fast_integer_sum(v.clone().step_by(2))) }); } @@ -659,9 +582,23 @@ fn step_range_10(c: &mut Criterion) { let v = black_box(0..1024); c.bench_function("step range 10", move |b| { - b.iter(|| { - fast_integer_sum(v.clone().step_by(10)) - }) + b.iter(|| fast_integer_sum(v.clone().step_by(10))) + }); +} + +fn vec_iter_mut_partition(c: &mut Criterion) { + let data = std::iter::repeat(-1024i32..1024) + .take(256) + .flatten() + .collect_vec(); + c.bench_function("vec iter mut partition", move |b| { + b.iter_batched( + || data.clone(), + |mut data| { + black_box(itertools::partition(black_box(&mut data), |n| *n >= 0)); + }, + BatchSize::LargeInput, + ) }); } @@ -681,22 +618,6 @@ fn cartesian_product_iterator(c: &mut Criterion) { }); } -fn cartesian_product_fold(c: &mut Criterion) { - let xs = vec![0; 16]; - - c.bench_function("cartesian product fold", move |b| { - b.iter(|| { - let mut sum = 0; - iproduct!(&xs, &xs, &xs).fold((), |(), (&x, &y, &z)| { - sum += x; - sum += y; - sum += z; - }); - sum - }) - }); -} - fn multi_cartesian_product_iterator(c: &mut Criterion) { let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; @@ -713,22 +634,6 @@ fn multi_cartesian_product_iterator(c: &mut Criterion) { }); } -fn multi_cartesian_product_fold(c: &mut Criterion) { - let xs = [vec![0; 16], vec![0; 16], vec![0; 16]]; - - c.bench_function("multi cartesian product fold", move |b| { - b.iter(|| { - let mut sum = 0; - xs.iter().multi_cartesian_product().fold((), |(), x| { - sum += x[0]; - sum += x[1]; - sum += x[2]; - }); - sum - }) - }); -} - fn cartesian_product_nested_for(c: &mut Criterion) { let xs = vec![0; 16]; @@ -753,9 +658,7 @@ fn all_equal(c: &mut Criterion) { let mut xs = vec![0; 5_000_000]; xs.extend(vec![1; 5_000_000]); - c.bench_function("all equal", move |b| { - b.iter(|| xs.iter().all_equal()) - }); + c.bench_function("all equal", move |b| b.iter(|| xs.iter().all_equal())); } fn all_equal_for(c: &mut Criterion) { @@ -797,21 +700,17 @@ fn permutations_iter(c: &mut Criterion) { } c.bench_function("permutations iter", move |b| { - b.iter(|| { - for _ in NewIterator(0..PERM_COUNT).permutations(PERM_COUNT) { - - } - }) + b.iter( + || { + for _ in NewIterator(0..PERM_COUNT).permutations(PERM_COUNT) {} + }, + ) }); } fn permutations_range(c: &mut Criterion) { c.bench_function("permutations range", move |b| { - b.iter(|| { - for _ in (0..PERM_COUNT).permutations(PERM_COUNT) { - - } - }) + b.iter(|| for _ in (0..PERM_COUNT).permutations(PERM_COUNT) {}) }); } @@ -819,11 +718,7 @@ fn permutations_slice(c: &mut Criterion) { let v = (0..PERM_COUNT).collect_vec(); c.bench_function("permutations slice", move |b| { - b.iter(|| { - for _ in v.as_slice().iter().permutations(PERM_COUNT) { - - } - }) + b.iter(|| for _ in v.as_slice().iter().permutations(PERM_COUNT) {}) }); } @@ -836,10 +731,6 @@ criterion_group!( zipdot_f32_default_zip, zip_default_zip3, zip_slices_ziptuple, - zipslices, - zipslices_mut, - zipdot_i32_zipslices, - zipdot_f32_zipslices, zip_checked_counted_loop, zipdot_i32_checked_counted_loop, zipdot_f32_checked_counted_loop, @@ -848,8 +739,8 @@ criterion_group!( zipdot_i32_unchecked_counted_loop, zipdot_f32_unchecked_counted_loop, zip_unchecked_counted_loop3, - group_by_lazy_1, - group_by_lazy_2, + chunk_by_lazy_1, + chunk_by_lazy_2, slice_chunks, chunks_lazy_1, equal, @@ -862,10 +753,9 @@ criterion_group!( step_vec_10, step_range_2, step_range_10, + vec_iter_mut_partition, cartesian_product_iterator, - cartesian_product_fold, multi_cartesian_product_iterator, - multi_cartesian_product_fold, cartesian_product_nested_for, all_equal, all_equal_for, diff --git a/third_party/rust/itertools/benches/combinations.rs b/third_party/rust/itertools/benches/combinations.rs index e7433a4cb09..42a452111ea 100644 --- a/third_party/rust/itertools/benches/combinations.rs +++ b/third_party/rust/itertools/benches/combinations.rs @@ -111,15 +111,7 @@ fn comb_c14(c: &mut Criterion) { } criterion_group!( - benches, - comb_for1, - comb_for2, - comb_for3, - comb_for4, - comb_c1, - comb_c2, - comb_c3, - comb_c4, + benches, comb_for1, comb_for2, comb_for3, comb_for4, comb_c1, comb_c2, comb_c3, comb_c4, comb_c14, ); criterion_main!(benches); diff --git a/third_party/rust/itertools/benches/extra/mod.rs b/third_party/rust/itertools/benches/extra/mod.rs deleted file mode 100644 index 52fe5cc3fe0..00000000000 --- a/third_party/rust/itertools/benches/extra/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub use self::zipslices::ZipSlices; -mod zipslices; diff --git a/third_party/rust/itertools/benches/extra/zipslices.rs b/third_party/rust/itertools/benches/extra/zipslices.rs deleted file mode 100644 index 633be590686..00000000000 --- a/third_party/rust/itertools/benches/extra/zipslices.rs +++ /dev/null @@ -1,188 +0,0 @@ -use std::cmp; - -// Note: There are different ways to implement ZipSlices. -// This version performed the best in benchmarks. -// -// I also implemented a version with three pointers (tptr, tend, uptr), -// that mimiced slice::Iter and only checked bounds by using tptr == tend, -// but that was inferior to this solution. - -/// An iterator which iterates two slices simultaneously. -/// -/// `ZipSlices` acts like a double-ended `.zip()` iterator. -/// -/// It was intended to be more efficient than `.zip()`, and it was, then -/// rustc changed how it optimizes so it can not promise improved performance -/// at this time. -/// -/// Note that elements past the end of the shortest of the two slices are ignored. -/// -/// Iterator element type for `ZipSlices` is `(T::Item, U::Item)`. For example, -/// for a `ZipSlices<&'a [A], &'b mut [B]>`, the element type is `(&'a A, &'b mut B)`. -#[derive(Clone)] -pub struct ZipSlices { - t: T, - u: U, - len: usize, - index: usize, -} - -impl<'a, 'b, A, B> ZipSlices<&'a [A], &'b [B]> { - /// Create a new `ZipSlices` from slices `a` and `b`. - /// - /// Act like a double-ended `.zip()` iterator, but more efficiently. - /// - /// Note that elements past the end of the shortest of the two slices are ignored. - #[inline(always)] - pub fn new(a: &'a [A], b: &'b [B]) -> Self { - let minl = cmp::min(a.len(), b.len()); - ZipSlices { - t: a, - u: b, - len: minl, - index: 0, - } - } -} - -impl ZipSlices - where T: Slice, - U: Slice -{ - /// Create a new `ZipSlices` from slices `a` and `b`. - /// - /// Act like a double-ended `.zip()` iterator, but more efficiently. - /// - /// Note that elements past the end of the shortest of the two slices are ignored. - #[inline(always)] - pub fn from_slices(a: T, b: U) -> Self { - let minl = cmp::min(a.len(), b.len()); - ZipSlices { - t: a, - u: b, - len: minl, - index: 0, - } - } -} - -impl Iterator for ZipSlices - where T: Slice, - U: Slice -{ - type Item = (T::Item, U::Item); - - #[inline(always)] - fn next(&mut self) -> Option { - unsafe { - if self.index >= self.len { - None - } else { - let i = self.index; - self.index += 1; - Some(( - self.t.get_unchecked(i), - self.u.get_unchecked(i))) - } - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - let len = self.len - self.index; - (len, Some(len)) - } -} - -impl DoubleEndedIterator for ZipSlices - where T: Slice, - U: Slice -{ - #[inline(always)] - fn next_back(&mut self) -> Option { - unsafe { - if self.index >= self.len { - None - } else { - self.len -= 1; - let i = self.len; - Some(( - self.t.get_unchecked(i), - self.u.get_unchecked(i))) - } - } - } -} - -impl ExactSizeIterator for ZipSlices - where T: Slice, - U: Slice -{} - -unsafe impl Slice for ZipSlices - where T: Slice, - U: Slice -{ - type Item = (T::Item, U::Item); - - fn len(&self) -> usize { - self.len - self.index - } - - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item { - (self.t.get_unchecked(i), - self.u.get_unchecked(i)) - } -} - -/// A helper trait to let `ZipSlices` accept both `&[T]` and `&mut [T]`. -/// -/// Unsafe trait because: -/// -/// - Implementors must guarantee that `get_unchecked` is valid for all indices `0..len()`. -pub unsafe trait Slice { - /// The type of a reference to the slice's elements - type Item; - #[doc(hidden)] - fn len(&self) -> usize; - #[doc(hidden)] - unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item; -} - -unsafe impl<'a, T> Slice for &'a [T] { - type Item = &'a T; - #[inline(always)] - fn len(&self) -> usize { (**self).len() } - #[inline(always)] - unsafe fn get_unchecked(&mut self, i: usize) -> &'a T { - debug_assert!(i < self.len()); - (**self).get_unchecked(i) - } -} - -unsafe impl<'a, T> Slice for &'a mut [T] { - type Item = &'a mut T; - #[inline(always)] - fn len(&self) -> usize { (**self).len() } - #[inline(always)] - unsafe fn get_unchecked(&mut self, i: usize) -> &'a mut T { - debug_assert!(i < self.len()); - // override the lifetime constraints of &mut &'a mut [T] - (*(*self as *mut [T])).get_unchecked_mut(i) - } -} - -#[test] -fn zipslices() { - - let xs = [1, 2, 3, 4, 5, 6]; - let ys = [1, 2, 3, 7]; - ::itertools::assert_equal(ZipSlices::new(&xs, &ys), xs.iter().zip(&ys)); - - let xs = [1, 2, 3, 4, 5, 6]; - let mut ys = [0; 6]; - for (x, y) in ZipSlices::from_slices(&xs[..], &mut ys[..]) { - *y = *x; - } - ::itertools::assert_equal(&xs, &ys); -} diff --git a/third_party/rust/itertools/benches/fold_specialization.rs b/third_party/rust/itertools/benches/fold_specialization.rs index 5de4671e989..b44f3472146 100644 --- a/third_party/rust/itertools/benches/fold_specialization.rs +++ b/third_party/rust/itertools/benches/fold_specialization.rs @@ -1,10 +1,13 @@ +#![allow(unstable_name_collisions)] + use criterion::{criterion_group, criterion_main, Criterion}; use itertools::Itertools; struct Unspecialized(I); impl Iterator for Unspecialized -where I: Iterator +where + I: Iterator, { type Item = I::Item; @@ -25,8 +28,7 @@ mod specialization { pub mod intersperse { use super::*; - pub fn external(c: &mut Criterion) - { + pub fn external(c: &mut Criterion) { let arr = [1; 1024]; c.bench_function("external", move |b| { @@ -40,23 +42,23 @@ mod specialization { }); } - pub fn internal_specialized(c: &mut Criterion) - { + pub fn internal_specialized(c: &mut Criterion) { let arr = [1; 1024]; c.bench_function("internal specialized", move |b| { b.iter(|| { + #[allow(clippy::unnecessary_fold)] arr.iter().intersperse(&0).fold(0, |acc, x| acc + x) }) }); } - pub fn internal_unspecialized(c: &mut Criterion) - { + pub fn internal_unspecialized(c: &mut Criterion) { let arr = [1; 1024]; c.bench_function("internal unspecialized", move |b| { b.iter(|| { + #[allow(clippy::unnecessary_fold)] Unspecialized(arr.iter().intersperse(&0)).fold(0, |acc, x| acc + x) }) }); diff --git a/third_party/rust/itertools/benches/k_smallest.rs b/third_party/rust/itertools/benches/k_smallest.rs new file mode 100644 index 00000000000..509ed7f8abd --- /dev/null +++ b/third_party/rust/itertools/benches/k_smallest.rs @@ -0,0 +1,61 @@ +use criterion::{black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion}; +use itertools::Itertools; +use rand::{rngs::StdRng, seq::SliceRandom, SeedableRng}; + +fn strict(b: &mut Bencher, (k, vals): &(usize, &Vec)) { + b.iter(|| black_box(vals.iter()).k_smallest(*k)) +} + +fn relaxed(b: &mut Bencher, (k, vals): &(usize, &Vec)) { + b.iter(|| black_box(vals.iter()).k_smallest_relaxed(*k)) +} + +fn ascending(n: usize) -> Vec { + (0..n).collect() +} + +fn random(n: usize) -> Vec { + let mut vals = (0..n).collect_vec(); + vals.shuffle(&mut StdRng::seed_from_u64(42)); + vals +} + +fn descending(n: usize) -> Vec { + (0..n).rev().collect() +} + +fn k_smallest(c: &mut Criterion, order: &str, vals: fn(usize) -> Vec) { + let mut g = c.benchmark_group(format!("k-smallest/{order}")); + + for log_n in 20..23 { + let n = 1 << log_n; + + let vals = vals(n); + + for log_k in 7..10 { + let k = 1 << log_k; + + let params = format!("{log_n}/{log_k}"); + let input = (k, &vals); + g.bench_with_input(BenchmarkId::new("strict", ¶ms), &input, strict); + g.bench_with_input(BenchmarkId::new("relaxed", ¶ms), &input, relaxed); + } + } + + g.finish() +} + +fn k_smallest_asc(c: &mut Criterion) { + k_smallest(c, "asc", ascending); +} + +fn k_smallest_rand(c: &mut Criterion) { + k_smallest(c, "rand", random); +} + +fn k_smallest_desc(c: &mut Criterion) { + k_smallest(c, "desc", descending); +} + +criterion_group!(benches, k_smallest_asc, k_smallest_rand, k_smallest_desc); +criterion_main!(benches); diff --git a/third_party/rust/itertools/benches/powerset.rs b/third_party/rust/itertools/benches/powerset.rs index 074550bc449..018333d316c 100644 --- a/third_party/rust/itertools/benches/powerset.rs +++ b/third_party/rust/itertools/benches/powerset.rs @@ -20,17 +20,64 @@ fn powerset_n(c: &mut Criterion, n: usize) { }); } -fn powerset_0(c: &mut Criterion) { powerset_n(c, 0); } +fn powerset_n_fold(c: &mut Criterion, n: usize) { + let id = format!("powerset {} fold", n); + c.bench_function(id.as_str(), move |b| { + b.iter(|| { + for _ in 0..calc_iters(n) { + (0..n).powerset().fold(0, |s, elt| s + black_box(elt).len()); + } + }) + }); +} -fn powerset_1(c: &mut Criterion) { powerset_n(c, 1); } +fn powerset_0(c: &mut Criterion) { + powerset_n(c, 0); +} -fn powerset_2(c: &mut Criterion) { powerset_n(c, 2); } +fn powerset_1(c: &mut Criterion) { + powerset_n(c, 1); +} -fn powerset_4(c: &mut Criterion) { powerset_n(c, 4); } +fn powerset_2(c: &mut Criterion) { + powerset_n(c, 2); +} -fn powerset_8(c: &mut Criterion) { powerset_n(c, 8); } +fn powerset_4(c: &mut Criterion) { + powerset_n(c, 4); +} -fn powerset_12(c: &mut Criterion) { powerset_n(c, 12); } +fn powerset_8(c: &mut Criterion) { + powerset_n(c, 8); +} + +fn powerset_12(c: &mut Criterion) { + powerset_n(c, 12); +} + +fn powerset_0_fold(c: &mut Criterion) { + powerset_n_fold(c, 0); +} + +fn powerset_1_fold(c: &mut Criterion) { + powerset_n_fold(c, 1); +} + +fn powerset_2_fold(c: &mut Criterion) { + powerset_n_fold(c, 2); +} + +fn powerset_4_fold(c: &mut Criterion) { + powerset_n_fold(c, 4); +} + +fn powerset_8_fold(c: &mut Criterion) { + powerset_n_fold(c, 8); +} + +fn powerset_12_fold(c: &mut Criterion) { + powerset_n_fold(c, 12); +} criterion_group!( benches, @@ -40,5 +87,11 @@ criterion_group!( powerset_4, powerset_8, powerset_12, + powerset_0_fold, + powerset_1_fold, + powerset_2_fold, + powerset_4_fold, + powerset_8_fold, + powerset_12_fold, ); -criterion_main!(benches); \ No newline at end of file +criterion_main!(benches); diff --git a/third_party/rust/itertools/benches/specializations.rs b/third_party/rust/itertools/benches/specializations.rs new file mode 100644 index 00000000000..e70323f8e6c --- /dev/null +++ b/third_party/rust/itertools/benches/specializations.rs @@ -0,0 +1,669 @@ +#![allow(unstable_name_collisions)] + +use criterion::black_box; +use criterion::BenchmarkId; +use itertools::Itertools; + +const NTH_INPUTS: &[usize] = &[0, 1, 2, 4, 8]; + +/// Create multiple functions each defining a benchmark group about iterator methods. +/// +/// Each created group has functions with the following ids: +/// +/// - `next`, `size_hint`, `count`, `last`, `nth`, `collect`, `fold` +/// - and when marked as `DoubleEndedIterator`: `next_back`, `nth_back`, `rfold` +/// - and when marked as `ExactSizeIterator`: `len` +/// +/// Note that this macro can be called only once. +macro_rules! bench_specializations { + ( + $( + $name:ident { + $($extra:ident)* + {$( + $init:stmt; + )*} + $iterator:expr + } + )* + ) => { + $( + #[allow(unused_must_use)] + fn $name(c: &mut ::criterion::Criterion) { + let mut bench_group = c.benchmark_group(stringify!($name)); + $( + $init + )* + let bench_first_its = { + let mut bench_idx = 0; + [0; 1000].map(|_| { + let mut it = $iterator; + if bench_idx != 0 { + it.nth(bench_idx - 1); + } + bench_idx += 1; + it + }) + }; + bench_specializations!(@Iterator bench_group bench_first_its: $iterator); + $( + bench_specializations!(@$extra bench_group bench_first_its: $iterator); + )* + bench_group.finish(); + } + )* + + ::criterion::criterion_group!(benches, $($name, )*); + ::criterion::criterion_main!(benches); + }; + + (@Iterator $group:ident $first_its:ident: $iterator:expr) => { + $group.bench_function("next", |bencher| bencher.iter(|| { + let mut it = $iterator; + while let Some(x) = it.next() { + black_box(x); + } + })); + $group.bench_function("size_hint", |bencher| bencher.iter(|| { + $first_its.iter().for_each(|it| { + black_box(it.size_hint()); + }) + })); + $group.bench_function("count", |bencher| bencher.iter(|| { + $iterator.count() + })); + $group.bench_function("last", |bencher| bencher.iter(|| { + $iterator.last() + })); + for n in NTH_INPUTS { + $group.bench_with_input(BenchmarkId::new("nth", n), n, |bencher, n| bencher.iter(|| { + for start in 0_usize..10 { + let mut it = $iterator; + if let Some(s) = start.checked_sub(1) { + black_box(it.nth(s)); + } + while let Some(x) = it.nth(*n) { + black_box(x); + } + } + })); + } + $group.bench_function("collect", |bencher| bencher.iter(|| { + $iterator.collect::>() + })); + $group.bench_function("fold", |bencher| bencher.iter(|| { + $iterator.fold((), |(), x| { + black_box(x); + }) + })); + }; + + (@DoubleEndedIterator $group:ident $_first_its:ident: $iterator:expr) => { + $group.bench_function("next_back", |bencher| bencher.iter(|| { + let mut it = $iterator; + while let Some(x) = it.next_back() { + black_box(x); + } + })); + for n in NTH_INPUTS { + $group.bench_with_input(BenchmarkId::new("nth_back", n), n, |bencher, n| bencher.iter(|| { + for start in 0_usize..10 { + let mut it = $iterator; + if let Some(s) = start.checked_sub(1) { + black_box(it.nth_back(s)); + } + while let Some(x) = it.nth_back(*n) { + black_box(x); + } + } + })); + } + $group.bench_function("rfold", |bencher| bencher.iter(|| { + $iterator.rfold((), |(), x| { + black_box(x); + }) + })); + }; + + (@ExactSizeIterator $group:ident $first_its:ident: $_iterator:expr) => { + $group.bench_function("len", |bencher| bencher.iter(|| { + $first_its.iter().for_each(|it| { + black_box(it.len()); + }) + })); + }; +} + +// Usage examples: +// - For `ZipLongest::fold` only: +// cargo bench --bench specializations zip_longest/fold +// - For `.combinations(k).nth(8)`: +// cargo bench --bench specializations combinations./nth/8 +bench_specializations! { + interleave { + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + } + v1.iter().interleave(&v2) + } + interleave_shortest { + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + } + v1.iter().interleave_shortest(&v2) + } + batching { + { + let v = black_box(vec![0; 1024]); + } + v.iter().batching(Iterator::next) + } + tuple_windows1 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_,)>() + } + tuple_windows2 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_, _)>() + } + tuple_windows3 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_, _, _)>() + } + tuple_windows4 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_windows::<(_, _, _, _)>() + } + circular_tuple_windows1 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_,)>() + } + circular_tuple_windows2 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_, _)>() + } + circular_tuple_windows3 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_, _, _)>() + } + circular_tuple_windows4 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().circular_tuple_windows::<(_, _, _, _)>() + } + tuples1 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_,)>() + } + tuples2 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_, _)>() + } + tuples3 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_, _, _)>() + } + tuples4 { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuples::<(_, _, _, _)>() + } + tuple_buffer { + ExactSizeIterator + { + let v = black_box(vec![0; 11]); + // Short but the buffer can't have 12 or more elements. + } + { + let mut it = v.iter().tuples::<(_, _, _, _, _, _, _, _, _, _, _, _)>(); + it.next(); // No element but it fills the buffer. + it.into_buffer() + } + } + cartesian_product { + { + let v = black_box(vec![0; 16]); + } + itertools::iproduct!(&v, &v, &v) + } + multi_cartesian_product { + { + let vs = black_box([0; 3].map(|_| vec![0; 16])); + } + vs.iter().multi_cartesian_product() + } + coalesce { + { + let v = black_box(vec![0; 1024]); + } + v.iter().coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) }) + } + dedup { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup() + } + dedup_by { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup_by(PartialOrd::ge) + } + dedup_with_count { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup_with_count() + } + dedup_by_with_count { + { + let v = black_box((0..32).flat_map(|x| [x; 32]).collect_vec()); + } + v.iter().dedup_by_with_count(PartialOrd::ge) + } + duplicates { + DoubleEndedIterator + { + let v = black_box((0..32).cycle().take(1024).collect_vec()); + } + v.iter().duplicates() + } + duplicates_by { + DoubleEndedIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().duplicates_by(|x| *x % 10) + } + unique { + DoubleEndedIterator + { + let v = black_box((0..32).cycle().take(1024).collect_vec()); + } + v.iter().unique() + } + unique_by { + DoubleEndedIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().unique_by(|x| *x % 50) + } + take_while_inclusive { + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().take_while_inclusive(|x| **x < 1000) + } + pad_using { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().copied().pad_using(2048, |i| 5 * i) + } + positions { + DoubleEndedIterator + { + let v = black_box((0..1024).collect_vec()); + } + v.iter().positions(|x| x % 5 == 0) + } + update { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box((0_i32..1024).collect_vec()); + } + v.iter().copied().update(|x| *x *= 7) + } + tuple_combinations1 { + { + let v = black_box(vec![0; 1024]); + } + v.iter().tuple_combinations::<(_,)>() + } + tuple_combinations2 { + { + let v = black_box(vec![0; 64]); + } + v.iter().tuple_combinations::<(_, _)>() + } + tuple_combinations3 { + { + let v = black_box(vec![0; 64]); + } + v.iter().tuple_combinations::<(_, _, _)>() + } + tuple_combinations4 { + { + let v = black_box(vec![0; 64]); + } + v.iter().tuple_combinations::<(_, _, _, _)>() + } + intersperse { + { + let v = black_box(vec![0; 1024]); + let n = black_box(0); + } + v.iter().intersperse(&n) + } + intersperse_with { + { + let v = black_box(vec![0; 1024]); + let n = black_box(0); + } + v.iter().intersperse_with(|| &n) + } + combinations1 { + { + let v = black_box(vec![0; 1792]); + } + v.iter().combinations(1) + } + combinations2 { + { + let v = black_box(vec![0; 60]); + } + v.iter().combinations(2) + } + combinations3 { + { + let v = black_box(vec![0; 23]); + } + v.iter().combinations(3) + } + combinations4 { + { + let v = black_box(vec![0; 16]); + } + v.iter().combinations(4) + } + combinations_with_replacement1 { + { + let v = black_box(vec![0; 4096]); + } + v.iter().combinations_with_replacement(1) + } + combinations_with_replacement2 { + { + let v = black_box(vec![0; 90]); + } + v.iter().combinations_with_replacement(2) + } + combinations_with_replacement3 { + { + let v = black_box(vec![0; 28]); + } + v.iter().combinations_with_replacement(3) + } + combinations_with_replacement4 { + { + let v = black_box(vec![0; 16]); + } + v.iter().combinations_with_replacement(4) + } + permutations1 { + { + let v = black_box(vec![0; 1024]); + } + v.iter().permutations(1) + } + permutations2 { + { + let v = black_box(vec![0; 36]); + } + v.iter().permutations(2) + } + permutations3 { + { + let v = black_box(vec![0; 12]); + } + v.iter().permutations(3) + } + permutations4 { + { + let v = black_box(vec![0; 8]); + } + v.iter().permutations(4) + } + powerset { + { + let v = black_box(vec![0; 10]); + } + v.iter().powerset() + } + while_some { + {} + (0..) + .map(black_box) + .map(|i| char::from_digit(i, 16)) + .while_some() + } + with_position { + ExactSizeIterator + { + let v = black_box((0..10240).collect_vec()); + } + v.iter().with_position() + } + zip_longest { + DoubleEndedIterator + ExactSizeIterator + { + let xs = black_box(vec![0; 1024]); + let ys = black_box(vec![0; 768]); + } + xs.iter().zip_longest(ys.iter()) + } + zip_eq { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + v.iter().zip_eq(v.iter().rev()) + } + multizip { + DoubleEndedIterator + ExactSizeIterator + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + let v3 = black_box(vec![0; 2048]); + } + itertools::multizip((&v1, &v2, &v3)) + } + izip { + DoubleEndedIterator + ExactSizeIterator + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 768]); + let v3 = black_box(vec![0; 2048]); + } + itertools::izip!(&v1, &v2, &v3) + } + put_back { + { + let v = black_box(vec![0; 1024]); + } + itertools::put_back(&v).with_value(black_box(&0)) + } + put_back_n { + { + let v1 = black_box(vec![0; 1024]); + let v2 = black_box(vec![0; 16]); + } + { + let mut it = itertools::put_back_n(&v1); + for n in &v2 { + it.put_back(n); + } + it + } + } + exactly_one_error { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + } + // Use `at_most_one` would be similar. + v.iter().exactly_one().unwrap_err() + } + multipeek { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + let n = black_box(16); + } + { + let mut it = v.iter().multipeek(); + for _ in 0..n { + it.peek(); + } + it + } + } + peek_nth { + ExactSizeIterator + { + let v = black_box(vec![0; 1024]); + let n = black_box(16); + } + { + let mut it = itertools::peek_nth(&v); + it.peek_nth(n); + it + } + } + repeat_n { + DoubleEndedIterator + ExactSizeIterator + {} + itertools::repeat_n(black_box(0), black_box(1024)) + } + merge { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge(&v2) + } + merge_by { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge_by(&v2, PartialOrd::ge) + } + merge_join_by_ordering { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge_join_by(&v2, Ord::cmp) + } + merge_join_by_bool { + { + let v1 = black_box((0..1024).collect_vec()); + let v2 = black_box((0..768).collect_vec()); + } + v1.iter().merge_join_by(&v2, PartialOrd::ge) + } + kmerge { + { + let vs = black_box(vec![vec![0; 1024], vec![0; 256], vec![0; 768]]); + } + vs.iter().kmerge() + } + kmerge_by { + { + let vs = black_box(vec![vec![0; 1024], vec![0; 256], vec![0; 768]]); + } + vs.iter().kmerge_by(PartialOrd::ge) + } + map_into { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box(vec![0_u8; 1024]); + } + v.iter().copied().map_into::() + } + map_ok { + DoubleEndedIterator + ExactSizeIterator + { + let v = black_box((0_u32..1024) + .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) }) + .collect_vec()); + } + v.iter().copied().map_ok(|x| x + 1) + } + filter_ok { + DoubleEndedIterator + { + let v = black_box((0_u32..1024) + .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) }) + .collect_vec()); + } + v.iter().copied().filter_ok(|x| x % 3 == 0) + } + filter_map_ok { + DoubleEndedIterator + { + let v = black_box((0_u32..1024) + .map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) }) + .collect_vec()); + } + v.iter().copied().filter_map_ok(|x| if x % 3 == 0 { Some(x + 1) } else { None }) + } + flatten_ok { + DoubleEndedIterator + { + let d = black_box(vec![0; 8]); + let v = black_box((0..512) + .map(|x| if x % 2 == 0 { Ok(&d) } else { Err(x) }) + .collect_vec()); + } + v.iter().copied().flatten_ok() + } +} diff --git a/third_party/rust/itertools/benches/tree_fold1.rs b/third_party/rust/itertools/benches/tree_reduce.rs similarity index 50% rename from third_party/rust/itertools/benches/tree_fold1.rs rename to third_party/rust/itertools/benches/tree_reduce.rs index f12995db8e3..051b1488348 100644 --- a/third_party/rust/itertools/benches/tree_fold1.rs +++ b/third_party/rust/itertools/benches/tree_reduce.rs @@ -1,12 +1,15 @@ -use criterion::{criterion_group, criterion_main, Criterion}; -use itertools::{Itertools, cloned}; +#![allow(deprecated)] -trait IterEx : Iterator { +use criterion::{criterion_group, criterion_main, Criterion}; +use itertools::{cloned, Itertools}; + +trait IterEx: Iterator { // Another efficient implementation against which to compare, // but needs `std` so is less desirable. - fn tree_fold1_vec(self, mut f: F) -> Option - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, + fn tree_reduce_vec(self, mut f: F) -> Option + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, { let hint = self.size_hint().0; let cap = std::mem::size_of::() * 8 - hint.leading_zeros() as usize; @@ -21,24 +24,23 @@ trait IterEx : Iterator { stack.into_iter().fold1(f) } } -impl IterEx for T {} +impl IterEx for T {} macro_rules! def_benchs { ($N:expr, $FUN:ident, $BENCH_NAME:ident, - ) => ( + ) => { mod $BENCH_NAME { use super::*; pub fn sum(c: &mut Criterion) { - let v: Vec = (0.. $N).collect(); + let v: Vec = (0..$N).collect(); - c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " sum"), move |b| { - b.iter(|| { - cloned(&v).$FUN(|x, y| x + y) - }) - }); + c.bench_function( + &(stringify!($BENCH_NAME).replace('_', " ") + " sum"), + move |b| b.iter(|| cloned(&v).$FUN(|x, y| x + y)), + ); } pub fn complex_iter(c: &mut Criterion) { @@ -46,11 +48,10 @@ macro_rules! def_benchs { let v = (5..).take($N / 2); let it = u.chain(v); - c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " complex iter"), move |b| { - b.iter(|| { - it.clone().map(|x| x as f32).$FUN(f32::atan2) - }) - }); + c.bench_function( + &(stringify!($BENCH_NAME).replace('_', " ") + " complex iter"), + move |b| b.iter(|| it.clone().map(|x| x as f32).$FUN(f32::atan2)), + ); } pub fn string_format(c: &mut Criterion) { @@ -58,13 +59,18 @@ macro_rules! def_benchs { // size to not waste too much time in travis. The allocations // in here are so expensive anyway that it'll still take // way longer per iteration than the other two benchmarks. - let v: Vec = (0.. ($N/4)).collect(); + let v: Vec = (0..($N / 4)).collect(); - c.bench_function(&(stringify!($BENCH_NAME).replace('_', " ") + " string format"), move |b| { - b.iter(|| { - cloned(&v).map(|x| x.to_string()).$FUN(|x, y| format!("{} + {}", x, y)) - }) - }); + c.bench_function( + &(stringify!($BENCH_NAME).replace('_', " ") + " string format"), + move |b| { + b.iter(|| { + cloned(&v) + .map(|x| x.to_string()) + .$FUN(|x, y| format!("{} + {}", x, y)) + }) + }, + ); } } @@ -74,71 +80,71 @@ macro_rules! def_benchs { $BENCH_NAME::complex_iter, $BENCH_NAME::string_format, ); - ) + }; } -def_benchs!{ +def_benchs! { 10_000, fold1, fold1_10k, } -def_benchs!{ +def_benchs! { 10_000, - tree_fold1, - tree_fold1_stack_10k, + tree_reduce, + tree_reduce_stack_10k, } -def_benchs!{ +def_benchs! { 10_000, - tree_fold1_vec, - tree_fold1_vec_10k, + tree_reduce_vec, + tree_reduce_vec_10k, } -def_benchs!{ +def_benchs! { 100, fold1, fold1_100, } -def_benchs!{ +def_benchs! { 100, - tree_fold1, - tree_fold1_stack_100, + tree_reduce, + tree_reduce_stack_100, } -def_benchs!{ +def_benchs! { 100, - tree_fold1_vec, - tree_fold1_vec_100, + tree_reduce_vec, + tree_reduce_vec_100, } -def_benchs!{ +def_benchs! { 8, fold1, fold1_08, } -def_benchs!{ +def_benchs! { 8, - tree_fold1, - tree_fold1_stack_08, + tree_reduce, + tree_reduce_stack_08, } -def_benchs!{ +def_benchs! { 8, - tree_fold1_vec, - tree_fold1_vec_08, + tree_reduce_vec, + tree_reduce_vec_08, } criterion_main!( fold1_10k, - tree_fold1_stack_10k, - tree_fold1_vec_10k, + tree_reduce_stack_10k, + tree_reduce_vec_10k, fold1_100, - tree_fold1_stack_100, - tree_fold1_vec_100, + tree_reduce_stack_100, + tree_reduce_vec_100, fold1_08, - tree_fold1_stack_08, - tree_fold1_vec_08, + tree_reduce_stack_08, + tree_reduce_vec_08, ); diff --git a/third_party/rust/itertools/benches/tuples.rs b/third_party/rust/itertools/benches/tuples.rs index ea50aaaee1c..2eca34712ad 100644 --- a/third_party/rust/itertools/benches/tuples.rs +++ b/third_party/rust/itertools/benches/tuples.rs @@ -33,7 +33,7 @@ fn sum_s4(s: &[u32]) -> u32 { s4(s[0], s[1], s[2], s[3]) } -fn sum_t1(s: &(&u32, )) -> u32 { +fn sum_t1(s: &(&u32,)) -> u32 { s1(*s.0) } @@ -60,9 +60,9 @@ macro_rules! def_benchs { $WINDOWS:ident; $FOR_CHUNKS:ident, $FOR_WINDOWS:ident - ) => ( + ) => { fn $FOR_CHUNKS(c: &mut Criterion) { - let v: Vec = (0.. $N * 1_000).collect(); + let v: Vec = (0..$N * 1_000).collect(); let mut s = 0; c.bench_function(&stringify!($FOR_CHUNKS).replace('_', " "), move |b| { b.iter(|| { @@ -90,7 +90,7 @@ macro_rules! def_benchs { } fn $TUPLES(c: &mut Criterion) { - let v: Vec = (0.. $N * 1_000).collect(); + let v: Vec = (0..$N * 1_000).collect(); let mut s = 0; c.bench_function(&stringify!($TUPLES).replace('_', " "), move |b| { b.iter(|| { @@ -103,7 +103,7 @@ macro_rules! def_benchs { } fn $CHUNKS(c: &mut Criterion) { - let v: Vec = (0.. $N * 1_000).collect(); + let v: Vec = (0..$N * 1_000).collect(); let mut s = 0; c.bench_function(&stringify!($CHUNKS).replace('_', " "), move |b| { b.iter(|| { @@ -150,10 +150,10 @@ macro_rules! def_benchs { $TUPLE_WINDOWS, $WINDOWS, ); - ) + }; } -def_benchs!{ +def_benchs! { 1; benches_1, sum_t1, @@ -166,7 +166,7 @@ def_benchs!{ for_windows_1 } -def_benchs!{ +def_benchs! { 2; benches_2, sum_t2, @@ -179,7 +179,7 @@ def_benchs!{ for_windows_2 } -def_benchs!{ +def_benchs! { 3; benches_3, sum_t3, @@ -192,7 +192,7 @@ def_benchs!{ for_windows_3 } -def_benchs!{ +def_benchs! { 4; benches_4, sum_t4, @@ -205,9 +205,4 @@ def_benchs!{ for_windows_4 } -criterion_main!( - benches_1, - benches_2, - benches_3, - benches_4, -); +criterion_main!(benches_1, benches_2, benches_3, benches_4,); diff --git a/third_party/rust/itertools/clippy.toml b/third_party/rust/itertools/clippy.toml deleted file mode 100644 index 0a5485386ed..00000000000 --- a/third_party/rust/itertools/clippy.toml +++ /dev/null @@ -1 +0,0 @@ -msrv = "1.36.0" diff --git a/third_party/rust/itertools/examples/iris.rs b/third_party/rust/itertools/examples/iris.rs index 987d9e9cba4..63f9c483260 100644 --- a/third_party/rust/itertools/examples/iris.rs +++ b/third_party/rust/itertools/examples/iris.rs @@ -3,14 +3,13 @@ /// and does some simple manipulations. /// /// Iterators and itertools functionality are used throughout. - use itertools::Itertools; use std::collections::HashMap; use std::iter::repeat; use std::num::ParseFloatError; use std::str::FromStr; -static DATA: &'static str = include_str!("iris.data"); +static DATA: &str = include_str!("iris.data"); #[derive(Clone, Debug)] struct Iris { @@ -18,6 +17,7 @@ struct Iris { data: [f32; 4], } +#[allow(dead_code)] // fields are currently ignored #[derive(Clone, Debug)] enum ParseError { Numeric(ParseFloatError), @@ -26,7 +26,7 @@ enum ParseError { impl From for ParseError { fn from(err: ParseFloatError) -> Self { - ParseError::Numeric(err) + Self::Numeric(err) } } @@ -35,8 +35,11 @@ impl FromStr for Iris { type Err = ParseError; fn from_str(s: &str) -> Result { - let mut iris = Iris { name: "".into(), data: [0.; 4] }; - let mut parts = s.split(",").map(str::trim); + let mut iris = Self { + name: "".into(), + data: [0.; 4], + }; + let mut parts = s.split(',').map(str::trim); // using Iterator::by_ref() for (index, part) in parts.by_ref().take(4).enumerate() { @@ -45,7 +48,7 @@ impl FromStr for Iris { if let Some(name) = parts.next() { iris.name = name.into(); } else { - return Err(ParseError::Other("Missing name")) + return Err(ParseError::Other("Missing name")); } Ok(iris) } @@ -53,12 +56,13 @@ impl FromStr for Iris { fn main() { // using Itertools::fold_results to create the result of parsing - let irises = DATA.lines() - .map(str::parse) - .fold_ok(Vec::new(), |mut v, iris: Iris| { - v.push(iris); - v - }); + let irises = DATA + .lines() + .map(str::parse) + .fold_ok(Vec::new(), |mut v, iris: Iris| { + v.push(iris); + v + }); let mut irises = match irises { Err(e) => { println!("Error parsing: {:?}", e); @@ -74,19 +78,18 @@ fn main() { let mut plot_symbols = "+ox".chars().cycle(); let mut symbolmap = HashMap::new(); - // using Itertools::group_by - for (species, species_group) in &irises.iter().group_by(|iris| &iris.name) { + // using Itertools::chunk_by + for (species, species_chunk) in &irises.iter().chunk_by(|iris| &iris.name) { // assign a plot symbol - symbolmap.entry(species).or_insert_with(|| { - plot_symbols.next().unwrap() - }); + symbolmap + .entry(species) + .or_insert_with(|| plot_symbols.next().unwrap()); println!("{} (symbol={})", species, symbolmap[species]); - for iris in species_group { + for iris in species_chunk { // using Itertools::format for lazy formatting println!("{:>3.1}", iris.data.iter().format(", ")); } - } // Look at all combinations of the four columns diff --git a/third_party/rust/itertools/src/adaptors/coalesce.rs b/third_party/rust/itertools/src/adaptors/coalesce.rs index 3df7cc5823f..ab1ab5255dd 100644 --- a/third_party/rust/itertools/src/adaptors/coalesce.rs +++ b/third_party/rust/itertools/src/adaptors/coalesce.rs @@ -4,62 +4,78 @@ use std::iter::FusedIterator; use crate::size_hint; #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct CoalesceBy +pub struct CoalesceBy where I: Iterator, + C: CountItem, { iter: I, - last: Option, + /// `last` is `None` while no item have been taken out of `iter` (at definition). + /// Then `last` will be `Some(Some(item))` until `iter` is exhausted, + /// in which case `last` will be `Some(None)`. + last: Option>, f: F, } -impl Clone for CoalesceBy +impl Clone for CoalesceBy where - I: Iterator, + I: Clone + Iterator, + F: Clone, + C: CountItem, + C::CItem: Clone, { clone_fields!(last, iter, f); } -impl fmt::Debug for CoalesceBy +impl fmt::Debug for CoalesceBy where I: Iterator + fmt::Debug, - T: fmt::Debug, + C: CountItem, + C::CItem: fmt::Debug, { - debug_fmt_fields!(CoalesceBy, iter); + debug_fmt_fields!(CoalesceBy, iter, last); } pub trait CoalescePredicate { fn coalesce_pair(&mut self, t: T, item: Item) -> Result; } -impl Iterator for CoalesceBy +impl Iterator for CoalesceBy where I: Iterator, - F: CoalescePredicate, + F: CoalescePredicate, + C: CountItem, { - type Item = T; + type Item = C::CItem; fn next(&mut self) -> Option { + let Self { iter, last, f } = self; // this fuses the iterator - let last = self.last.take()?; + let init = match last { + Some(elt) => elt.take(), + None => { + *last = Some(None); + iter.next().map(C::new) + } + }?; - let self_last = &mut self.last; - let self_f = &mut self.f; Some( - self.iter - .try_fold(last, |last, next| match self_f.coalesce_pair(last, next) { - Ok(joined) => Ok(joined), - Err((last_, next_)) => { - *self_last = Some(next_); - Err(last_) - } - }) - .unwrap_or_else(|x| x), + iter.try_fold(init, |accum, next| match f.coalesce_pair(accum, next) { + Ok(joined) => Ok(joined), + Err((last_, next_)) => { + *last = Some(Some(next_)); + Err(last_) + } + }) + .unwrap_or_else(|x| x), ) } fn size_hint(&self) -> (usize, Option) { - let (low, hi) = size_hint::add_scalar(self.iter.size_hint(), self.last.is_some() as usize); + let (low, hi) = size_hint::add_scalar( + self.iter.size_hint(), + matches!(self.last, Some(Some(_))) as usize, + ); ((low > 0) as usize, hi) } @@ -67,9 +83,13 @@ where where FnAcc: FnMut(Acc, Self::Item) -> Acc, { - if let Some(last) = self.last { - let mut f = self.f; - let (last, acc) = self.iter.fold((last, acc), |(last, acc), elt| { + let Self { + mut iter, + last, + mut f, + } = self; + if let Some(last) = last.unwrap_or_else(|| iter.next().map(C::new)) { + let (last, acc) = iter.fold((last, acc), |(last, acc), elt| { match f.coalesce_pair(last, elt) { Ok(joined) => (joined, acc), Err((last_, next_)) => (next_, fn_acc(acc, last_)), @@ -82,12 +102,43 @@ where } } -impl, T> FusedIterator for CoalesceBy {} +impl FusedIterator for CoalesceBy +where + I: Iterator, + F: CoalescePredicate, + C: CountItem, +{ +} + +pub struct NoCount; + +pub struct WithCount; + +pub trait CountItem { + type CItem; + fn new(t: T) -> Self::CItem; +} + +impl CountItem for NoCount { + type CItem = T; + #[inline(always)] + fn new(t: T) -> T { + t + } +} + +impl CountItem for WithCount { + type CItem = (usize, T); + #[inline(always)] + fn new(t: T) -> (usize, T) { + (1, t) + } +} /// An iterator adaptor that may join together adjacent elements. /// /// See [`.coalesce()`](crate::Itertools::coalesce) for more information. -pub type Coalesce = CoalesceBy::Item>; +pub type Coalesce = CoalesceBy; impl CoalescePredicate for F where @@ -99,12 +150,12 @@ where } /// Create a new `Coalesce`. -pub fn coalesce(mut iter: I, f: F) -> Coalesce +pub fn coalesce(iter: I, f: F) -> Coalesce where I: Iterator, { Coalesce { - last: iter.next(), + last: None, iter, f, } @@ -113,7 +164,7 @@ where /// An iterator adaptor that removes repeated duplicates, determining equality using a comparison function. /// /// See [`.dedup_by()`](crate::Itertools::dedup_by) or [`.dedup()`](crate::Itertools::dedup) for more information. -pub type DedupBy = CoalesceBy, ::Item>; +pub type DedupBy = CoalesceBy, NoCount>; #[derive(Clone)] pub struct DedupPred2CoalescePred(DP); @@ -156,12 +207,12 @@ impl bool> DedupPredicate for F { } /// Create a new `DedupBy`. -pub fn dedup_by(mut iter: I, dedup_pred: Pred) -> DedupBy +pub fn dedup_by(iter: I, dedup_pred: Pred) -> DedupBy where I: Iterator, { DedupBy { - last: iter.next(), + last: None, iter, f: DedupPred2CoalescePred(dedup_pred), } @@ -186,7 +237,7 @@ where /// See [`.dedup_by_with_count()`](crate::Itertools::dedup_by_with_count) or /// [`.dedup_with_count()`](crate::Itertools::dedup_with_count) for more information. pub type DedupByWithCount = - CoalesceBy, (usize, ::Item)>; + CoalesceBy, WithCount>; #[derive(Clone, Debug)] pub struct DedupPredWithCount2CoalescePred(DP); @@ -215,12 +266,12 @@ where pub type DedupWithCount = DedupByWithCount; /// Create a new `DedupByWithCount`. -pub fn dedup_by_with_count(mut iter: I, dedup_pred: Pred) -> DedupByWithCount +pub fn dedup_by_with_count(iter: I, dedup_pred: Pred) -> DedupByWithCount where I: Iterator, { DedupByWithCount { - last: iter.next().map(|v| (1, v)), + last: None, iter, f: DedupPredWithCount2CoalescePred(dedup_pred), } diff --git a/third_party/rust/itertools/src/adaptors/map.rs b/third_party/rust/itertools/src/adaptors/map.rs index cf5e5a00d55..c78b9be6980 100644 --- a/third_party/rust/itertools/src/adaptors/map.rs +++ b/third_party/rust/itertools/src/adaptors/map.rs @@ -4,8 +4,8 @@ use std::marker::PhantomData; #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct MapSpecialCase { - iter: I, - f: F, + pub(crate) iter: I, + pub(crate) f: F, } pub trait MapSpecialCaseFn { @@ -67,10 +67,6 @@ where /// See [`.map_ok()`](crate::Itertools::map_ok) for more information. pub type MapOk = MapSpecialCase>; -/// See [`MapOk`]. -#[deprecated(note = "Use MapOk instead", since = "0.10.0")] -pub type MapResults = MapOk; - impl MapSpecialCaseFn> for MapSpecialCaseFnOk where F: FnMut(T) -> U, @@ -112,9 +108,19 @@ impl, U> MapSpecialCaseFn for MapSpecialCaseFnInto { } } -#[derive(Clone, Debug)] pub struct MapSpecialCaseFnInto(PhantomData); +impl std::fmt::Debug for MapSpecialCaseFnInto { + debug_fmt_fields!(MapSpecialCaseFnInto, 0); +} + +impl Clone for MapSpecialCaseFnInto { + #[inline] + fn clone(&self) -> Self { + Self(PhantomData) + } +} + /// Create a new [`MapInto`] iterator. pub fn map_into(iter: I) -> MapInto { MapSpecialCase { diff --git a/third_party/rust/itertools/src/adaptors/mod.rs b/third_party/rust/itertools/src/adaptors/mod.rs index 1695bbd6550..77192f26eb7 100644 --- a/third_party/rust/itertools/src/adaptors/mod.rs +++ b/third_party/rust/itertools/src/adaptors/mod.rs @@ -5,19 +5,17 @@ //! except according to those terms. mod coalesce; -mod map; +pub(crate) mod map; mod multi_product; pub use self::coalesce::*; pub use self::map::{map_into, map_ok, MapInto, MapOk}; -#[allow(deprecated)] -pub use self::map::MapResults; #[cfg(feature = "use_alloc")] pub use self::multi_product::*; +use crate::size_hint::{self, SizeHint}; use std::fmt; -use std::iter::{Fuse, Peekable, FromIterator, FusedIterator}; +use std::iter::{Enumerate, FromIterator, Fuse, FusedIterator}; use std::marker::PhantomData; -use crate::size_hint; /// An iterator adaptor that alternates elements from two iterators until both /// run out. @@ -28,55 +26,90 @@ use crate::size_hint; #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Interleave { - a: Fuse, - b: Fuse, - flag: bool, + i: Fuse, + j: Fuse, + next_coming_from_j: bool, } /// Create an iterator that interleaves elements in `i` and `j`. /// -/// [`IntoIterator`] enabled version of `[Itertools::interleave]`. -pub fn interleave(i: I, j: J) -> Interleave<::IntoIter, ::IntoIter> - where I: IntoIterator, - J: IntoIterator +/// [`IntoIterator`] enabled version of [`Itertools::interleave`](crate::Itertools::interleave). +pub fn interleave( + i: I, + j: J, +) -> Interleave<::IntoIter, ::IntoIter> +where + I: IntoIterator, + J: IntoIterator, { Interleave { - a: i.into_iter().fuse(), - b: j.into_iter().fuse(), - flag: false, + i: i.into_iter().fuse(), + j: j.into_iter().fuse(), + next_coming_from_j: false, } } impl Iterator for Interleave - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = I::Item; #[inline] fn next(&mut self) -> Option { - self.flag = !self.flag; - if self.flag { - match self.a.next() { - None => self.b.next(), + self.next_coming_from_j = !self.next_coming_from_j; + if self.next_coming_from_j { + match self.i.next() { + None => self.j.next(), r => r, } } else { - match self.b.next() { - None => self.a.next(), + match self.j.next() { + None => self.i.next(), r => r, } } } fn size_hint(&self) -> (usize, Option) { - size_hint::add(self.a.size_hint(), self.b.size_hint()) + size_hint::add(self.i.size_hint(), self.j.size_hint()) + } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let Self { + mut i, + mut j, + next_coming_from_j, + } = self; + if next_coming_from_j { + match j.next() { + Some(y) => init = f(init, y), + None => return i.fold(init, f), + } + } + let res = i.try_fold(init, |mut acc, x| { + acc = f(acc, x); + match j.next() { + Some(y) => Ok(f(acc, y)), + None => Err(acc), + } + }); + match res { + Ok(acc) => j.fold(acc, f), + Err(acc) => i.fold(acc, f), + } } } impl FusedIterator for Interleave - where I: Iterator, - J: Iterator -{} +where + I: Iterator, + J: Iterator, +{ +} /// An iterator adaptor that alternates elements from the two iterators until /// one of them runs out. @@ -88,37 +121,44 @@ impl FusedIterator for Interleave #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct InterleaveShortest - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { - it0: I, - it1: J, - phase: bool, // false ==> it0, true ==> it1 + i: I, + j: J, + next_coming_from_j: bool, } /// Create a new `InterleaveShortest` iterator. -pub fn interleave_shortest(a: I, b: J) -> InterleaveShortest - where I: Iterator, - J: Iterator +pub fn interleave_shortest(i: I, j: J) -> InterleaveShortest +where + I: Iterator, + J: Iterator, { InterleaveShortest { - it0: a, - it1: b, - phase: false, + i, + j, + next_coming_from_j: false, } } impl Iterator for InterleaveShortest - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = I::Item; #[inline] fn next(&mut self) -> Option { - let e = if self.phase { self.it1.next() } else { self.it0.next() }; + let e = if self.next_coming_from_j { + self.j.next() + } else { + self.i.next() + }; if e.is_some() { - self.phase = !self.phase; + self.next_coming_from_j = !self.next_coming_from_j; } e } @@ -126,24 +166,23 @@ impl Iterator for InterleaveShortest #[inline] fn size_hint(&self) -> (usize, Option) { let (curr_hint, next_hint) = { - let it0_hint = self.it0.size_hint(); - let it1_hint = self.it1.size_hint(); - if self.phase { - (it1_hint, it0_hint) + let i_hint = self.i.size_hint(); + let j_hint = self.j.size_hint(); + if self.next_coming_from_j { + (j_hint, i_hint) } else { - (it0_hint, it1_hint) + (i_hint, j_hint) } }; let (curr_lower, curr_upper) = curr_hint; let (next_lower, next_upper) = next_hint; let (combined_lower, combined_upper) = size_hint::mul_scalar(size_hint::min(curr_hint, next_hint), 2); - let lower = - if curr_lower > next_lower { - combined_lower + 1 - } else { - combined_lower - }; + let lower = if curr_lower > next_lower { + combined_lower + 1 + } else { + combined_lower + }; let upper = { let extra_elem = match (curr_upper, next_upper) { (_, None) => false, @@ -158,20 +197,52 @@ impl Iterator for InterleaveShortest }; (lower, upper) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let Self { + mut i, + mut j, + next_coming_from_j, + } = self; + if next_coming_from_j { + match j.next() { + Some(y) => init = f(init, y), + None => return init, + } + } + let res = i.try_fold(init, |mut acc, x| { + acc = f(acc, x); + match j.next() { + Some(y) => Ok(f(acc, y)), + None => Err(acc), + } + }); + match res { + Ok(val) => val, + Err(val) => val, + } + } } impl FusedIterator for InterleaveShortest - where I: FusedIterator, - J: FusedIterator -{} +where + I: FusedIterator, + J: FusedIterator, +{ +} #[derive(Clone, Debug)] /// An iterator adaptor that allows putting back a single /// item to the front of the iterator. /// /// Iterator element type is `I::Item`. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct PutBack - where I: Iterator +where + I: Iterator, { top: Option, iter: I, @@ -179,7 +250,8 @@ pub struct PutBack /// Create an iterator where you can put back a single item pub fn put_back(iterable: I) -> PutBack - where I: IntoIterator +where + I: IntoIterator, { PutBack { top: None, @@ -188,7 +260,8 @@ pub fn put_back(iterable: I) -> PutBack } impl PutBack - where I: Iterator +where + I: Iterator, { /// put back value `value` (builder method) pub fn with_value(mut self, value: I::Item) -> Self { @@ -199,21 +272,22 @@ impl PutBack /// Split the `PutBack` into its parts. #[inline] pub fn into_parts(self) -> (Option, I) { - let PutBack{top, iter} = self; + let Self { top, iter } = self; (top, iter) } /// Put back a single value to the front of the iterator. /// - /// If a value is already in the put back slot, it is overwritten. + /// If a value is already in the put back slot, it is returned. #[inline] - pub fn put_back(&mut self, x: I::Item) { - self.top = Some(x); + pub fn put_back(&mut self, x: I::Item) -> Option { + self.top.replace(x) } } impl Iterator for PutBack - where I: Iterator +where + I: Iterator, { type Item = I::Item; #[inline] @@ -252,7 +326,8 @@ impl Iterator for PutBack } fn all(&mut self, mut f: G) -> bool - where G: FnMut(Self::Item) -> bool + where + G: FnMut(Self::Item) -> bool, { if let Some(elt) = self.top.take() { if !f(elt) { @@ -263,7 +338,8 @@ impl Iterator for PutBack } fn fold(mut self, init: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + where + G: FnMut(Acc, Self::Item) -> Acc, { let mut accum = init; if let Some(elt) = self.top.take() { @@ -282,10 +358,14 @@ impl Iterator for PutBack /// See [`.cartesian_product()`](crate::Itertools::cartesian_product) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Product - where I: Iterator +where + I: Iterator, { a: I, - a_cur: Option, + /// `a_cur` is `None` while no item have been taken out of `a` (at definition). + /// Then `a_cur` will be `Some(Some(item))` until `a` is exhausted, + /// in which case `a_cur` will be `Some(None)`. + a_cur: Option>, b: J, b_orig: J, } @@ -293,13 +373,14 @@ pub struct Product /// Create a new cartesian product iterator /// /// Iterator element type is `(I::Item, J::Item)`. -pub fn cartesian_product(mut i: I, j: J) -> Product - where I: Iterator, - J: Clone + Iterator, - I::Item: Clone +pub fn cartesian_product(i: I, j: J) -> Product +where + I: Iterator, + J: Clone + Iterator, + I::Item: Clone, { Product { - a_cur: i.next(), + a_cur: None, a: i, b: j.clone(), b_orig: j, @@ -307,54 +388,69 @@ pub fn cartesian_product(mut i: I, j: J) -> Product } impl Iterator for Product - where I: Iterator, - J: Clone + Iterator, - I::Item: Clone +where + I: Iterator, + J: Clone + Iterator, + I::Item: Clone, { type Item = (I::Item, J::Item); fn next(&mut self) -> Option { - let elt_b = match self.b.next() { + let Self { + a, + a_cur, + b, + b_orig, + } = self; + let elt_b = match b.next() { None => { - self.b = self.b_orig.clone(); - match self.b.next() { + *b = b_orig.clone(); + match b.next() { None => return None, Some(x) => { - self.a_cur = self.a.next(); + *a_cur = Some(a.next()); x } } } - Some(x) => x + Some(x) => x, }; - self.a_cur.as_ref().map(|a| (a.clone(), elt_b)) + a_cur + .get_or_insert_with(|| a.next()) + .as_ref() + .map(|a| (a.clone(), elt_b)) } fn size_hint(&self) -> (usize, Option) { - let has_cur = self.a_cur.is_some() as usize; // Not ExactSizeIterator because size may be larger than usize - let (b_min, b_max) = self.b.size_hint(); - // Compute a * b_orig + b for both lower and upper bound - size_hint::add( - size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()), - (b_min * has_cur, b_max.map(move |x| x * has_cur))) + let mut sh = size_hint::mul(self.a.size_hint(), self.b_orig.size_hint()); + if matches!(self.a_cur, Some(Some(_))) { + sh = size_hint::add(sh, self.b.size_hint()); + } + sh } - fn fold(mut self, mut accum: Acc, mut f: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + fn fold(self, mut accum: Acc, mut f: G) -> Acc + where + G: FnMut(Acc, Self::Item) -> Acc, { // use a split loop to handle the loose a_cur as well as avoiding to // clone b_orig at the end. - if let Some(mut a) = self.a_cur.take() { - let mut b = self.b; + let Self { + mut a, + a_cur, + mut b, + b_orig, + } = self; + if let Some(mut elt_a) = a_cur.unwrap_or_else(|| a.next()) { loop { - accum = b.fold(accum, |acc, elt| f(acc, (a.clone(), elt))); + accum = b.fold(accum, |acc, elt| f(acc, (elt_a.clone(), elt))); // we can only continue iterating a if we had a first element; - if let Some(next_a) = self.a.next() { - b = self.b_orig.clone(); - a = next_a; + if let Some(next_elt_a) = a.next() { + b = b_orig.clone(); + elt_a = next_elt_a; } else { break; } @@ -365,15 +461,17 @@ impl Iterator for Product } impl FusedIterator for Product - where I: FusedIterator, - J: Clone + FusedIterator, - I::Item: Clone -{} +where + I: FusedIterator, + J: Clone + FusedIterator, + I::Item: Clone, +{ +} /// A “meta iterator adaptor”. Its closure receives a reference to the iterator /// and may pick off as many elements as it likes, to produce the next iterator element. /// -/// Iterator element type is *X*, if the return type of `F` is *Option\*. +/// Iterator element type is `X` if the return type of `F` is `Option`. /// /// See [`.batching()`](crate::Itertools::batching) for more information. #[derive(Clone)] @@ -383,7 +481,10 @@ pub struct Batching { iter: I, } -impl fmt::Debug for Batching where I: fmt::Debug { +impl fmt::Debug for Batching +where + I: fmt::Debug, +{ debug_fmt_fields!(Batching, iter); } @@ -393,8 +494,9 @@ pub fn batching(iter: I, f: F) -> Batching { } impl Iterator for Batching - where I: Iterator, - F: FnMut(&mut I) -> Option +where + I: Iterator, + F: FnMut(&mut I) -> Option, { type Item = B; #[inline] @@ -403,205 +505,6 @@ impl Iterator for Batching } } -/// An iterator adaptor that steps a number elements in the base iterator -/// for each iteration. -/// -/// The iterator steps by yielding the next element from the base iterator, -/// then skipping forward *n-1* elements. -/// -/// See [`.step()`](crate::Itertools::step) for more information. -#[deprecated(note="Use std .step_by() instead", since="0.8.0")] -#[allow(deprecated)] -#[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Step { - iter: Fuse, - skip: usize, -} - -/// Create a `Step` iterator. -/// -/// **Panics** if the step is 0. -#[allow(deprecated)] -pub fn step(iter: I, step: usize) -> Step - where I: Iterator -{ - assert!(step != 0); - Step { - iter: iter.fuse(), - skip: step - 1, - } -} - -#[allow(deprecated)] -impl Iterator for Step - where I: Iterator -{ - type Item = I::Item; - #[inline] - fn next(&mut self) -> Option { - let elt = self.iter.next(); - if self.skip > 0 { - self.iter.nth(self.skip - 1); - } - elt - } - - fn size_hint(&self) -> (usize, Option) { - let (low, high) = self.iter.size_hint(); - let div = |x: usize| { - if x == 0 { - 0 - } else { - 1 + (x - 1) / (self.skip + 1) - } - }; - (div(low), high.map(div)) - } -} - -// known size -#[allow(deprecated)] -impl ExactSizeIterator for Step - where I: ExactSizeIterator -{} - -pub trait MergePredicate { - fn merge_pred(&mut self, a: &T, b: &T) -> bool; -} - -#[derive(Clone, Debug)] -pub struct MergeLte; - -impl MergePredicate for MergeLte { - fn merge_pred(&mut self, a: &T, b: &T) -> bool { - a <= b - } -} - -/// An iterator adaptor that merges the two base iterators in ascending order. -/// If both base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.merge()`](crate::Itertools::merge_by) for more information. -pub type Merge = MergeBy; - -/// Create an iterator that merges elements in `i` and `j`. -/// -/// [`IntoIterator`] enabled version of [`Itertools::merge`](crate::Itertools::merge). -/// -/// ``` -/// use itertools::merge; -/// -/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) { -/// /* loop body */ -/// } -/// ``` -pub fn merge(i: I, j: J) -> Merge<::IntoIter, ::IntoIter> - where I: IntoIterator, - J: IntoIterator, - I::Item: PartialOrd -{ - merge_by_new(i, j, MergeLte) -} - -/// An iterator adaptor that merges the two base iterators in ascending order. -/// If both base iterators are sorted (ascending), the result is sorted. -/// -/// Iterator element type is `I::Item`. -/// -/// See [`.merge_by()`](crate::Itertools::merge_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MergeBy - where I: Iterator, - J: Iterator -{ - a: Peekable, - b: Peekable, - fused: Option, - cmp: F, -} - -impl fmt::Debug for MergeBy - where I: Iterator + fmt::Debug, J: Iterator + fmt::Debug, - I::Item: fmt::Debug, -{ - debug_fmt_fields!(MergeBy, a, b); -} - -implbool> MergePredicate for F { - fn merge_pred(&mut self, a: &T, b: &T) -> bool { - self(a, b) - } -} - -/// Create a `MergeBy` iterator. -pub fn merge_by_new(a: I, b: J, cmp: F) -> MergeBy - where I: IntoIterator, - J: IntoIterator, - F: MergePredicate, -{ - MergeBy { - a: a.into_iter().peekable(), - b: b.into_iter().peekable(), - fused: None, - cmp, - } -} - -impl Clone for MergeBy - where I: Iterator, - J: Iterator, - Peekable: Clone, - Peekable: Clone, - F: Clone -{ - clone_fields!(a, b, fused, cmp); -} - -impl Iterator for MergeBy - where I: Iterator, - J: Iterator, - F: MergePredicate -{ - type Item = I::Item; - - fn next(&mut self) -> Option { - let less_than = match self.fused { - Some(lt) => lt, - None => match (self.a.peek(), self.b.peek()) { - (Some(a), Some(b)) => self.cmp.merge_pred(a, b), - (Some(_), None) => { - self.fused = Some(true); - true - } - (None, Some(_)) => { - self.fused = Some(false); - false - } - (None, None) => return None, - } - }; - if less_than { - self.a.next() - } else { - self.b.next() - } - } - - fn size_hint(&self) -> (usize, Option) { - // Not ExactSizeIterator because size may be larger than usize - size_hint::add(self.a.size_hint(), self.b.size_hint()) - } -} - -impl FusedIterator for MergeBy - where I: FusedIterator, - J: FusedIterator, - F: MergePredicate -{} - /// An iterator adaptor that borrows from a `Clone`-able iterator /// to only pick off elements while the predicate returns `true`. /// @@ -612,22 +515,25 @@ pub struct TakeWhileRef<'a, I: 'a, F> { f: F, } -impl<'a, I, F> fmt::Debug for TakeWhileRef<'a, I, F> - where I: Iterator + fmt::Debug, +impl fmt::Debug for TakeWhileRef<'_, I, F> +where + I: Iterator + fmt::Debug, { debug_fmt_fields!(TakeWhileRef, iter); } /// Create a new `TakeWhileRef` from a reference to clonable iterator. pub fn take_while_ref(iter: &mut I, f: F) -> TakeWhileRef - where I: Iterator + Clone +where + I: Iterator + Clone, { TakeWhileRef { iter, f } } -impl<'a, I, F> Iterator for TakeWhileRef<'a, I, F> - where I: Iterator + Clone, - F: FnMut(&I::Item) -> bool +impl Iterator for TakeWhileRef<'_, I, F> +where + I: Iterator + Clone, + F: FnMut(&I::Item) -> bool, { type Item = I::Item; @@ -667,7 +573,8 @@ pub fn while_some(iter: I) -> WhileSome { } impl Iterator for WhileSome - where I: Iterator> +where + I: Iterator>, { type Item = A; @@ -681,6 +588,22 @@ impl Iterator for WhileSome fn size_hint(&self) -> (usize, Option) { (0, self.iter.size_hint().1) } + + fn fold(mut self, acc: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + let res = self.iter.try_fold(acc, |acc, item| match item { + Some(item) => Ok(f(acc, item)), + None => Err(acc), + }); + + match res { + Ok(val) => val, + Err(val) => val, + } + } } /// An iterator to iterate through all combinations in a `Clone`-able iterator that produces tuples @@ -689,10 +612,11 @@ impl Iterator for WhileSome /// See [`.tuple_combinations()`](crate::Itertools::tuple_combinations) for more /// information. #[derive(Clone, Debug)] -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[must_use = "this iterator adaptor is not lazy but does nearly nothing unless consumed"] pub struct TupleCombinations - where I: Iterator, - T: HasCombination +where + I: Iterator, + T: HasCombination, { iter: T::Combination, _mi: PhantomData, @@ -704,9 +628,10 @@ pub trait HasCombination: Sized { /// Create a new `TupleCombinations` from a clonable iterator. pub fn tuple_combinations(iter: I) -> TupleCombinations - where I: Iterator + Clone, - I::Item: Clone, - T: HasCombination, +where + I: Iterator + Clone, + I::Item: Clone, + T: HasCombination, { TupleCombinations { iter: T::Combination::from(iter), @@ -715,20 +640,38 @@ pub fn tuple_combinations(iter: I) -> TupleCombinations } impl Iterator for TupleCombinations - where I: Iterator, - T: HasCombination, +where + I: Iterator, + T: HasCombination, { type Item = T; fn next(&mut self) -> Option { self.iter.next() } + + fn size_hint(&self) -> SizeHint { + self.iter.size_hint() + } + + fn count(self) -> usize { + self.iter.count() + } + + fn fold(self, init: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + self.iter.fold(init, f) + } } impl FusedIterator for TupleCombinations - where I: FusedIterator, - T: HasCombination, -{} +where + I: FusedIterator, + T: HasCombination, +{ +} #[derive(Clone, Debug)] pub struct Tuple1Combination { @@ -737,7 +680,7 @@ pub struct Tuple1Combination { impl From for Tuple1Combination { fn from(iter: I) -> Self { - Tuple1Combination { iter } + Self { iter } } } @@ -747,6 +690,21 @@ impl Iterator for Tuple1Combination { fn next(&mut self) -> Option { self.iter.next().map(|x| (x,)) } + + fn size_hint(&self) -> SizeHint { + self.iter.size_hint() + } + + fn count(self) -> usize { + self.iter.count() + } + + fn fold(self, init: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + self.iter.map(|x| (x,)).fold(init, f) + } } impl HasCombination for (I::Item,) { @@ -780,22 +738,67 @@ macro_rules! impl_tuple_combination { impl Iterator for $C where I: Iterator + Clone, - I::Item: Clone + A: Clone, { type Item = (A, $(ignore_ident!($X, A)),*); fn next(&mut self) -> Option { - if let Some(($($X),*,)) = self.c.next() { + if let Some(($($X,)*)) = self.c.next() { let z = self.item.clone().unwrap(); Some((z, $($X),*)) } else { self.item = self.iter.next(); self.item.clone().and_then(|z| { self.c = self.iter.clone().into(); - self.c.next().map(|($($X),*,)| (z, $($X),*)) + self.c.next().map(|($($X,)*)| (z, $($X),*)) }) } } + + fn size_hint(&self) -> SizeHint { + const K: usize = 1 + count_ident!($($X)*); + let (mut n_min, mut n_max) = self.iter.size_hint(); + n_min = checked_binomial(n_min, K).unwrap_or(usize::MAX); + n_max = n_max.and_then(|n| checked_binomial(n, K)); + size_hint::add(self.c.size_hint(), (n_min, n_max)) + } + + fn count(self) -> usize { + const K: usize = 1 + count_ident!($($X)*); + let n = self.iter.count(); + checked_binomial(n, K).unwrap() + self.c.count() + } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + // We outline this closure to prevent it from unnecessarily + // capturing the type parameters `I`, `B`, and `F`. Not doing + // so ended up causing exponentially big types during MIR + // inlining when building itertools with optimizations enabled. + // + // This change causes a small improvement to compile times in + // release mode. + type CurrTuple
    = (A, $(ignore_ident!($X, A)),*); + type PrevTuple = ($(ignore_ident!($X, A),)*); + fn map_fn(z: &A) -> impl FnMut(PrevTuple) -> CurrTuple + '_ { + move |($($X,)*)| (z.clone(), $($X),*) + } + let Self { c, item, mut iter } = self; + if let Some(z) = item.as_ref() { + init = c + .map(map_fn::(z)) + .fold(init, &mut f); + } + while let Some(z) = iter.next() { + let c: $P = iter.clone().into(); + init = c + .map(map_fn::(&z)) + .fold(init, &mut f); + } + init + } } impl HasCombination for (A, $(ignore_ident!($X, A)),*) @@ -831,6 +834,42 @@ impl_tuple_combination!(Tuple10Combination Tuple9Combination; a b c d e f g h i) impl_tuple_combination!(Tuple11Combination Tuple10Combination; a b c d e f g h i j); impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i j k); +// https://en.wikipedia.org/wiki/Binomial_coefficient#In_programming_languages +pub(crate) fn checked_binomial(mut n: usize, mut k: usize) -> Option { + if n < k { + return Some(0); + } + // `factorial(n) / factorial(n - k) / factorial(k)` but trying to avoid it overflows: + k = (n - k).min(k); // symmetry + let mut c = 1; + for i in 1..=k { + c = (c / i) + .checked_mul(n)? + .checked_add((c % i).checked_mul(n)? / i)?; + n -= 1; + } + Some(c) +} + +#[test] +fn test_checked_binomial() { + // With the first row: [1, 0, 0, ...] and the first column full of 1s, we check + // row by row the recurrence relation of binomials (which is an equivalent definition). + // For n >= 1 and k >= 1 we have: + // binomial(n, k) == binomial(n - 1, k - 1) + binomial(n - 1, k) + const LIMIT: usize = 500; + let mut row = vec![Some(0); LIMIT + 1]; + row[0] = Some(1); + for n in 0..=LIMIT { + for k in 0..=LIMIT { + assert_eq!(row[k], checked_binomial(n, k)); + } + row = std::iter::once(Some(1)) + .chain((1..=LIMIT).map(|k| row[k - 1]?.checked_add(row[k]?))) + .collect(); + } +} + /// An iterator adapter to filter values within a nested `Result::Ok`. /// /// See [`.filter_ok()`](crate::Itertools::filter_ok) for more information. @@ -838,7 +877,7 @@ impl_tuple_combination!(Tuple12Combination Tuple11Combination; a b c d e f g h i #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct FilterOk { iter: I, - f: F + f: F, } impl fmt::Debug for FilterOk @@ -850,33 +889,26 @@ where /// Create a new `FilterOk` iterator. pub fn filter_ok(iter: I, f: F) -> FilterOk - where I: Iterator>, - F: FnMut(&T) -> bool, +where + I: Iterator>, + F: FnMut(&T) -> bool, { - FilterOk { - iter, - f, - } + FilterOk { iter, f } } impl Iterator for FilterOk - where I: Iterator>, - F: FnMut(&T) -> bool, +where + I: Iterator>, + F: FnMut(&T) -> bool, { type Item = Result; fn next(&mut self) -> Option { - loop { - match self.iter.next() { - Some(Ok(v)) => { - if (self.f)(&v) { - return Some(Ok(v)); - } - }, - Some(Err(e)) => return Some(Err(e)), - None => return None, - } - } + let f = &mut self.f; + self.iter.find(|res| match res { + Ok(t) => f(t), + _ => true, + }) } fn size_hint(&self) -> (usize, Option) { @@ -884,36 +916,65 @@ impl Iterator for FilterOk } fn fold(self, init: Acc, fold_f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.filter(|v| { - v.as_ref().map(&mut f).unwrap_or(true) - }).fold(init, fold_f) + self.iter + .filter(|v| v.as_ref().map(&mut f).unwrap_or(true)) + .fold(init, fold_f) } fn collect(self) -> C - where C: FromIterator + where + C: FromIterator, { let mut f = self.f; - self.iter.filter(|v| { - v.as_ref().map(&mut f).unwrap_or(true) - }).collect() + self.iter + .filter(|v| v.as_ref().map(&mut f).unwrap_or(true)) + .collect() + } +} + +impl DoubleEndedIterator for FilterOk +where + I: DoubleEndedIterator>, + F: FnMut(&T) -> bool, +{ + fn next_back(&mut self) -> Option { + let f = &mut self.f; + self.iter.rfind(|res| match res { + Ok(t) => f(t), + _ => true, + }) + } + + fn rfold(self, init: Acc, fold_f: Fold) -> Acc + where + Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter + .filter(|v| v.as_ref().map(&mut f).unwrap_or(true)) + .rfold(init, fold_f) } } impl FusedIterator for FilterOk - where I: FusedIterator>, - F: FnMut(&T) -> bool, -{} +where + I: FusedIterator>, + F: FnMut(&T) -> bool, +{ +} /// An iterator adapter to filter and apply a transformation on values within a nested `Result::Ok`. /// /// See [`.filter_map_ok()`](crate::Itertools::filter_map_ok) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone)] pub struct FilterMapOk { iter: I, - f: F + f: F, } impl fmt::Debug for FilterMapOk @@ -933,33 +994,26 @@ fn transpose_result(result: Result, E>) -> Option> /// Create a new `FilterOk` iterator. pub fn filter_map_ok(iter: I, f: F) -> FilterMapOk - where I: Iterator>, - F: FnMut(T) -> Option, +where + I: Iterator>, + F: FnMut(T) -> Option, { - FilterMapOk { - iter, - f, - } + FilterMapOk { iter, f } } impl Iterator for FilterMapOk - where I: Iterator>, - F: FnMut(T) -> Option, +where + I: Iterator>, + F: FnMut(T) -> Option, { type Item = Result; fn next(&mut self) -> Option { - loop { - match self.iter.next() { - Some(Ok(v)) => { - if let Some(v) = (self.f)(v) { - return Some(Ok(v)); - } - }, - Some(Err(e)) => return Some(Err(e)), - None => return None, - } - } + let f = &mut self.f; + self.iter.find_map(|res| match res { + Ok(t) => f(t).map(Ok), + Err(e) => Some(Err(e)), + }) } fn size_hint(&self) -> (usize, Option) { @@ -967,28 +1021,56 @@ impl Iterator for FilterMapOk } fn fold(self, init: Acc, fold_f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, + where + Fold: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.filter_map(|v| { - transpose_result(v.map(&mut f)) - }).fold(init, fold_f) + self.iter + .filter_map(|v| transpose_result(v.map(&mut f))) + .fold(init, fold_f) } fn collect(self) -> C - where C: FromIterator + where + C: FromIterator, { let mut f = self.f; - self.iter.filter_map(|v| { - transpose_result(v.map(&mut f)) - }).collect() + self.iter + .filter_map(|v| transpose_result(v.map(&mut f))) + .collect() + } +} + +impl DoubleEndedIterator for FilterMapOk +where + I: DoubleEndedIterator>, + F: FnMut(T) -> Option, +{ + fn next_back(&mut self) -> Option { + let f = &mut self.f; + self.iter.by_ref().rev().find_map(|res| match res { + Ok(t) => f(t).map(Ok), + Err(e) => Some(Err(e)), + }) + } + + fn rfold(self, init: Acc, fold_f: Fold) -> Acc + where + Fold: FnMut(Acc, Self::Item) -> Acc, + { + let mut f = self.f; + self.iter + .filter_map(|v| transpose_result(v.map(&mut f))) + .rfold(init, fold_f) } } impl FusedIterator for FilterMapOk - where I: FusedIterator>, - F: FnMut(T) -> Option, -{} +where + I: FusedIterator>, + F: FnMut(T) -> Option, +{ +} /// An iterator adapter to get the positions of each element that matches a predicate. /// @@ -996,70 +1078,90 @@ impl FusedIterator for FilterMapOk #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Positions { - iter: I, + iter: Enumerate, f: F, - count: usize, } impl fmt::Debug for Positions where I: fmt::Debug, { - debug_fmt_fields!(Positions, iter, count); + debug_fmt_fields!(Positions, iter); } /// Create a new `Positions` iterator. pub fn positions(iter: I, f: F) -> Positions - where I: Iterator, - F: FnMut(I::Item) -> bool, +where + I: Iterator, + F: FnMut(I::Item) -> bool, { - Positions { - iter, - f, - count: 0 - } + let iter = iter.enumerate(); + Positions { iter, f } } impl Iterator for Positions - where I: Iterator, - F: FnMut(I::Item) -> bool, +where + I: Iterator, + F: FnMut(I::Item) -> bool, { type Item = usize; fn next(&mut self) -> Option { - while let Some(v) = self.iter.next() { - let i = self.count; - self.count = i + 1; - if (self.f)(v) { - return Some(i); - } - } - None + let f = &mut self.f; + self.iter.find_map(|(count, val)| f(val).then_some(count)) } fn size_hint(&self) -> (usize, Option) { (0, self.iter.size_hint().1) } + + fn fold(self, init: B, mut func: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + let mut f = self.f; + self.iter.fold(init, |mut acc, (count, val)| { + if f(val) { + acc = func(acc, count); + } + acc + }) + } } impl DoubleEndedIterator for Positions - where I: DoubleEndedIterator + ExactSizeIterator, - F: FnMut(I::Item) -> bool, +where + I: DoubleEndedIterator + ExactSizeIterator, + F: FnMut(I::Item) -> bool, { fn next_back(&mut self) -> Option { - while let Some(v) = self.iter.next_back() { - if (self.f)(v) { - return Some(self.count + self.iter.len()) + let f = &mut self.f; + self.iter + .by_ref() + .rev() + .find_map(|(count, val)| f(val).then_some(count)) + } + + fn rfold(self, init: B, mut func: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + let mut f = self.f; + self.iter.rfold(init, |mut acc, (count, val)| { + if f(val) { + acc = func(acc, count); } - } - None + acc + }) } } impl FusedIterator for Positions - where I: FusedIterator, - F: FnMut(I::Item) -> bool, -{} +where + I: FusedIterator, + F: FnMut(I::Item) -> bool, +{ +} /// An iterator adapter to apply a mutating function to each element before yielding it. /// @@ -1108,18 +1210,28 @@ where } fn fold(self, init: Acc, mut g: G) -> Acc - where G: FnMut(Acc, Self::Item) -> Acc, + where + G: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.fold(init, move |acc, mut v| { f(&mut v); g(acc, v) }) + self.iter.fold(init, move |acc, mut v| { + f(&mut v); + g(acc, v) + }) } // if possible, re-use inner iterator specializations in collect fn collect(self) -> C - where C: FromIterator + where + C: FromIterator, { let mut f = self.f; - self.iter.map(move |mut v| { f(&mut v); v }).collect() + self.iter + .map(move |mut v| { + f(&mut v); + v + }) + .collect() } } @@ -1127,7 +1239,8 @@ impl ExactSizeIterator for Update where I: ExactSizeIterator, F: FnMut(&mut I::Item), -{} +{ +} impl DoubleEndedIterator for Update where @@ -1148,4 +1261,5 @@ impl FusedIterator for Update where I: FusedIterator, F: FnMut(&mut I::Item), -{} +{ +} diff --git a/third_party/rust/itertools/src/adaptors/multi_product.rs b/third_party/rust/itertools/src/adaptors/multi_product.rs index 0b384069873..314d4a46ef9 100644 --- a/third_party/rust/itertools/src/adaptors/multi_product.rs +++ b/third_party/rust/itertools/src/adaptors/multi_product.rs @@ -1,29 +1,52 @@ #![cfg(feature = "use_alloc")] - -use crate::size_hint; -use crate::Itertools; +use Option::{self as State, None as ProductEnded, Some as ProductInProgress}; +use Option::{self as CurrentItems, None as NotYetPopulated, Some as Populated}; use alloc::vec::Vec; +use crate::size_hint; + #[derive(Clone)] /// An iterator adaptor that iterates over the cartesian product of /// multiple iterators of type `I`. /// -/// An iterator element type is `Vec`. +/// An iterator element type is `Vec`. /// /// See [`.multi_cartesian_product()`](crate::Itertools::multi_cartesian_product) /// for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MultiProduct(Vec>) - where I: Iterator + Clone, - I::Item: Clone; +pub struct MultiProduct(State>) +where + I: Iterator + Clone, + I::Item: Clone; + +#[derive(Clone)] +/// Internals for `MultiProduct`. +struct MultiProductInner +where + I: Iterator + Clone, + I::Item: Clone, +{ + /// Holds the iterators. + iters: Vec>, + /// Not populated at the beginning then it holds the current item of each iterator. + cur: CurrentItems>, +} impl std::fmt::Debug for MultiProduct where I: Iterator + Clone + std::fmt::Debug, I::Item: Clone + std::fmt::Debug, { - debug_fmt_fields!(CoalesceBy, 0); + debug_fmt_fields!(MultiProduct, 0); +} + +impl std::fmt::Debug for MultiProductInner +where + I: Iterator + Clone + std::fmt::Debug, + I::Item: Clone + std::fmt::Debug, +{ + debug_fmt_fields!(MultiProductInner, iters, cur); } /// Create a new cartesian product iterator over an arbitrary number @@ -31,200 +54,178 @@ where /// /// Iterator element is of type `Vec`. pub fn multi_cartesian_product(iters: H) -> MultiProduct<::IntoIter> - where H: Iterator, - H::Item: IntoIterator, - ::IntoIter: Clone, - ::Item: Clone +where + H: Iterator, + H::Item: IntoIterator, + ::IntoIter: Clone, + ::Item: Clone, { - MultiProduct(iters.map(|i| MultiProductIter::new(i.into_iter())).collect()) + let inner = MultiProductInner { + iters: iters + .map(|i| MultiProductIter::new(i.into_iter())) + .collect(), + cur: NotYetPopulated, + }; + MultiProduct(ProductInProgress(inner)) } #[derive(Clone, Debug)] /// Holds the state of a single iterator within a `MultiProduct`. struct MultiProductIter - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { - cur: Option, iter: I, iter_orig: I, } -/// Holds the current state during an iteration of a `MultiProduct`. -#[derive(Debug)] -enum MultiProductIterState { - StartOfIter, - MidIter { on_first_iter: bool }, -} - -impl MultiProduct - where I: Iterator + Clone, - I::Item: Clone -{ - /// Iterates the rightmost iterator, then recursively iterates iterators - /// to the left if necessary. - /// - /// Returns true if the iteration succeeded, else false. - fn iterate_last( - multi_iters: &mut [MultiProductIter], - mut state: MultiProductIterState - ) -> bool { - use self::MultiProductIterState::*; - - if let Some((last, rest)) = multi_iters.split_last_mut() { - let on_first_iter = match state { - StartOfIter => { - let on_first_iter = !last.in_progress(); - state = MidIter { on_first_iter }; - on_first_iter - }, - MidIter { on_first_iter } => on_first_iter - }; - - if !on_first_iter { - last.iterate(); - } - - if last.in_progress() { - true - } else if MultiProduct::iterate_last(rest, state) { - last.reset(); - last.iterate(); - // If iterator is None twice consecutively, then iterator is - // empty; whole product is empty. - last.in_progress() - } else { - false - } - } else { - // Reached end of iterator list. On initialisation, return true. - // At end of iteration (final iterator finishes), finish. - match state { - StartOfIter => false, - MidIter { on_first_iter } => on_first_iter - } - } - } - - /// Returns the unwrapped value of the next iteration. - fn curr_iterator(&self) -> Vec { - self.0.iter().map(|multi_iter| { - multi_iter.cur.clone().unwrap() - }).collect() - } - - /// Returns true if iteration has started and has not yet finished; false - /// otherwise. - fn in_progress(&self) -> bool { - if let Some(last) = self.0.last() { - last.in_progress() - } else { - false - } - } -} - impl MultiProductIter - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { fn new(iter: I) -> Self { - MultiProductIter { - cur: None, + Self { iter: iter.clone(), - iter_orig: iter + iter_orig: iter, } } - - /// Iterate the managed iterator. - fn iterate(&mut self) { - self.cur = self.iter.next(); - } - - /// Reset the managed iterator. - fn reset(&mut self) { - self.iter = self.iter_orig.clone(); - } - - /// Returns true if the current iterator has been started and has not yet - /// finished; false otherwise. - fn in_progress(&self) -> bool { - self.cur.is_some() - } } impl Iterator for MultiProduct - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { type Item = Vec; fn next(&mut self) -> Option { - if MultiProduct::iterate_last( - &mut self.0, - MultiProductIterState::StartOfIter - ) { - Some(self.curr_iterator()) - } else { - None + // This fuses the iterator. + let inner = self.0.as_mut()?; + match &mut inner.cur { + Populated(values) => { + debug_assert!(!inner.iters.is_empty()); + // Find (from the right) a non-finished iterator and + // reset the finished ones encountered. + for (iter, item) in inner.iters.iter_mut().zip(values.iter_mut()).rev() { + if let Some(new) = iter.iter.next() { + *item = new; + return Some(values.clone()); + } else { + iter.iter = iter.iter_orig.clone(); + // `cur` is populated so the untouched `iter_orig` can not be empty. + *item = iter.iter.next().unwrap(); + } + } + self.0 = ProductEnded; + None + } + // Only the first time. + NotYetPopulated => { + let next: Option> = inner.iters.iter_mut().map(|i| i.iter.next()).collect(); + if next.is_none() || inner.iters.is_empty() { + // This cartesian product had at most one item to generate and now ends. + self.0 = ProductEnded; + } else { + inner.cur.clone_from(&next); + } + next + } } } fn count(self) -> usize { - if self.0.is_empty() { - return 0; + match self.0 { + ProductEnded => 0, + // The iterator is fresh so the count is the product of the length of each iterator: + // - If one of them is empty, stop counting. + // - Less `count()` calls than the general case. + ProductInProgress(MultiProductInner { + iters, + cur: NotYetPopulated, + }) => iters + .into_iter() + .map(|iter| iter.iter_orig.count()) + .try_fold(1, |product, count| { + if count == 0 { + None + } else { + Some(product * count) + } + }) + .unwrap_or_default(), + // The general case. + ProductInProgress(MultiProductInner { + iters, + cur: Populated(_), + }) => iters.into_iter().fold(0, |mut acc, iter| { + if acc != 0 { + acc *= iter.iter_orig.count(); + } + acc + iter.iter.count() + }), } - - if !self.in_progress() { - return self.0.into_iter().fold(1, |acc, multi_iter| { - acc * multi_iter.iter.count() - }); - } - - self.0.into_iter().fold( - 0, - |acc, MultiProductIter { iter, iter_orig, cur: _ }| { - let total_count = iter_orig.count(); - let cur_count = iter.count(); - acc * total_count + cur_count - } - ) } fn size_hint(&self) -> (usize, Option) { - // Not ExactSizeIterator because size may be larger than usize - if self.0.is_empty() { - return (0, Some(0)); - } - - if !self.in_progress() { - return self.0.iter().fold((1, Some(1)), |acc, multi_iter| { - size_hint::mul(acc, multi_iter.iter.size_hint()) - }); - } - - self.0.iter().fold( - (0, Some(0)), - |acc, &MultiProductIter { ref iter, ref iter_orig, cur: _ }| { - let cur_size = iter.size_hint(); - let total_size = iter_orig.size_hint(); - size_hint::add(size_hint::mul(acc, total_size), cur_size) + match &self.0 { + ProductEnded => (0, Some(0)), + ProductInProgress(MultiProductInner { + iters, + cur: NotYetPopulated, + }) => iters + .iter() + .map(|iter| iter.iter_orig.size_hint()) + .fold((1, Some(1)), size_hint::mul), + ProductInProgress(MultiProductInner { + iters, + cur: Populated(_), + }) => { + if let [first, tail @ ..] = &iters[..] { + tail.iter().fold(first.iter.size_hint(), |mut sh, iter| { + sh = size_hint::mul(sh, iter.iter_orig.size_hint()); + size_hint::add(sh, iter.iter.size_hint()) + }) + } else { + // Since it is populated, this cartesian product has started so `iters` is not empty. + unreachable!() + } } - ) + } } fn last(self) -> Option { - let iter_count = self.0.len(); - - let lasts: Self::Item = self.0.into_iter() - .map(|multi_iter| multi_iter.iter.last()) - .while_some() - .collect(); - - if lasts.len() == iter_count { - Some(lasts) + let MultiProductInner { iters, cur } = self.0?; + // Collect the last item of each iterator of the product. + if let Populated(values) = cur { + let mut count = iters.len(); + let last = iters + .into_iter() + .zip(values) + .map(|(i, value)| { + i.iter.last().unwrap_or_else(|| { + // The iterator is empty, use its current `value`. + count -= 1; + value + }) + }) + .collect(); + if count == 0 { + // `values` was the last item. + None + } else { + Some(last) + } } else { - None + iters.into_iter().map(|i| i.iter.last()).collect() } } } + +impl std::iter::FusedIterator for MultiProduct +where + I: Iterator + Clone, + I::Item: Clone, +{ +} diff --git a/third_party/rust/itertools/src/combinations.rs b/third_party/rust/itertools/src/combinations.rs index 68a59c5e4d0..54a02755160 100644 --- a/third_party/rust/itertools/src/combinations.rs +++ b/third_party/rust/itertools/src/combinations.rs @@ -1,61 +1,258 @@ +use core::array; +use core::borrow::BorrowMut; use std::fmt; use std::iter::FusedIterator; use super::lazy_buffer::LazyBuffer; use alloc::vec::Vec; +use crate::adaptors::checked_binomial; + +/// Iterator for `Vec` valued combinations returned by [`.combinations()`](crate::Itertools::combinations) +pub type Combinations = CombinationsGeneric>; +/// Iterator for const generic combinations returned by [`.array_combinations()`](crate::Itertools::array_combinations) +pub type ArrayCombinations = CombinationsGeneric; + +/// Create a new `Combinations` from a clonable iterator. +pub fn combinations(iter: I, k: usize) -> Combinations +where + I::Item: Clone, +{ + Combinations::new(iter, (0..k).collect()) +} + +/// Create a new `ArrayCombinations` from a clonable iterator. +pub fn array_combinations(iter: I) -> ArrayCombinations +where + I::Item: Clone, +{ + ArrayCombinations::new(iter, array::from_fn(|i| i)) +} + /// An iterator to iterate through all the `k`-length combinations in an iterator. /// -/// See [`.combinations()`](crate::Itertools::combinations) for more information. +/// See [`.combinations()`](crate::Itertools::combinations) and [`.array_combinations()`](crate::Itertools::array_combinations) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Combinations { - indices: Vec, +pub struct CombinationsGeneric { + indices: Idx, pool: LazyBuffer, first: bool, } -impl Clone for Combinations - where I: Clone + Iterator, - I::Item: Clone, +/// A type holding indices of elements in a pool or buffer of items from an inner iterator +/// and used to pick out different combinations in a generic way. +pub trait PoolIndex: BorrowMut<[usize]> { + type Item; + + fn extract_item>(&self, pool: &LazyBuffer) -> Self::Item + where + T: Clone; + + fn len(&self) -> usize { + self.borrow().len() + } +} + +impl PoolIndex for Vec { + type Item = Vec; + + fn extract_item>(&self, pool: &LazyBuffer) -> Vec + where + T: Clone, + { + pool.get_at(self) + } +} + +impl PoolIndex for [usize; K] { + type Item = [T; K]; + + fn extract_item>(&self, pool: &LazyBuffer) -> [T; K] + where + T: Clone, + { + pool.get_array(*self) + } +} + +impl Clone for CombinationsGeneric +where + I: Iterator + Clone, + I::Item: Clone, + Idx: Clone, { clone_fields!(indices, pool, first); } -impl fmt::Debug for Combinations - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +impl fmt::Debug for CombinationsGeneric +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, + Idx: fmt::Debug, { debug_fmt_fields!(Combinations, indices, pool, first); } -/// Create a new `Combinations` from a clonable iterator. -pub fn combinations(iter: I, k: usize) -> Combinations - where I: Iterator -{ - let mut pool = LazyBuffer::new(iter); - pool.prefill(k); - - Combinations { - indices: (0..k).collect(), - pool, - first: true, +impl> CombinationsGeneric { + /// Constructor with arguments the inner iterator and the initial state for the indices. + fn new(iter: I, indices: Idx) -> Self { + Self { + indices, + pool: LazyBuffer::new(iter), + first: true, + } } -} -impl Combinations { /// Returns the length of a combination produced by this iterator. #[inline] - pub fn k(&self) -> usize { self.indices.len() } + pub fn k(&self) -> usize { + self.indices.len() + } /// Returns the (current) length of the pool from which combination elements are /// selected. This value can change between invocations of [`next`](Combinations::next). #[inline] - pub fn n(&self) -> usize { self.pool.len() } + pub fn n(&self) -> usize { + self.pool.len() + } - /// Returns a reference to the source iterator. + /// Returns a reference to the source pool. #[inline] - pub(crate) fn src(&self) -> &I { &self.pool.it } + pub(crate) fn src(&self) -> &LazyBuffer { + &self.pool + } + /// Return the length of the inner iterator and the count of remaining combinations. + pub(crate) fn n_and_count(self) -> (usize, usize) { + let Self { + indices, + pool, + first, + } = self; + let n = pool.count(); + (n, remaining_for(n, first, indices.borrow()).unwrap()) + } + + /// Initialises the iterator by filling a buffer with elements from the + /// iterator. Returns true if there are no combinations, false otherwise. + fn init(&mut self) -> bool { + self.pool.prefill(self.k()); + let done = self.k() > self.n(); + if !done { + self.first = false; + } + + done + } + + /// Increments indices representing the combination to advance to the next + /// (in lexicographic order by increasing sequence) combination. For example + /// if we have n=4 & k=2 then `[0, 1] -> [0, 2] -> [0, 3] -> [1, 2] -> ...` + /// + /// Returns true if we've run out of combinations, false otherwise. + fn increment_indices(&mut self) -> bool { + // Borrow once instead of noise each time it's indexed + let indices = self.indices.borrow_mut(); + + if indices.is_empty() { + return true; // Done + } + // Scan from the end, looking for an index to increment + let mut i: usize = indices.len() - 1; + + // Check if we need to consume more from the iterator + if indices[i] == self.pool.len() - 1 { + self.pool.get_next(); // may change pool size + } + + while indices[i] == i + self.pool.len() - indices.len() { + if i > 0 { + i -= 1; + } else { + // Reached the last combination + return true; + } + } + + // Increment index, and reset the ones to its right + indices[i] += 1; + for j in i + 1..indices.len() { + indices[j] = indices[j - 1] + 1; + } + // If we've made it this far, we haven't run out of combos + false + } + + /// Returns the n-th item or the number of successful steps. + pub(crate) fn try_nth(&mut self, n: usize) -> Result<::Item, usize> + where + I: Iterator, + I::Item: Clone, + { + let done = if self.first { + self.init() + } else { + self.increment_indices() + }; + if done { + return Err(0); + } + for i in 0..n { + if self.increment_indices() { + return Err(i + 1); + } + } + Ok(self.indices.extract_item(&self.pool)) + } +} + +impl Iterator for CombinationsGeneric +where + I: Iterator, + I::Item: Clone, + Idx: PoolIndex, +{ + type Item = Idx::Item; + fn next(&mut self) -> Option { + let done = if self.first { + self.init() + } else { + self.increment_indices() + }; + + if done { + return None; + } + + Some(self.indices.extract_item(&self.pool)) + } + + fn nth(&mut self, n: usize) -> Option { + self.try_nth(n).ok() + } + + fn size_hint(&self) -> (usize, Option) { + let (mut low, mut upp) = self.pool.size_hint(); + low = remaining_for(low, self.first, self.indices.borrow()).unwrap_or(usize::MAX); + upp = upp.and_then(|upp| remaining_for(upp, self.first, self.indices.borrow())); + (low, upp) + } + + #[inline] + fn count(self) -> usize { + self.n_and_count().1 + } +} + +impl FusedIterator for CombinationsGeneric +where + I: Iterator, + I::Item: Clone, + Idx: PoolIndex, +{ +} + +impl Combinations { /// Resets this `Combinations` back to an initial state for combinations of length /// `k` over the same pool data source. If `k` is larger than the current length /// of the data pool an attempt is made to prefill the pool so that it holds `k` @@ -68,7 +265,6 @@ impl Combinations { for i in 0..k { self.indices[i] = i; } - } else { for i in 0..self.indices.len() { self.indices[i] = i; @@ -79,50 +275,34 @@ impl Combinations { } } -impl Iterator for Combinations - where I: Iterator, - I::Item: Clone -{ - type Item = Vec; - fn next(&mut self) -> Option { - if self.first { - if self.k() > self.n() { - return None; - } - self.first = false; - } else if self.indices.is_empty() { - return None; - } else { - // Scan from the end, looking for an index to increment - let mut i: usize = self.indices.len() - 1; +/// For a given size `n`, return the count of remaining combinations or None if it would overflow. +fn remaining_for(n: usize, first: bool, indices: &[usize]) -> Option { + let k = indices.len(); + if n < k { + Some(0) + } else if first { + checked_binomial(n, k) + } else { + // https://en.wikipedia.org/wiki/Combinatorial_number_system + // http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf - // Check if we need to consume more from the iterator - if self.indices[i] == self.pool.len() - 1 { - self.pool.get_next(); // may change pool size - } + // The combinations generated after the current one can be counted by counting as follows: + // - The subsequent combinations that differ in indices[0]: + // If subsequent combinations differ in indices[0], then their value for indices[0] + // must be at least 1 greater than the current indices[0]. + // As indices is strictly monotonically sorted, this means we can effectively choose k values + // from (n - 1 - indices[0]), leading to binomial(n - 1 - indices[0], k) possibilities. + // - The subsequent combinations with same indices[0], but differing indices[1]: + // Here we can choose k - 1 values from (n - 1 - indices[1]) values, + // leading to binomial(n - 1 - indices[1], k - 1) possibilities. + // - (...) + // - The subsequent combinations with same indices[0..=i], but differing indices[i]: + // Here we can choose k - i values from (n - 1 - indices[i]) values: binomial(n - 1 - indices[i], k - i). + // Since subsequent combinations can in any index, we must sum up the aforementioned binomial coefficients. - while self.indices[i] == i + self.pool.len() - self.indices.len() { - if i > 0 { - i -= 1; - } else { - // Reached the last combination - return None; - } - } - - // Increment index, and reset the ones to its right - self.indices[i] += 1; - for j in i+1..self.indices.len() { - self.indices[j] = self.indices[j - 1] + 1; - } - } - - // Create result vector based on the indices - Some(self.indices.iter().map(|i| self.pool[*i].clone()).collect()) + // Below, `n0` resembles indices[i]. + indices.iter().enumerate().try_fold(0usize, |sum, (i, n0)| { + sum.checked_add(checked_binomial(n - 1 - *n0, k - i)?) + }) } } - -impl FusedIterator for Combinations - where I: Iterator, - I::Item: Clone -{} diff --git a/third_party/rust/itertools/src/combinations_with_replacement.rs b/third_party/rust/itertools/src/combinations_with_replacement.rs index 0fec9671acb..c17e752508f 100644 --- a/third_party/rust/itertools/src/combinations_with_replacement.rs +++ b/third_party/rust/itertools/src/combinations_with_replacement.rs @@ -1,20 +1,23 @@ +use alloc::boxed::Box; use alloc::vec::Vec; use std::fmt; use std::iter::FusedIterator; use super::lazy_buffer::LazyBuffer; +use crate::adaptors::checked_binomial; /// An iterator to iterate through all the `n`-length combinations in an iterator, with replacement. /// /// See [`.combinations_with_replacement()`](crate::Itertools::combinations_with_replacement) /// for more information. #[derive(Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct CombinationsWithReplacement where I: Iterator, I::Item: Clone, { - indices: Vec, + indices: Box<[usize]>, pool: LazyBuffer, first: bool, } @@ -24,18 +27,7 @@ where I: Iterator + fmt::Debug, I::Item: fmt::Debug + Clone, { - debug_fmt_fields!(Combinations, indices, pool, first); -} - -impl CombinationsWithReplacement -where - I: Iterator, - I::Item: Clone, -{ - /// Map the current mask over the pool to get an output combination - fn current(&self) -> Vec { - self.indices.iter().map(|i| self.pool[*i].clone()).collect() - } + debug_fmt_fields!(CombinationsWithReplacement, indices, pool, first); } /// Create a new `CombinationsWithReplacement` from a clonable iterator. @@ -44,7 +36,7 @@ where I: Iterator, I::Item: Clone, { - let indices: Vec = alloc::vec![0; k]; + let indices = alloc::vec![0; k].into_boxed_slice(); let pool: LazyBuffer = LazyBuffer::new(iter); CombinationsWithReplacement { @@ -54,51 +46,95 @@ where } } +impl CombinationsWithReplacement +where + I: Iterator, + I::Item: Clone, +{ + /// Increments indices representing the combination to advance to the next + /// (in lexicographic order by increasing sequence) combination. + /// + /// Returns true if we've run out of combinations, false otherwise. + fn increment_indices(&mut self) -> bool { + // Check if we need to consume more from the iterator + // This will run while we increment our first index digit + self.pool.get_next(); + + // Work out where we need to update our indices + let mut increment = None; + for (i, indices_int) in self.indices.iter().enumerate().rev() { + if *indices_int < self.pool.len() - 1 { + increment = Some((i, indices_int + 1)); + break; + } + } + match increment { + // If we can update the indices further + Some((increment_from, increment_value)) => { + // We need to update the rightmost non-max value + // and all those to the right + self.indices[increment_from..].fill(increment_value); + false + } + // Otherwise, we're done + None => true, + } + } +} + impl Iterator for CombinationsWithReplacement where I: Iterator, I::Item: Clone, { type Item = Vec; + fn next(&mut self) -> Option { - // If this is the first iteration, return early if self.first { // In empty edge cases, stop iterating immediately - return if !(self.indices.is_empty() || self.pool.get_next()) { - None - // Otherwise, yield the initial state - } else { - self.first = false; - Some(self.current()) - }; + if !(self.indices.is_empty() || self.pool.get_next()) { + return None; + } + self.first = false; + } else if self.increment_indices() { + return None; } + Some(self.pool.get_at(&self.indices)) + } - // Check if we need to consume more from the iterator - // This will run while we increment our first index digit - self.pool.get_next(); - - // Work out where we need to update our indices - let mut increment: Option<(usize, usize)> = None; - for (i, indices_int) in self.indices.iter().enumerate().rev() { - if *indices_int < self.pool.len()-1 { - increment = Some((i, indices_int + 1)); - break; + fn nth(&mut self, n: usize) -> Option { + if self.first { + // In empty edge cases, stop iterating immediately + if !(self.indices.is_empty() || self.pool.get_next()) { + return None; + } + self.first = false; + } else if self.increment_indices() { + return None; + } + for _ in 0..n { + if self.increment_indices() { + return None; } } + Some(self.pool.get_at(&self.indices)) + } - match increment { - // If we can update the indices further - Some((increment_from, increment_value)) => { - // We need to update the rightmost non-max value - // and all those to the right - for indices_index in increment_from..self.indices.len() { - self.indices[indices_index] = increment_value; - } - Some(self.current()) - } - // Otherwise, we're done - None => None, - } + fn size_hint(&self) -> (usize, Option) { + let (mut low, mut upp) = self.pool.size_hint(); + low = remaining_for(low, self.first, &self.indices).unwrap_or(usize::MAX); + upp = upp.and_then(|upp| remaining_for(upp, self.first, &self.indices)); + (low, upp) + } + + fn count(self) -> usize { + let Self { + indices, + pool, + first, + } = self; + let n = pool.count(); + remaining_for(n, first, &indices).unwrap() } } @@ -106,4 +142,47 @@ impl FusedIterator for CombinationsWithReplacement where I: Iterator, I::Item: Clone, -{} +{ +} + +/// For a given size `n`, return the count of remaining combinations with replacement or None if it would overflow. +fn remaining_for(n: usize, first: bool, indices: &[usize]) -> Option { + // With a "stars and bars" representation, choose k values with replacement from n values is + // like choosing k out of k + n − 1 positions (hence binomial(k + n - 1, k) possibilities) + // to place k stars and therefore n - 1 bars. + // Example (n=4, k=6): ***|*||** represents [0,0,0,1,3,3]. + let count = |n: usize, k: usize| { + let positions = if n == 0 { + k.saturating_sub(1) + } else { + (n - 1).checked_add(k)? + }; + checked_binomial(positions, k) + }; + let k = indices.len(); + if first { + count(n, k) + } else { + // The algorithm is similar to the one for combinations *without replacement*, + // except we choose values *with replacement* and indices are *non-strictly* monotonically sorted. + + // The combinations generated after the current one can be counted by counting as follows: + // - The subsequent combinations that differ in indices[0]: + // If subsequent combinations differ in indices[0], then their value for indices[0] + // must be at least 1 greater than the current indices[0]. + // As indices is monotonically sorted, this means we can effectively choose k values with + // replacement from (n - 1 - indices[0]), leading to count(n - 1 - indices[0], k) possibilities. + // - The subsequent combinations with same indices[0], but differing indices[1]: + // Here we can choose k - 1 values with replacement from (n - 1 - indices[1]) values, + // leading to count(n - 1 - indices[1], k - 1) possibilities. + // - (...) + // - The subsequent combinations with same indices[0..=i], but differing indices[i]: + // Here we can choose k - i values with replacement from (n - 1 - indices[i]) values: count(n - 1 - indices[i], k - i). + // Since subsequent combinations can in any index, we must sum up the aforementioned binomial coefficients. + + // Below, `n0` resembles indices[i]. + indices.iter().enumerate().try_fold(0usize, |sum, (i, n0)| { + sum.checked_add(count(n - 1 - *n0, k - i)?) + }) + } +} diff --git a/third_party/rust/itertools/src/concat_impl.rs b/third_party/rust/itertools/src/concat_impl.rs index f022ec90afb..dc80839ce79 100644 --- a/third_party/rust/itertools/src/concat_impl.rs +++ b/third_party/rust/itertools/src/concat_impl.rs @@ -1,8 +1,6 @@ -use crate::Itertools; - /// Combine all an iterator's elements into one element by using [`Extend`]. /// -/// [`IntoIterator`]-enabled version of [`Itertools::concat`]. +/// [`IntoIterator`]-enabled version of [`Itertools::concat`](crate::Itertools::concat). /// /// This combinator will extend the first item with each of the rest of the /// items of the iterator. If the iterator is empty, the default value of @@ -10,14 +8,20 @@ use crate::Itertools; /// /// ```rust /// use itertools::concat; -/// +/// /// let input = vec![vec![1], vec![2, 3], vec![4, 5, 6]]; /// assert_eq!(concat(input), vec![1, 2, 3, 4, 5, 6]); /// ``` pub fn concat(iterable: I) -> I::Item - where I: IntoIterator, - I::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default +where + I: IntoIterator, + I::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default, { - #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce` - iterable.into_iter().fold1(|mut a, b| { a.extend(b); a }).unwrap_or_default() + iterable + .into_iter() + .reduce(|mut a, b| { + a.extend(b); + a + }) + .unwrap_or_default() } diff --git a/third_party/rust/itertools/src/cons_tuples_impl.rs b/third_party/rust/itertools/src/cons_tuples_impl.rs index ae0f48f3493..7e86260b48f 100644 --- a/third_party/rust/itertools/src/cons_tuples_impl.rs +++ b/third_party/rust/itertools/src/cons_tuples_impl.rs @@ -1,3 +1,4 @@ +use crate::adaptors::map::{MapSpecialCase, MapSpecialCaseFn}; macro_rules! impl_cons_iter( ($_A:ident, $_B:ident, ) => (); // stop @@ -5,60 +6,34 @@ macro_rules! impl_cons_iter( ($A:ident, $($B:ident,)*) => ( impl_cons_iter!($($B,)*); #[allow(non_snake_case)] - impl Iterator for ConsTuples - where Iter: Iterator, - { - type Item = ($($B,)* X, ); - fn next(&mut self) -> Option { - self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) - } - - fn size_hint(&self) -> (usize, Option) { - self.iter.size_hint() - } - fn fold(self, accum: Acc, mut f: Fold) -> Acc - where Fold: FnMut(Acc, Self::Item) -> Acc, - { - self.iter.fold(accum, move |acc, (($($B,)*), x)| f(acc, ($($B,)* x, ))) + impl<$($B),*, X> MapSpecialCaseFn<(($($B,)*), X)> for ConsTuplesFn { + type Out = ($($B,)* X, ); + fn call(&mut self, (($($B,)*), X): (($($B,)*), X)) -> Self::Out { + ($($B,)* X, ) } } - - #[allow(non_snake_case)] - impl DoubleEndedIterator for ConsTuples - where Iter: DoubleEndedIterator, - { - fn next_back(&mut self) -> Option { - self.iter.next().map(|(($($B,)*), x)| ($($B,)* x, )) - } - } - ); ); impl_cons_iter!(A, B, C, D, E, F, G, H, I, J, K, L,); +#[derive(Debug, Clone)] +pub struct ConsTuplesFn; + /// An iterator that maps an iterator of tuples like /// `((A, B), C)` to an iterator of `(A, B, C)`. /// /// Used by the `iproduct!()` macro. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct ConsTuples - where I: Iterator, -{ - iter: I, -} - -impl Clone for ConsTuples - where I: Clone + Iterator, -{ - clone_fields!(iter); -} +pub type ConsTuples = MapSpecialCase; /// Create an iterator that maps for example iterators of /// `((A, B), C)` to `(A, B, C)`. -pub fn cons_tuples(iterable: I) -> ConsTuples - where I: IntoIterator +pub fn cons_tuples(iterable: I) -> ConsTuples +where + I: IntoIterator, { - ConsTuples { iter: iterable.into_iter() } + ConsTuples { + iter: iterable.into_iter(), + f: ConsTuplesFn, + } } diff --git a/third_party/rust/itertools/src/diff.rs b/third_party/rust/itertools/src/diff.rs index 1731f0639fc..df88d803286 100644 --- a/third_party/rust/itertools/src/diff.rs +++ b/third_party/rust/itertools/src/diff.rs @@ -1,10 +1,12 @@ //! "Diff"ing iterators for caching elements to sequential collections without requiring the new //! elements' iterator to be `Clone`. //! -//! - [`Diff`] (produced by the [`diff_with`] function) +//! [`Diff`] (produced by the [`diff_with`] function) //! describes the difference between two non-`Clone` iterators `I` and `J` after breaking ASAP from //! a lock-step comparison. +use std::fmt; + use crate::free::put_back; use crate::structs::PutBack; @@ -13,8 +15,9 @@ use crate::structs::PutBack; /// `Diff` represents the way in which the elements yielded by the iterator `I` differ to some /// iterator `J`. pub enum Diff - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { /// The index of the first non-matching element along with both iterator's remaining elements /// starting with the first mis-match. @@ -25,6 +28,43 @@ pub enum Diff Longer(usize, PutBack), } +impl fmt::Debug for Diff +where + I: Iterator, + J: Iterator, + PutBack: fmt::Debug, + PutBack: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::FirstMismatch(idx, i, j) => f + .debug_tuple("FirstMismatch") + .field(idx) + .field(i) + .field(j) + .finish(), + Self::Shorter(idx, i) => f.debug_tuple("Shorter").field(idx).field(i).finish(), + Self::Longer(idx, j) => f.debug_tuple("Longer").field(idx).field(j).finish(), + } + } +} + +impl Clone for Diff +where + I: Iterator, + J: Iterator, + PutBack: Clone, + PutBack: Clone, +{ + fn clone(&self) -> Self { + match self { + Self::FirstMismatch(idx, i, j) => Self::FirstMismatch(*idx, i.clone(), j.clone()), + Self::Shorter(idx, i) => Self::Shorter(*idx, i.clone()), + Self::Longer(idx, j) => Self::Longer(*idx, j.clone()), + } + } +} + /// Compares every element yielded by both `i` and `j` with the given function in lock-step and /// returns a [`Diff`] which describes how `j` differs from `i`. /// @@ -37,11 +77,11 @@ pub enum Diff /// /// If `i` becomes exhausted before `j` becomes exhausted, the number of elements in `i` along with /// the remaining `j` elements will be returned as `Diff::Longer`. -pub fn diff_with(i: I, j: J, is_equal: F) - -> Option> - where I: IntoIterator, - J: IntoIterator, - F: Fn(&I::Item, &J::Item) -> bool +pub fn diff_with(i: I, j: J, mut is_equal: F) -> Option> +where + I: IntoIterator, + J: IntoIterator, + F: FnMut(&I::Item, &J::Item) -> bool, { let mut i = i.into_iter(); let mut j = j.into_iter(); @@ -49,13 +89,16 @@ pub fn diff_with(i: I, j: J, is_equal: F) while let Some(i_elem) = i.next() { match j.next() { None => return Some(Diff::Shorter(idx, put_back(i).with_value(i_elem))), - Some(j_elem) => if !is_equal(&i_elem, &j_elem) { - let remaining_i = put_back(i).with_value(i_elem); - let remaining_j = put_back(j).with_value(j_elem); - return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j)); - }, + Some(j_elem) => { + if !is_equal(&i_elem, &j_elem) { + let remaining_i = put_back(i).with_value(i_elem); + let remaining_j = put_back(j).with_value(j_elem); + return Some(Diff::FirstMismatch(idx, remaining_i, remaining_j)); + } + } } idx += 1; } - j.next().map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem))) + j.next() + .map(|j_elem| Diff::Longer(idx, put_back(j).with_value(j_elem))) } diff --git a/third_party/rust/itertools/src/duplicates_impl.rs b/third_party/rust/itertools/src/duplicates_impl.rs index 28eda44a97f..a0db15432d8 100644 --- a/third_party/rust/itertools/src/duplicates_impl.rs +++ b/third_party/rust/itertools/src/duplicates_impl.rs @@ -2,8 +2,8 @@ use std::hash::Hash; mod private { use std::collections::HashMap; - use std::hash::Hash; use std::fmt; + use std::hash::Hash; #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] @@ -22,7 +22,7 @@ mod private { impl DuplicatesBy { pub(crate) fn new(iter: I, key_method: F) -> Self { - DuplicatesBy { + Self { iter, meta: Meta { used: HashMap::new(), @@ -77,7 +77,7 @@ mod private { type Item = I::Item; fn next(&mut self) -> Option { - let DuplicatesBy { iter, meta } = self; + let Self { iter, meta } = self; iter.find_map(|v| meta.filter(v)) } @@ -109,7 +109,7 @@ mod private { F: KeyMethod, { fn next_back(&mut self) -> Option { - let DuplicatesBy { iter, meta } = self; + let Self { iter, meta } = self; iter.rev().find_map(|v| meta.filter(v)) } } @@ -122,7 +122,7 @@ mod private { } /// Apply the identity function to elements before checking them for equality. - #[derive(Debug)] + #[derive(Debug, Clone)] pub struct ById; impl KeyMethod for ById { type Container = JustValue; @@ -133,6 +133,7 @@ mod private { } /// Apply a user-supplied function to elements before checking them for equality. + #[derive(Clone)] pub struct ByFn(pub(crate) F); impl fmt::Debug for ByFn { debug_fmt_fields!(ByFn,); @@ -213,4 +214,3 @@ where { Duplicates::new(iter, private::ById) } - diff --git a/third_party/rust/itertools/src/either_or_both.rs b/third_party/rust/itertools/src/either_or_both.rs index ef3985f757a..b7a7fc14115 100644 --- a/third_party/rust/itertools/src/either_or_both.rs +++ b/third_party/rust/itertools/src/either_or_both.rs @@ -1,10 +1,12 @@ +use core::ops::{Deref, DerefMut}; + use crate::EitherOrBoth::*; use either::Either; /// Value that either holds a single A or B, or both. #[derive(Clone, PartialEq, Eq, Hash, Debug)] -pub enum EitherOrBoth { +pub enum EitherOrBoth { /// Both values are present. Both(A, B), /// Only the left value of type `A` is present. @@ -14,7 +16,7 @@ pub enum EitherOrBoth { } impl EitherOrBoth { - /// If `Left`, or `Both`, return true, otherwise, return false. + /// If `Left`, or `Both`, return true. Otherwise, return false. pub fn has_left(&self) -> bool { self.as_ref().left().is_some() } @@ -24,31 +26,24 @@ impl EitherOrBoth { self.as_ref().right().is_some() } - /// If Left, return true otherwise, return false. + /// If `Left`, return true. Otherwise, return false. /// Exclusive version of [`has_left`](EitherOrBoth::has_left). pub fn is_left(&self) -> bool { - match *self { - Left(_) => true, - _ => false, - } + matches!(self, Left(_)) } - /// If Right, return true otherwise, return false. + /// If `Right`, return true. Otherwise, return false. /// Exclusive version of [`has_right`](EitherOrBoth::has_right). pub fn is_right(&self) -> bool { - match *self { - Right(_) => true, - _ => false, - } + matches!(self, Right(_)) } - /// If Right, return true otherwise, return false. - /// Equivalent to `self.as_ref().both().is_some()`. + /// If `Both`, return true. Otherwise, return false. pub fn is_both(&self) -> bool { self.as_ref().both().is_some() } - /// If `Left`, or `Both`, return `Some` with the left value, otherwise, return `None`. + /// If `Left`, or `Both`, return `Some` with the left value. Otherwise, return `None`. pub fn left(self) -> Option { match self { Left(left) | Both(left, _) => Some(left), @@ -56,7 +51,7 @@ impl EitherOrBoth { } } - /// If `Right`, or `Both`, return `Some` with the right value, otherwise, return `None`. + /// If `Right`, or `Both`, return `Some` with the right value. Otherwise, return `None`. pub fn right(self) -> Option { match self { Right(right) | Both(_, right) => Some(right), @@ -64,7 +59,65 @@ impl EitherOrBoth { } } - /// If Both, return `Some` tuple containing left and right. + /// Return tuple of options corresponding to the left and right value respectively + /// + /// If `Left` return `(Some(..), None)`, if `Right` return `(None,Some(..))`, else return + /// `(Some(..),Some(..))` + pub fn left_and_right(self) -> (Option, Option) { + self.map_any(Some, Some).or_default() + } + + /// If `Left`, return `Some` with the left value. If `Right` or `Both`, return `None`. + /// + /// # Examples + /// + /// ``` + /// // On the `Left` variant. + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Right, Both}}; + /// let x: EitherOrBoth<_, ()> = Left("bonjour"); + /// assert_eq!(x.just_left(), Some("bonjour")); + /// + /// // On the `Right` variant. + /// let x: EitherOrBoth<(), _> = Right("hola"); + /// assert_eq!(x.just_left(), None); + /// + /// // On the `Both` variant. + /// let x = Both("bonjour", "hola"); + /// assert_eq!(x.just_left(), None); + /// ``` + pub fn just_left(self) -> Option { + match self { + Left(left) => Some(left), + _ => None, + } + } + + /// If `Right`, return `Some` with the right value. If `Left` or `Both`, return `None`. + /// + /// # Examples + /// + /// ``` + /// // On the `Left` variant. + /// # use itertools::{EitherOrBoth::{Left, Right, Both}, EitherOrBoth}; + /// let x: EitherOrBoth<_, ()> = Left("auf wiedersehen"); + /// assert_eq!(x.just_left(), Some("auf wiedersehen")); + /// + /// // On the `Right` variant. + /// let x: EitherOrBoth<(), _> = Right("adios"); + /// assert_eq!(x.just_left(), None); + /// + /// // On the `Both` variant. + /// let x = Both("auf wiedersehen", "adios"); + /// assert_eq!(x.just_left(), None); + /// ``` + pub fn just_right(self) -> Option { + match self { + Right(right) => Some(right), + _ => None, + } + } + + /// If `Both`, return `Some` containing the left and right values. Otherwise, return `None`. pub fn both(self) -> Option<(A, B)> { match self { Both(a, b) => Some((a, b)), @@ -72,6 +125,28 @@ impl EitherOrBoth { } } + /// If `Left` or `Both`, return the left value. Otherwise, convert the right value and return it. + pub fn into_left(self) -> A + where + B: Into, + { + match self { + Left(a) | Both(a, _) => a, + Right(b) => b.into(), + } + } + + /// If `Right` or `Both`, return the right value. Otherwise, convert the left value and return it. + pub fn into_right(self) -> B + where + A: Into, + { + match self { + Right(b) | Both(_, b) => b, + Left(a) => a.into(), + } + } + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&A, &B>`. pub fn as_ref(&self) -> EitherOrBoth<&A, &B> { match *self { @@ -90,6 +165,32 @@ impl EitherOrBoth { } } + /// Converts from `&EitherOrBoth` to `EitherOrBoth<&_, &_>` using the [`Deref`] trait. + pub fn as_deref(&self) -> EitherOrBoth<&A::Target, &B::Target> + where + A: Deref, + B: Deref, + { + match *self { + Left(ref left) => Left(left), + Right(ref right) => Right(right), + Both(ref left, ref right) => Both(left, right), + } + } + + /// Converts from `&mut EitherOrBoth` to `EitherOrBoth<&mut _, &mut _>` using the [`DerefMut`] trait. + pub fn as_deref_mut(&mut self) -> EitherOrBoth<&mut A::Target, &mut B::Target> + where + A: DerefMut, + B: DerefMut, + { + match *self { + Left(ref mut left) => Left(left), + Right(ref mut right) => Right(right), + Both(ref mut left, ref mut right) => Both(left, right), + } + } + /// Convert `EitherOrBoth` to `EitherOrBoth`. pub fn flip(self) -> EitherOrBoth { match self { @@ -200,9 +301,9 @@ impl EitherOrBoth { B: Default, { match self { - EitherOrBoth::Left(l) => (l, B::default()), - EitherOrBoth::Right(r) => (A::default(), r), - EitherOrBoth::Both(l, r) => (l, r), + Left(l) => (l, B::default()), + Right(r) => (A::default(), r), + Both(l, r) => (l, r), } } @@ -227,10 +328,160 @@ impl EitherOrBoth { Both(inner_l, inner_r) => (inner_l, inner_r), } } + + /// Returns a mutable reference to the left value. If the left value is not present, + /// it is replaced with `val`. + pub fn left_or_insert(&mut self, val: A) -> &mut A { + self.left_or_insert_with(|| val) + } + + /// Returns a mutable reference to the right value. If the right value is not present, + /// it is replaced with `val`. + pub fn right_or_insert(&mut self, val: B) -> &mut B { + self.right_or_insert_with(|| val) + } + + /// If the left value is not present, replace it the value computed by the closure `f`. + /// Returns a mutable reference to the now-present left value. + pub fn left_or_insert_with(&mut self, f: F) -> &mut A + where + F: FnOnce() -> A, + { + match self { + Left(left) | Both(left, _) => left, + Right(_) => self.insert_left(f()), + } + } + + /// If the right value is not present, replace it the value computed by the closure `f`. + /// Returns a mutable reference to the now-present right value. + pub fn right_or_insert_with(&mut self, f: F) -> &mut B + where + F: FnOnce() -> B, + { + match self { + Right(right) | Both(_, right) => right, + Left(_) => self.insert_right(f()), + } + } + + /// Sets the `left` value of this instance, and returns a mutable reference to it. + /// Does not affect the `right` value. + /// + /// # Examples + /// ``` + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Right, Both}}; + /// + /// // Overwriting a pre-existing value. + /// let mut either: EitherOrBoth<_, ()> = Left(0_u32); + /// assert_eq!(*either.insert_left(69), 69); + /// + /// // Inserting a second value. + /// let mut either = Right("no"); + /// assert_eq!(*either.insert_left("yes"), "yes"); + /// assert_eq!(either, Both("yes", "no")); + /// ``` + pub fn insert_left(&mut self, val: A) -> &mut A { + match self { + Left(left) | Both(left, _) => { + *left = val; + left + } + Right(right) => { + // This is like a map in place operation. We move out of the reference, + // change the value, and then move back into the reference. + unsafe { + // SAFETY: We know this pointer is valid for reading since we got it from a reference. + let right = std::ptr::read(right as *mut _); + // SAFETY: Again, we know the pointer is valid since we got it from a reference. + std::ptr::write(self as *mut _, Both(val, right)); + } + + if let Both(left, _) = self { + left + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } + } + } + + /// Sets the `right` value of this instance, and returns a mutable reference to it. + /// Does not affect the `left` value. + /// + /// # Examples + /// ``` + /// # use itertools::{EitherOrBoth, EitherOrBoth::{Left, Both}}; + /// // Overwriting a pre-existing value. + /// let mut either: EitherOrBoth<_, ()> = Left(0_u32); + /// assert_eq!(*either.insert_left(69), 69); + /// + /// // Inserting a second value. + /// let mut either = Left("what's"); + /// assert_eq!(*either.insert_right(9 + 10), 21 - 2); + /// assert_eq!(either, Both("what's", 9+10)); + /// ``` + pub fn insert_right(&mut self, val: B) -> &mut B { + match self { + Right(right) | Both(_, right) => { + *right = val; + right + } + Left(left) => { + // This is like a map in place operation. We move out of the reference, + // change the value, and then move back into the reference. + unsafe { + // SAFETY: We know this pointer is valid for reading since we got it from a reference. + let left = std::ptr::read(left as *mut _); + // SAFETY: Again, we know the pointer is valid since we got it from a reference. + std::ptr::write(self as *mut _, Both(left, val)); + } + if let Both(_, right) = self { + right + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } + } + } + + /// Set `self` to `Both(..)`, containing the specified left and right values, + /// and returns a mutable reference to those values. + pub fn insert_both(&mut self, left: A, right: B) -> (&mut A, &mut B) { + *self = Both(left, right); + if let Both(left, right) = self { + (left, right) + } else { + // SAFETY: The above pattern will always match, since we just + // set `self` equal to `Both`. + unsafe { std::hint::unreachable_unchecked() } + } + } } impl EitherOrBoth { - /// Return either value of left, right, or the product of `f` applied where `Both` are present. + /// Return either value of left, right, or apply a function `f` to both values if both are present. + /// The input function has to return the same type as both Right and Left carry. + /// + /// This function can be used to preferrably extract the left resp. right value, + /// but fall back to the other (i.e. right resp. left) if the preferred one is not present. + /// + /// # Examples + /// ``` + /// # use itertools::EitherOrBoth; + /// assert_eq!(EitherOrBoth::Both(3, 7).reduce(u32::max), 7); + /// assert_eq!(EitherOrBoth::Left(3).reduce(u32::max), 3); + /// assert_eq!(EitherOrBoth::Right(7).reduce(u32::max), 7); + /// + /// // Extract the left value if present, fall back to the right otherwise. + /// assert_eq!(EitherOrBoth::Left("left").reduce(|l, _r| l), "left"); + /// assert_eq!(EitherOrBoth::Right("right").reduce(|l, _r| l), "right"); + /// assert_eq!(EitherOrBoth::Both("left", "right").reduce(|l, _r| l), "left"); + /// ``` pub fn reduce(self, f: F) -> T where F: FnOnce(T, T) -> T, @@ -243,12 +494,21 @@ impl EitherOrBoth { } } -impl Into>> for EitherOrBoth { - fn into(self) -> Option> { - match self { - EitherOrBoth::Left(l) => Some(Either::Left(l)), - EitherOrBoth::Right(r) => Some(Either::Right(r)), - _ => None, +impl From> for Option> { + fn from(value: EitherOrBoth) -> Self { + match value { + Left(l) => Some(Either::Left(l)), + Right(r) => Some(Either::Right(r)), + Both(..) => None, + } + } +} + +impl From> for EitherOrBoth { + fn from(either: Either) -> Self { + match either { + Either::Left(l) => Left(l), + Either::Right(l) => Right(l), } } } diff --git a/third_party/rust/itertools/src/exactly_one_err.rs b/third_party/rust/itertools/src/exactly_one_err.rs index c54ae77ca92..19b9e19189a 100644 --- a/third_party/rust/itertools/src/exactly_one_err.rs +++ b/third_party/rust/itertools/src/exactly_one_err.rs @@ -8,7 +8,7 @@ use either::Either; use crate::size_hint; -/// Iterator returned for the error case of `IterTools::exactly_one()` +/// Iterator returned for the error case of `Itertools::exactly_one()` /// This iterator yields exactly the same elements as the input iterator. /// /// During the execution of `exactly_one` the iterator must be mutated. This wrapper @@ -54,26 +54,37 @@ where Some(Either::Left([first, second])) => { self.first_two = Some(Either::Right(second)); Some(first) - }, - Some(Either::Right(second)) => { - Some(second) - } - None => { - self.inner.next() } + Some(Either::Right(second)) => Some(second), + None => self.inner.next(), } } fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.inner.size_hint(), self.additional_len()) } -} + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + match self.first_two { + Some(Either::Left([first, second])) => { + init = f(init, first); + init = f(init, second); + } + Some(Either::Right(second)) => init = f(init, second), + None => {} + } + self.inner.fold(init, f) + } +} impl ExactSizeIterator for ExactlyOneError where I: ExactSizeIterator {} -impl Display for ExactlyOneError - where I: Iterator, +impl Display for ExactlyOneError +where + I: Iterator, { fn fmt(&self, f: &mut Formatter) -> FmtResult { let additional = self.additional_len(); @@ -85,26 +96,30 @@ impl Display for ExactlyOneError } } -impl Debug for ExactlyOneError - where I: Iterator + Debug, - I::Item: Debug, +impl Debug for ExactlyOneError +where + I: Iterator + Debug, + I::Item: Debug, { fn fmt(&self, f: &mut Formatter) -> FmtResult { + let mut dbg = f.debug_struct("ExactlyOneError"); match &self.first_two { Some(Either::Left([first, second])) => { - write!(f, "ExactlyOneError[First: {:?}, Second: {:?}, RemainingIter: {:?}]", first, second, self.inner) - }, + dbg.field("first", first).field("second", second); + } Some(Either::Right(second)) => { - write!(f, "ExactlyOneError[Second: {:?}, RemainingIter: {:?}]", second, self.inner) - } - None => { - write!(f, "ExactlyOneError[RemainingIter: {:?}]", self.inner) + dbg.field("second", second); } + None => {} } + dbg.field("inner", &self.inner).finish() } } #[cfg(feature = "use_std")] -impl Error for ExactlyOneError where I: Iterator + Debug, I::Item: Debug, {} - - +impl Error for ExactlyOneError +where + I: Iterator + Debug, + I::Item: Debug, +{ +} diff --git a/third_party/rust/itertools/src/extrema_set.rs b/third_party/rust/itertools/src/extrema_set.rs index ae128364c5d..7d353821f36 100644 --- a/third_party/rust/itertools/src/extrema_set.rs +++ b/third_party/rust/itertools/src/extrema_set.rs @@ -1,3 +1,4 @@ +use alloc::{vec, vec::Vec}; use std::cmp::Ordering; /// Implementation guts for `min_set`, `min_set_by`, and `min_set_by_key`. diff --git a/third_party/rust/itertools/src/flatten_ok.rs b/third_party/rust/itertools/src/flatten_ok.rs index 21ae1f72236..48f1e90a647 100644 --- a/third_party/rust/itertools/src/flatten_ok.rs +++ b/third_party/rust/itertools/src/flatten_ok.rs @@ -72,6 +72,29 @@ where } } + fn fold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + // Front + let mut acc = match self.inner_front { + Some(x) => x.fold(init, |a, o| f(a, Ok(o))), + None => init, + }; + + acc = self.iter.fold(acc, |acc, x| match x { + Ok(it) => it.into_iter().fold(acc, |a, o| f(a, Ok(o))), + Err(e) => f(acc, Err(e)), + }); + + // Back + match self.inner_back { + Some(x) => x.fold(acc, |a, o| f(a, Ok(o))), + None => acc, + } + } + fn size_hint(&self) -> (usize, Option) { let inner_hint = |inner: &Option| { inner @@ -130,6 +153,29 @@ where } } } + + fn rfold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + // Back + let mut acc = match self.inner_back { + Some(x) => x.rfold(init, |a, o| f(a, Ok(o))), + None => init, + }; + + acc = self.iter.rfold(acc, |acc, x| match x { + Ok(it) => it.into_iter().rfold(acc, |a, o| f(a, Ok(o))), + Err(e) => f(acc, Err(e)), + }); + + // Front + match self.inner_front { + Some(x) => x.rfold(acc, |a, o| f(a, Ok(o))), + None => acc, + } + } } impl Clone for FlattenOk @@ -147,13 +193,7 @@ where T: IntoIterator, T::IntoIter: fmt::Debug, { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("FlattenOk") - .field("iter", &self.iter) - .field("inner_front", &self.inner_front) - .field("inner_back", &self.inner_back) - .finish() - } + debug_fmt_fields!(FlattenOk, iter, inner_front, inner_back); } /// Only the iterator being flattened needs to implement [`FusedIterator`]. diff --git a/third_party/rust/itertools/src/format.rs b/third_party/rust/itertools/src/format.rs index d87cee95035..3abdda369c9 100644 --- a/third_party/rust/itertools/src/format.rs +++ b/third_party/rust/itertools/src/format.rs @@ -1,5 +1,5 @@ +use std::cell::Cell; use std::fmt; -use std::cell::RefCell; /// Format all iterator elements lazily, separated by `sep`. /// @@ -7,11 +7,10 @@ use std::cell::RefCell; /// exhausted. /// /// See [`.format_with()`](crate::Itertools::format_with) for more information. -#[derive(Clone)] pub struct FormatWith<'a, I, F> { sep: &'a str, - /// FormatWith uses interior mutability because Display::fmt takes &self. - inner: RefCell>, + /// `FormatWith` uses interior mutability because `Display::fmt` takes `&self`. + inner: Cell>, } /// Format all iterator elements lazily, separated by `sep`. @@ -21,38 +20,40 @@ pub struct FormatWith<'a, I, F> { /// /// See [`.format()`](crate::Itertools::format) /// for more information. -#[derive(Clone)] pub struct Format<'a, I> { sep: &'a str, - /// Format uses interior mutability because Display::fmt takes &self. - inner: RefCell>, + /// `Format` uses interior mutability because `Display::fmt` takes `&self`. + inner: Cell>, } pub fn new_format(iter: I, separator: &str, f: F) -> FormatWith<'_, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { FormatWith { sep: separator, - inner: RefCell::new(Some((iter, f))), + inner: Cell::new(Some((iter, f))), } } pub fn new_format_default(iter: I, separator: &str) -> Format<'_, I> - where I: Iterator, +where + I: Iterator, { Format { sep: separator, - inner: RefCell::new(Some(iter)), + inner: Cell::new(Some(iter)), } } -impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> - where I: Iterator, - F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result +impl fmt::Display for FormatWith<'_, I, F> +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let (mut iter, mut format) = match self.inner.borrow_mut().take() { + let (mut iter, mut format) = match self.inner.take() { Some(t) => t, None => panic!("FormatWith: was already formatted once"), }; @@ -70,13 +71,26 @@ impl<'a, I, F> fmt::Display for FormatWith<'a, I, F> } } -impl<'a, I> Format<'a, I> - where I: Iterator, +impl fmt::Debug for FormatWith<'_, I, F> +where + I: Iterator, + F: FnMut(I::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { - fn format(&self, f: &mut fmt::Formatter, mut cb: F) -> fmt::Result - where F: FnMut(&I::Item, &mut fmt::Formatter) -> fmt::Result, - { - let mut iter = match self.inner.borrow_mut().take() { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl Format<'_, I> +where + I: Iterator, +{ + fn format( + &self, + f: &mut fmt::Formatter, + cb: fn(&I::Item, &mut fmt::Formatter) -> fmt::Result, + ) -> fmt::Result { + let mut iter = match self.inner.take() { Some(t) => t, None => panic!("Format: was already formatted once"), }; @@ -109,5 +123,56 @@ macro_rules! impl_format { } } -impl_format!{Display Debug - UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} +impl_format! {Display Debug UpperExp LowerExp UpperHex LowerHex Octal Binary Pointer} + +impl Clone for FormatWith<'_, I, F> +where + (I, F): Clone, +{ + fn clone(&self) -> Self { + struct PutBackOnDrop<'r, 'a, I, F> { + into: &'r FormatWith<'a, I, F>, + inner: Option<(I, F)>, + } + // This ensures we preserve the state of the original `FormatWith` if `Clone` panics + impl Drop for PutBackOnDrop<'_, '_, I, F> { + fn drop(&mut self) { + self.into.inner.set(self.inner.take()) + } + } + let pbod = PutBackOnDrop { + inner: self.inner.take(), + into: self, + }; + Self { + inner: Cell::new(pbod.inner.clone()), + sep: self.sep, + } + } +} + +impl Clone for Format<'_, I> +where + I: Clone, +{ + fn clone(&self) -> Self { + struct PutBackOnDrop<'r, 'a, I> { + into: &'r Format<'a, I>, + inner: Option, + } + // This ensures we preserve the state of the original `FormatWith` if `Clone` panics + impl Drop for PutBackOnDrop<'_, '_, I> { + fn drop(&mut self) { + self.into.inner.set(self.inner.take()) + } + } + let pbod = PutBackOnDrop { + inner: self.inner.take(), + into: self, + }; + Self { + inner: Cell::new(pbod.inner.clone()), + sep: self.sep, + } + } +} diff --git a/third_party/rust/itertools/src/free.rs b/third_party/rust/itertools/src/free.rs index 19e3e28694d..4c6820543ca 100644 --- a/third_party/rust/itertools/src/free.rs +++ b/third_party/rust/itertools/src/free.rs @@ -10,30 +10,24 @@ use std::iter::{self, Zip}; type VecIntoIter = alloc::vec::IntoIter; #[cfg(feature = "use_alloc")] -use alloc::{ - string::String, -}; +use alloc::string::String; -use crate::Itertools; use crate::intersperse::{Intersperse, IntersperseWith}; +use crate::Itertools; -pub use crate::adaptors::{ - interleave, - merge, - put_back, -}; +pub use crate::adaptors::{interleave, put_back}; #[cfg(feature = "use_alloc")] -pub use crate::put_back_n_impl::put_back_n; +pub use crate::kmerge_impl::kmerge; +pub use crate::merge_join::{merge, merge_join_by}; #[cfg(feature = "use_alloc")] pub use crate::multipeek_impl::multipeek; #[cfg(feature = "use_alloc")] pub use crate::peek_nth::peek_nth; #[cfg(feature = "use_alloc")] -pub use crate::kmerge_impl::kmerge; -pub use crate::zip_eq_impl::zip_eq; -pub use crate::merge_join::merge_join_by; +pub use crate::put_back_n_impl::put_back_n; #[cfg(feature = "use_alloc")] pub use crate::rciter_impl::rciter; +pub use crate::zip_eq_impl::zip_eq; /// Iterate `iterable` with a particular value inserted between each element. /// @@ -42,11 +36,12 @@ pub use crate::rciter_impl::rciter; /// ``` /// use itertools::intersperse; /// -/// itertools::assert_equal(intersperse((0..3), 8), vec![0, 8, 1, 8, 2]); +/// itertools::assert_equal(intersperse(0..3, 8), vec![0, 8, 1, 8, 2]); /// ``` pub fn intersperse(iterable: I, element: I::Item) -> Intersperse - where I: IntoIterator, - ::Item: Clone +where + I: IntoIterator, + ::Item: Clone, { Itertools::intersperse(iterable.into_iter(), element) } @@ -60,12 +55,13 @@ pub fn intersperse(iterable: I, element: I::Item) -> Intersperse /// use itertools::intersperse_with; /// /// let mut i = 10; -/// itertools::assert_equal(intersperse_with((0..3), || { i -= 1; i }), vec![0, 9, 1, 8, 2]); +/// itertools::assert_equal(intersperse_with(0..3, || { i -= 1; i }), vec![0, 9, 1, 8, 2]); /// assert_eq!(i, 8); /// ``` pub fn intersperse_with(iterable: I, element: F) -> IntersperseWith - where I: IntoIterator, - F: FnMut() -> I::Item +where + I: IntoIterator, + F: FnMut() -> I::Item, { Itertools::intersperse_with(iterable.into_iter(), element) } @@ -79,10 +75,12 @@ pub fn intersperse_with(iterable: I, element: F) -> IntersperseWith(iterable: I) -> iter::Enumerate - where I: IntoIterator +where + I: IntoIterator, { iterable.into_iter().enumerate() } @@ -96,11 +94,13 @@ pub fn enumerate(iterable: I) -> iter::Enumerate /// /// for elt in rev(&[1, 2, 3]) { /// /* loop body */ +/// # let _ = elt; /// } /// ``` pub fn rev(iterable: I) -> iter::Rev - where I: IntoIterator, - I::IntoIter: DoubleEndedIterator +where + I: IntoIterator, + I::IntoIter: DoubleEndedIterator, { iterable.into_iter().rev() } @@ -108,7 +108,7 @@ pub fn rev(iterable: I) -> iter::Rev /// Converts the arguments to iterators and zips them. /// /// [`IntoIterator`] enabled version of [`Iterator::zip`]. -/// +/// /// ## Example /// /// ``` @@ -121,23 +121,26 @@ pub fn rev(iterable: I) -> iter::Rev /// } /// assert_eq!(result, vec![(1, 'a'),(2, 'b'),(3, 'c')]); /// ``` -#[deprecated(note="Use [std::iter::zip](https://doc.rust-lang.org/std/iter/fn.zip.html) instead", since="0.10.4")] +#[deprecated( + note = "Use [std::iter::zip](https://doc.rust-lang.org/std/iter/fn.zip.html) instead", + since = "0.10.4" +)] pub fn zip(i: I, j: J) -> Zip - where I: IntoIterator, - J: IntoIterator +where + I: IntoIterator, + J: IntoIterator, { i.into_iter().zip(j) } - -/// Takes two iterables and creates a new iterator over both in sequence. +/// Takes two iterables and creates a new iterator over both in sequence. /// /// [`IntoIterator`] enabled version of [`Iterator::chain`]. /// /// ## Example /// ``` /// use itertools::chain; -/// +/// /// let mut result:Vec = Vec::new(); /// /// for element in chain(&[1, 2, 3], &[4]) { @@ -145,14 +148,18 @@ pub fn zip(i: I, j: J) -> Zip /// } /// assert_eq!(result, vec![1, 2, 3, 4]); /// ``` -pub fn chain(i: I, j: J) -> iter::Chain<::IntoIter, ::IntoIter> - where I: IntoIterator, - J: IntoIterator +pub fn chain( + i: I, + j: J, +) -> iter::Chain<::IntoIter, ::IntoIter> +where + I: IntoIterator, + J: IntoIterator, { i.into_iter().chain(j) } -/// Create an iterator that clones each element from &T to T +/// Create an iterator that clones each element from `&T` to `T`. /// /// [`IntoIterator`] enabled version of [`Iterator::cloned`]. /// @@ -161,9 +168,10 @@ pub fn chain(i: I, j: J) -> iter::Chain<::IntoIter, (iterable: I) -> iter::Cloned - where I: IntoIterator, - T: Clone, +pub fn cloned<'a, I, T>(iterable: I) -> iter::Cloned +where + I: IntoIterator, + T: Clone + 'a, { iterable.into_iter().cloned() } @@ -178,8 +186,9 @@ pub fn cloned<'a, I, T: 'a>(iterable: I) -> iter::Cloned /// assert_eq!(fold(&[1., 2., 3.], 0., |a, &b| f32::max(a, b)), 3.); /// ``` pub fn fold(iterable: I, init: B, f: F) -> B - where I: IntoIterator, - F: FnMut(B, I::Item) -> B +where + I: IntoIterator, + F: FnMut(B, I::Item) -> B, { iterable.into_iter().fold(init, f) } @@ -194,8 +203,9 @@ pub fn fold(iterable: I, init: B, f: F) -> B /// assert!(all(&[1, 2, 3], |elt| *elt > 0)); /// ``` pub fn all(iterable: I, f: F) -> bool - where I: IntoIterator, - F: FnMut(I::Item) -> bool +where + I: IntoIterator, + F: FnMut(I::Item) -> bool, { iterable.into_iter().all(f) } @@ -210,8 +220,9 @@ pub fn all(iterable: I, f: F) -> bool /// assert!(any(&[0, -1, 2], |elt| *elt > 0)); /// ``` pub fn any(iterable: I, f: F) -> bool - where I: IntoIterator, - F: FnMut(I::Item) -> bool +where + I: IntoIterator, + F: FnMut(I::Item) -> bool, { iterable.into_iter().any(f) } @@ -226,8 +237,9 @@ pub fn any(iterable: I, f: F) -> bool /// assert_eq!(max(0..10), Some(9)); /// ``` pub fn max(iterable: I) -> Option - where I: IntoIterator, - I::Item: Ord +where + I: IntoIterator, + I::Item: Ord, { iterable.into_iter().max() } @@ -242,14 +254,14 @@ pub fn max(iterable: I) -> Option /// assert_eq!(min(0..10), Some(0)); /// ``` pub fn min(iterable: I) -> Option - where I: IntoIterator, - I::Item: Ord +where + I: IntoIterator, + I::Item: Ord, { iterable.into_iter().min() } - -/// Combine all iterator elements into one String, separated by `sep`. +/// Combine all iterator elements into one `String`, separated by `sep`. /// /// [`IntoIterator`] enabled version of [`Itertools::join`]. /// @@ -260,8 +272,9 @@ pub fn min(iterable: I) -> Option /// ``` #[cfg(feature = "use_alloc")] pub fn join(iterable: I, sep: &str) -> String - where I: IntoIterator, - I::Item: Display +where + I: IntoIterator, + I::Item: Display, { iterable.into_iter().join(sep) } @@ -278,9 +291,29 @@ pub fn join(iterable: I, sep: &str) -> String /// ``` #[cfg(feature = "use_alloc")] pub fn sorted(iterable: I) -> VecIntoIter - where I: IntoIterator, - I::Item: Ord +where + I: IntoIterator, + I::Item: Ord, { iterable.into_iter().sorted() } +/// Sort all iterator elements into a new iterator in ascending order. +/// This sort is unstable (i.e., may reorder equal elements). +/// +/// [`IntoIterator`] enabled version of [`Itertools::sorted_unstable`]. +/// +/// ``` +/// use itertools::sorted_unstable; +/// use itertools::assert_equal; +/// +/// assert_equal(sorted_unstable("rust".chars()), "rstu".chars()); +/// ``` +#[cfg(feature = "use_alloc")] +pub fn sorted_unstable(iterable: I) -> VecIntoIter +where + I: IntoIterator, + I::Item: Ord, +{ + iterable.into_iter().sorted_unstable() +} diff --git a/third_party/rust/itertools/src/group_map.rs b/third_party/rust/itertools/src/group_map.rs index a2d0ebb2aba..3dcee83afd0 100644 --- a/third_party/rust/itertools/src/group_map.rs +++ b/third_party/rust/itertools/src/group_map.rs @@ -9,8 +9,9 @@ use std::iter::Iterator; /// See [`.into_group_map()`](crate::Itertools::into_group_map) /// for more information. pub fn into_group_map(iter: I) -> HashMap> - where I: Iterator, - K: Hash + Eq, +where + I: Iterator, + K: Hash + Eq, { let mut lookup = HashMap::new(); @@ -21,12 +22,11 @@ pub fn into_group_map(iter: I) -> HashMap> lookup } -pub fn into_group_map_by(iter: I, f: impl Fn(&V) -> K) -> HashMap> - where - I: Iterator, - K: Hash + Eq, +pub fn into_group_map_by(iter: I, mut f: F) -> HashMap> +where + I: Iterator, + K: Hash + Eq, + F: FnMut(&V) -> K, { - into_group_map( - iter.map(|v| (f(&v), v)) - ) + into_group_map(iter.map(|v| (f(&v), v))) } diff --git a/third_party/rust/itertools/src/groupbylazy.rs b/third_party/rust/itertools/src/groupbylazy.rs index a5a321df453..5847c8f7d1f 100644 --- a/third_party/rust/itertools/src/groupbylazy.rs +++ b/third_party/rust/itertools/src/groupbylazy.rs @@ -1,14 +1,15 @@ -use std::cell::{Cell, RefCell}; use alloc::vec::{self, Vec}; +use std::cell::{Cell, RefCell}; -/// A trait to unify `FnMut` for `GroupBy` with the chunk key in `IntoChunks` +/// A trait to unify `FnMut` for `ChunkBy` with the chunk key in `IntoChunks` trait KeyFunction { type Key; fn call_mut(&mut self, arg: A) -> Self::Key; } -impl KeyFunction for F - where F: FnMut(A) -> K +impl KeyFunction for F +where + F: FnMut(A) -> K + ?Sized, { type Key = K; #[inline] @@ -17,9 +18,8 @@ impl KeyFunction for F } } - /// `ChunkIndex` acts like the grouping key function for `IntoChunks` -#[derive(Debug)] +#[derive(Debug, Clone)] struct ChunkIndex { size: usize, index: usize, @@ -29,7 +29,7 @@ struct ChunkIndex { impl ChunkIndex { #[inline(always)] fn new(size: usize) -> Self { - ChunkIndex { + Self { size, index: 0, key: 0, @@ -50,9 +50,10 @@ impl KeyFunction for ChunkIndex { } } - +#[derive(Clone)] struct GroupInner - where I: Iterator +where + I: Iterator, { key: F, iter: I, @@ -65,19 +66,21 @@ struct GroupInner /// Least index for which we still have elements buffered oldest_buffered_group: usize, /// Group index for `buffer[0]` -- the slots - /// bottom_group..oldest_buffered_group are unused and will be erased when + /// `bottom_group..oldest_buffered_group` are unused and will be erased when /// that range is large enough. bottom_group: usize, /// Buffered groups, from `bottom_group` (index 0) to `top_group`. buffer: Vec>, - /// index of last group iter that was dropped, usize::MAX == none + /// index of last group iter that was dropped, + /// `usize::MAX` initially when no group was dropped dropped_group: usize, } impl GroupInner - where I: Iterator, - F: for<'a> KeyFunction<&'a I::Item, Key=K>, - K: PartialEq, +where + I: Iterator, + F: for<'a> KeyFunction<&'a I::Item, Key = K>, + K: PartialEq, { /// `client`: Index of group that requests next element #[inline(always)] @@ -90,9 +93,8 @@ impl GroupInner */ if client < self.oldest_buffered_group { None - } else if client < self.top_group || - (client == self.top_group && - self.buffer.len() > self.top_group - self.bottom_group) + } else if client < self.top_group + || (client == self.top_group && self.buffer.len() > self.top_group - self.bottom_group) { self.lookup_buffer(client) } else if self.done { @@ -118,8 +120,10 @@ impl GroupInner // `bottom_group..oldest_buffered_group` is unused, and if it's large enough, erase it. self.oldest_buffered_group += 1; // skip forward further empty queues too - while self.buffer.get(self.oldest_buffered_group - self.bottom_group) - .map_or(false, |buf| buf.len() == 0) + while self + .buffer + .get(self.oldest_buffered_group - self.bottom_group) + .map_or(false, |buf| buf.len() == 0) { self.oldest_buffered_group += 1; } @@ -144,12 +148,14 @@ impl GroupInner fn next_element(&mut self) -> Option { debug_assert!(!self.done); match self.iter.next() { - None => { self.done = true; None } + None => { + self.done = true; + None + } otherwise => otherwise, } } - #[inline(never)] fn step_buffering(&mut self, client: usize) -> Option { // requested a later group -- walk through the current group up to @@ -171,11 +177,13 @@ impl GroupInner let key = self.key.call_mut(&elt); match self.current_key.take() { None => {} - Some(old_key) => if old_key != key { - self.current_key = Some(key); - first_elt = Some(elt); - break; - }, + Some(old_key) => { + if old_key != key { + self.current_key = Some(key); + first_elt = Some(elt); + break; + } + } } self.current_key = Some(key); if self.top_group != self.dropped_group { @@ -220,12 +228,14 @@ impl GroupInner let key = self.key.call_mut(&elt); match self.current_key.take() { None => {} - Some(old_key) => if old_key != key { - self.current_key = Some(key); - self.current_elt = Some(elt); - self.top_group += 1; - return None; - }, + Some(old_key) => { + if old_key != key { + self.current_key = Some(key); + self.current_elt = Some(elt); + self.top_group += 1; + return None; + } + } } self.current_key = Some(key); Some(elt) @@ -261,7 +271,8 @@ impl GroupInner } impl GroupInner - where I: Iterator, +where + I: Iterator, { /// Called when a group is dropped fn drop_group(&mut self, client: usize) { @@ -272,10 +283,14 @@ impl GroupInner } } -/// `GroupBy` is the storage for the lazy grouping operation. +#[deprecated(note = "Use `ChunkBy` instead", since = "0.13.0")] +/// See [`ChunkBy`](crate::structs::ChunkBy). +pub type GroupBy = ChunkBy; + +/// `ChunkBy` is the storage for the lazy grouping operation. /// /// If the groups are consumed in their original order, or if each -/// group is dropped without keeping it around, then `GroupBy` uses +/// group is dropped without keeping it around, then `ChunkBy` uses /// no allocations. It needs allocations only if several group iterators /// are alive at the same time. /// @@ -284,10 +299,11 @@ impl GroupInner /// value. It should be stored in a local variable or temporary and /// iterated. /// -/// See [`.group_by()`](crate::Itertools::group_by) for more information. +/// See [`.chunk_by()`](crate::Itertools::chunk_by) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct GroupBy - where I: Iterator, +pub struct ChunkBy +where + I: Iterator, { inner: RefCell>, // the group iterator's current index. Keep this in the main value @@ -296,11 +312,12 @@ pub struct GroupBy } /// Create a new -pub fn new(iter: J, f: F) -> GroupBy - where J: IntoIterator, - F: FnMut(&J::Item) -> K, +pub fn new(iter: J, f: F) -> ChunkBy +where + J: IntoIterator, + F: FnMut(&J::Item) -> K, { - GroupBy { + ChunkBy { inner: RefCell::new(GroupInner { key: f, iter: iter.into_iter(), @@ -317,13 +334,15 @@ pub fn new(iter: J, f: F) -> GroupBy } } -impl GroupBy - where I: Iterator, +impl ChunkBy +where + I: Iterator, { /// `client`: Index of group that requests next element fn step(&self, client: usize) -> Option - where F: FnMut(&I::Item) -> K, - K: PartialEq, + where + F: FnMut(&I::Item) -> K, + K: PartialEq, { self.inner.borrow_mut().step(client) } @@ -334,11 +353,12 @@ impl GroupBy } } -impl<'a, K, I, F> IntoIterator for &'a GroupBy - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq +impl<'a, K, I, F> IntoIterator for &'a ChunkBy +where + I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, { type Item = (K, Group<'a, K, I, F>); type IntoIter = Groups<'a, K, I, F>; @@ -348,26 +368,29 @@ impl<'a, K, I, F> IntoIterator for &'a GroupBy } } - /// An iterator that yields the Group iterators. /// /// Iterator element type is `(K, Group)`: /// the group's key `K` and the group's iterator. /// -/// See [`.group_by()`](crate::Itertools::group_by) for more information. +/// See [`.chunk_by()`](crate::Itertools::chunk_by) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Groups<'a, K: 'a, I: 'a, F: 'a> - where I: Iterator, - I::Item: 'a +pub struct Groups<'a, K, I, F> +where + I: Iterator + 'a, + I::Item: 'a, + K: 'a, + F: 'a, { - parent: &'a GroupBy, + parent: &'a ChunkBy, } impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq +where + I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, { type Item = (K, Group<'a, K, I, F>); @@ -378,11 +401,14 @@ impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> let inner = &mut *self.parent.inner.borrow_mut(); inner.step(index).map(|elt| { let key = inner.group_key(index); - (key, Group { - parent: self.parent, - index, - first: Some(elt), - }) + ( + key, + Group { + parent: self.parent, + index, + first: Some(elt), + }, + ) }) } } @@ -390,18 +416,22 @@ impl<'a, K, I, F> Iterator for Groups<'a, K, I, F> /// An iterator for the elements in a single group. /// /// Iterator element type is `I::Item`. -pub struct Group<'a, K: 'a, I: 'a, F: 'a> - where I: Iterator, - I::Item: 'a, +pub struct Group<'a, K, I, F> +where + I: Iterator + 'a, + I::Item: 'a, + K: 'a, + F: 'a, { - parent: &'a GroupBy, + parent: &'a ChunkBy, index: usize, first: Option, } impl<'a, K, I, F> Drop for Group<'a, K, I, F> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { fn drop(&mut self) { self.parent.drop_group(self.index); @@ -409,10 +439,11 @@ impl<'a, K, I, F> Drop for Group<'a, K, I, F> } impl<'a, K, I, F> Iterator for Group<'a, K, I, F> - where I: Iterator, - I::Item: 'a, - F: FnMut(&I::Item) -> K, - K: PartialEq, +where + I: Iterator, + I::Item: 'a, + F: FnMut(&I::Item) -> K, + K: PartialEq, { type Item = I::Item; #[inline] @@ -428,7 +459,8 @@ impl<'a, K, I, F> Iterator for Group<'a, K, I, F> /// Create a new pub fn new_chunks(iter: J, size: usize) -> IntoChunks - where J: IntoIterator, +where + J: IntoIterator, { IntoChunks { inner: RefCell::new(GroupInner { @@ -447,10 +479,9 @@ pub fn new_chunks(iter: J, size: usize) -> IntoChunks } } - /// `ChunkLazy` is the storage for a lazy chunking operation. /// -/// `IntoChunks` behaves just like `GroupBy`: it is iterable, and +/// `IntoChunks` behaves just like `ChunkBy`: it is iterable, and /// it only buffers if several chunk iterators are alive at the same time. /// /// This type implements [`IntoIterator`] (it is **not** an iterator @@ -463,7 +494,8 @@ pub fn new_chunks(iter: J, size: usize) -> IntoChunks /// See [`.chunks()`](crate::Itertools::chunks) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct IntoChunks - where I: Iterator, +where + I: Iterator, { inner: RefCell>, // the chunk iterator's current index. Keep this in the main value @@ -471,9 +503,17 @@ pub struct IntoChunks index: Cell, } +impl Clone for IntoChunks +where + I: Clone + Iterator, + I::Item: Clone, +{ + clone_fields!(inner, index); +} impl IntoChunks - where I: Iterator, +where + I: Iterator, { /// `client`: Index of chunk that requests next element fn step(&self, client: usize) -> Option { @@ -487,36 +527,37 @@ impl IntoChunks } impl<'a, I> IntoIterator for &'a IntoChunks - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { type Item = Chunk<'a, I>; type IntoIter = Chunks<'a, I>; fn into_iter(self) -> Self::IntoIter { - Chunks { - parent: self, - } + Chunks { parent: self } } } - /// An iterator that yields the Chunk iterators. /// /// Iterator element type is `Chunk`. /// /// See [`.chunks()`](crate::Itertools::chunks) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Chunks<'a, I: 'a> - where I: Iterator, - I::Item: 'a, +#[derive(Clone)] +pub struct Chunks<'a, I> +where + I: Iterator + 'a, + I::Item: 'a, { parent: &'a IntoChunks, } impl<'a, I> Iterator for Chunks<'a, I> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { type Item = Chunk<'a, I>; @@ -525,12 +566,10 @@ impl<'a, I> Iterator for Chunks<'a, I> let index = self.parent.index.get(); self.parent.index.set(index + 1); let inner = &mut *self.parent.inner.borrow_mut(); - inner.step(index).map(|elt| { - Chunk { - parent: self.parent, - index, - first: Some(elt), - } + inner.step(index).map(|elt| Chunk { + parent: self.parent, + index, + first: Some(elt), }) } } @@ -538,9 +577,10 @@ impl<'a, I> Iterator for Chunks<'a, I> /// An iterator for the elements in a single chunk. /// /// Iterator element type is `I::Item`. -pub struct Chunk<'a, I: 'a> - where I: Iterator, - I::Item: 'a, +pub struct Chunk<'a, I> +where + I: Iterator + 'a, + I::Item: 'a, { parent: &'a IntoChunks, index: usize, @@ -548,8 +588,9 @@ pub struct Chunk<'a, I: 'a> } impl<'a, I> Drop for Chunk<'a, I> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { fn drop(&mut self) { self.parent.drop_group(self.index); @@ -557,8 +598,9 @@ impl<'a, I> Drop for Chunk<'a, I> } impl<'a, I> Iterator for Chunk<'a, I> - where I: Iterator, - I::Item: 'a, +where + I: Iterator, + I::Item: 'a, { type Item = I::Item; #[inline] diff --git a/third_party/rust/itertools/src/grouping_map.rs b/third_party/rust/itertools/src/grouping_map.rs index bb5b582c928..86cb55dc007 100644 --- a/third_party/rust/itertools/src/grouping_map.rs +++ b/third_party/rust/itertools/src/grouping_map.rs @@ -1,50 +1,58 @@ -#![cfg(feature = "use_std")] - -use crate::MinMaxResult; -use std::collections::HashMap; +use crate::{ + adaptors::map::{MapSpecialCase, MapSpecialCaseFn}, + MinMaxResult, +}; use std::cmp::Ordering; +use std::collections::HashMap; use std::hash::Hash; use std::iter::Iterator; use std::ops::{Add, Mul}; /// A wrapper to allow for an easy [`into_grouping_map_by`](crate::Itertools::into_grouping_map_by) -#[derive(Clone, Debug)] -pub struct MapForGrouping(I, F); +pub type MapForGrouping = MapSpecialCase>; -impl MapForGrouping { - pub(crate) fn new(iter: I, key_mapper: F) -> Self { - Self(iter, key_mapper) +#[derive(Clone)] +pub struct GroupingMapFn(F); + +impl std::fmt::Debug for GroupingMapFn { + debug_fmt_fields!(GroupingMapFn,); +} + +impl K> MapSpecialCaseFn for GroupingMapFn { + type Out = (K, V); + fn call(&mut self, v: V) -> Self::Out { + ((self.0)(&v), v) } } -impl Iterator for MapForGrouping - where I: Iterator, - K: Hash + Eq, - F: FnMut(&V) -> K, -{ - type Item = (K, V); - fn next(&mut self) -> Option { - self.0.next().map(|val| ((self.1)(&val), val)) +pub(crate) fn new_map_for_grouping K>( + iter: I, + key_mapper: F, +) -> MapForGrouping { + MapSpecialCase { + iter, + f: GroupingMapFn(key_mapper), } } /// Creates a new `GroupingMap` from `iter` pub fn new(iter: I) -> GroupingMap - where I: Iterator, - K: Hash + Eq, +where + I: Iterator, + K: Hash + Eq, { GroupingMap { iter } } /// `GroupingMapBy` is an intermediate struct for efficient group-and-fold operations. -/// +/// /// See [`GroupingMap`] for more informations. pub type GroupingMapBy = GroupingMap>; /// `GroupingMap` is an intermediate struct for efficient group-and-fold operations. /// It groups elements by their key and at the same time fold each group /// using some aggregating operation. -/// +/// /// No method on this struct performs temporary allocations. #[derive(Clone, Debug)] #[must_use = "GroupingMap is lazy and do nothing unless consumed"] @@ -53,13 +61,14 @@ pub struct GroupingMap { } impl GroupingMap - where I: Iterator, - K: Hash + Eq, +where + I: Iterator, + K: Hash + Eq, { /// This is the generic way to perform any operation on a `GroupingMap`. /// It's suggested to use this method only to implement custom operations /// when the already provided ones are not enough. - /// + /// /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements /// of each group sequentially, passing the previously accumulated value, a reference to the key /// and the current element as arguments, and stores the results in an `HashMap`. @@ -68,17 +77,17 @@ impl GroupingMap /// - the current value of the accumulator of the group if there is currently one; /// - a reference to the key of the group this element belongs to; /// - the element from the source being aggregated; - /// + /// /// If `operation` returns `Some(element)` then the accumulator is updated with `element`, /// otherwise the previous accumulation is discarded. /// /// Return a `HashMap` associating the key of each group with the result of aggregation of /// that group's elements. If the aggregation of the last element of a group discards the /// accumulator then there won't be an entry associated to that group's key. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let data = vec![2, 8, 5, 7, 9, 0, 4, 10]; /// let lookup = data.into_iter() /// .into_grouping_map_by(|&n| n % 4) @@ -89,7 +98,7 @@ impl GroupingMap /// Some(acc.unwrap_or(0) + val) /// } /// }); - /// + /// /// assert_eq!(lookup[&0], 4); // 0 resets the accumulator so only 4 is summed /// assert_eq!(lookup[&1], 5 + 9); /// assert_eq!(lookup.get(&2), None); // 10 resets the accumulator and nothing is summed afterward @@ -97,7 +106,8 @@ impl GroupingMap /// assert_eq!(lookup.len(), 3); // The final keys are only 0, 1 and 2 /// ``` pub fn aggregate(self, mut operation: FO) -> HashMap - where FO: FnMut(Option, &K, V) -> Option, + where + FO: FnMut(Option, &K, V) -> Option, { let mut destination_map = HashMap::new(); @@ -111,6 +121,50 @@ impl GroupingMap destination_map } + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements + /// of each group sequentially, passing the previously accumulated value, a reference to the key + /// and the current element as arguments, and stores the results in a new map. + /// + /// `init` is called to obtain the initial value of each accumulator. + /// + /// `operation` is a function that is invoked on each element with the following parameters: + /// - the current value of the accumulator of the group; + /// - a reference to the key of the group this element belongs to; + /// - the element from the source being accumulated. + /// + /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. + /// + /// ``` + /// use itertools::Itertools; + /// + /// #[derive(Debug, Default)] + /// struct Accumulator { + /// acc: usize, + /// } + /// + /// let lookup = (1..=7) + /// .into_grouping_map_by(|&n| n % 3) + /// .fold_with(|_key, _val| Default::default(), |Accumulator { acc }, _key, val| { + /// let acc = acc + val; + /// Accumulator { acc } + /// }); + /// + /// assert_eq!(lookup[&0].acc, 3 + 6); + /// assert_eq!(lookup[&1].acc, 1 + 4 + 7); + /// assert_eq!(lookup[&2].acc, 2 + 5); + /// assert_eq!(lookup.len(), 3); + /// ``` + pub fn fold_with(self, mut init: FI, mut operation: FO) -> HashMap + where + FI: FnMut(&K, &V) -> R, + FO: FnMut(R, &K, V) -> R, + { + self.aggregate(|acc, key, val| { + let acc = acc.unwrap_or_else(|| init(key, &val)); + Some(operation(acc, key, val)) + }) + } + /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements /// of each group sequentially, passing the previously accumulated value, a reference to the key /// and the current element as arguments, and stores the results in a new map. @@ -123,27 +177,25 @@ impl GroupingMap /// - the element from the source being accumulated. /// /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = (1..=7) /// .into_grouping_map_by(|&n| n % 3) /// .fold(0, |acc, _key, val| acc + val); - /// + /// /// assert_eq!(lookup[&0], 3 + 6); /// assert_eq!(lookup[&1], 1 + 4 + 7); /// assert_eq!(lookup[&2], 2 + 5); /// assert_eq!(lookup.len(), 3); /// ``` - pub fn fold(self, init: R, mut operation: FO) -> HashMap - where R: Clone, - FO: FnMut(R, &K, V) -> R, + pub fn fold(self, init: R, operation: FO) -> HashMap + where + R: Clone, + FO: FnMut(R, &K, V) -> R, { - self.aggregate(|acc, key, val| { - let acc = acc.unwrap_or_else(|| init.clone()); - Some(operation(acc, key, val)) - }) + self.fold_with(|_, _| init.clone(), operation) } /// Groups elements from the `GroupingMap` source by key and applies `operation` to the elements @@ -158,23 +210,24 @@ impl GroupingMap /// - the element from the source being accumulated. /// /// Return a `HashMap` associating the key of each group with the result of folding that group's elements. - /// + /// /// [`fold`]: GroupingMap::fold - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = (1..=7) /// .into_grouping_map_by(|&n| n % 3) - /// .fold_first(|acc, _key, val| acc + val); - /// + /// .reduce(|acc, _key, val| acc + val); + /// /// assert_eq!(lookup[&0], 3 + 6); /// assert_eq!(lookup[&1], 1 + 4 + 7); /// assert_eq!(lookup[&2], 2 + 5); /// assert_eq!(lookup.len(), 3); /// ``` - pub fn fold_first(self, mut operation: FO) -> HashMap - where FO: FnMut(V, &K, V) -> V, + pub fn reduce(self, mut operation: FO) -> HashMap + where + FO: FnMut(V, &K, V) -> V, { self.aggregate(|acc, key, val| { Some(match acc { @@ -184,250 +237,271 @@ impl GroupingMap }) } + /// See [`.reduce()`](GroupingMap::reduce). + #[deprecated(note = "Use .reduce() instead", since = "0.13.0")] + pub fn fold_first(self, operation: FO) -> HashMap + where + FO: FnMut(V, &K, V) -> V, + { + self.reduce(operation) + } + /// Groups elements from the `GroupingMap` source by key and collects the elements of each group in - /// an instance of `C`. The iteration order is preserved when inserting elements. - /// + /// an instance of `C`. The iteration order is preserved when inserting elements. + /// /// Return a `HashMap` associating the key of each group with the collection containing that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use std::collections::HashSet; - /// + /// /// let lookup = vec![0, 1, 2, 3, 4, 5, 6, 2, 3, 6].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .collect::>(); - /// + /// /// assert_eq!(lookup[&0], vec![0, 3, 6].into_iter().collect::>()); /// assert_eq!(lookup[&1], vec![1, 4].into_iter().collect::>()); /// assert_eq!(lookup[&2], vec![2, 5].into_iter().collect::>()); /// assert_eq!(lookup.len(), 3); /// ``` pub fn collect(self) -> HashMap - where C: Default + Extend, + where + C: Default + Extend, { let mut destination_map = HashMap::new(); self.iter.for_each(|(key, val)| { - destination_map.entry(key).or_insert_with(C::default).extend(Some(val)); + destination_map + .entry(key) + .or_insert_with(C::default) + .extend(Some(val)); }); destination_map } /// Groups elements from the `GroupingMap` source by key and finds the maximum of each group. - /// + /// /// If several elements are equally maximum, the last element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .max(); - /// + /// /// assert_eq!(lookup[&0], 12); /// assert_eq!(lookup[&1], 7); /// assert_eq!(lookup[&2], 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn max(self) -> HashMap - where V: Ord, + where + V: Ord, { self.max_by(|_, v1, v2| V::cmp(v1, v2)) } /// Groups elements from the `GroupingMap` source by key and finds the maximum of each group /// with respect to the specified comparison function. - /// + /// /// If several elements are equally maximum, the last element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .max_by(|_key, x, y| y.cmp(x)); - /// + /// /// assert_eq!(lookup[&0], 3); /// assert_eq!(lookup[&1], 1); /// assert_eq!(lookup[&2], 5); /// assert_eq!(lookup.len(), 3); /// ``` pub fn max_by(self, mut compare: F) -> HashMap - where F: FnMut(&K, &V, &V) -> Ordering, + where + F: FnMut(&K, &V, &V) -> Ordering, { - self.fold_first(|acc, key, val| match compare(key, &acc, &val) { + self.reduce(|acc, key, val| match compare(key, &acc, &val) { Ordering::Less | Ordering::Equal => val, - Ordering::Greater => acc + Ordering::Greater => acc, }) } /// Groups elements from the `GroupingMap` source by key and finds the element of each group /// that gives the maximum from the specified function. - /// + /// /// If several elements are equally maximum, the last element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .max_by_key(|_key, &val| val % 4); - /// + /// /// assert_eq!(lookup[&0], 3); /// assert_eq!(lookup[&1], 7); /// assert_eq!(lookup[&2], 5); /// assert_eq!(lookup.len(), 3); /// ``` pub fn max_by_key(self, mut f: F) -> HashMap - where F: FnMut(&K, &V) -> CK, - CK: Ord, + where + F: FnMut(&K, &V) -> CK, + CK: Ord, { self.max_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) } /// Groups elements from the `GroupingMap` source by key and finds the minimum of each group. - /// + /// /// If several elements are equally minimum, the first element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .min(); - /// + /// /// assert_eq!(lookup[&0], 3); /// assert_eq!(lookup[&1], 1); /// assert_eq!(lookup[&2], 5); /// assert_eq!(lookup.len(), 3); /// ``` pub fn min(self) -> HashMap - where V: Ord, + where + V: Ord, { self.min_by(|_, v1, v2| V::cmp(v1, v2)) } /// Groups elements from the `GroupingMap` source by key and finds the minimum of each group /// with respect to the specified comparison function. - /// + /// /// If several elements are equally minimum, the first element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .min_by(|_key, x, y| y.cmp(x)); - /// + /// /// assert_eq!(lookup[&0], 12); /// assert_eq!(lookup[&1], 7); /// assert_eq!(lookup[&2], 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn min_by(self, mut compare: F) -> HashMap - where F: FnMut(&K, &V, &V) -> Ordering, + where + F: FnMut(&K, &V, &V) -> Ordering, { - self.fold_first(|acc, key, val| match compare(key, &acc, &val) { + self.reduce(|acc, key, val| match compare(key, &acc, &val) { Ordering::Less | Ordering::Equal => acc, - Ordering::Greater => val + Ordering::Greater => val, }) } /// Groups elements from the `GroupingMap` source by key and finds the element of each group /// that gives the minimum from the specified function. - /// + /// /// If several elements are equally minimum, the first element is picked. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .min_by_key(|_key, &val| val % 4); - /// + /// /// assert_eq!(lookup[&0], 12); /// assert_eq!(lookup[&1], 4); /// assert_eq!(lookup[&2], 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn min_by_key(self, mut f: F) -> HashMap - where F: FnMut(&K, &V) -> CK, - CK: Ord, + where + F: FnMut(&K, &V) -> CK, + CK: Ord, { self.min_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) } /// Groups elements from the `GroupingMap` source by key and find the maximum and minimum of /// each group. - /// + /// /// If several elements are equally maximum, the last element is picked. /// If several elements are equally minimum, the first element is picked. - /// - /// See [.minmax()](crate::Itertools::minmax) for the non-grouping version. - /// + /// + /// See [`Itertools::minmax`](crate::Itertools::minmax) for the non-grouping version. + /// /// Differences from the non grouping version: /// - It never produces a `MinMaxResult::NoElements` /// - It doesn't have any speedup - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use itertools::MinMaxResult::{OneElement, MinMax}; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .minmax(); - /// + /// /// assert_eq!(lookup[&0], MinMax(3, 12)); /// assert_eq!(lookup[&1], MinMax(1, 7)); /// assert_eq!(lookup[&2], OneElement(5)); /// assert_eq!(lookup.len(), 3); /// ``` pub fn minmax(self) -> HashMap> - where V: Ord, + where + V: Ord, { self.minmax_by(|_, v1, v2| V::cmp(v1, v2)) } /// Groups elements from the `GroupingMap` source by key and find the maximum and minimum of /// each group with respect to the specified comparison function. - /// + /// /// If several elements are equally maximum, the last element is picked. /// If several elements are equally minimum, the first element is picked. - /// + /// /// It has the same differences from the non-grouping version as `minmax`. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use itertools::MinMaxResult::{OneElement, MinMax}; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .minmax_by(|_key, x, y| y.cmp(x)); - /// + /// /// assert_eq!(lookup[&0], MinMax(12, 3)); /// assert_eq!(lookup[&1], MinMax(7, 1)); /// assert_eq!(lookup[&2], OneElement(5)); /// assert_eq!(lookup.len(), 3); /// ``` pub fn minmax_by(self, mut compare: F) -> HashMap> - where F: FnMut(&K, &V, &V) -> Ordering, + where + F: FnMut(&K, &V, &V) -> Ordering, { self.aggregate(|acc, key, val| { Some(match acc { @@ -455,81 +529,84 @@ impl GroupingMap /// Groups elements from the `GroupingMap` source by key and find the elements of each group /// that gives the minimum and maximum from the specified function. - /// + /// /// If several elements are equally maximum, the last element is picked. /// If several elements are equally minimum, the first element is picked. - /// + /// /// It has the same differences from the non-grouping version as `minmax`. - /// + /// /// Returns a `HashMap` associating the key of each group with the minimum and maximum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; /// use itertools::MinMaxResult::{OneElement, MinMax}; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .minmax_by_key(|_key, &val| val % 4); - /// + /// /// assert_eq!(lookup[&0], MinMax(12, 3)); /// assert_eq!(lookup[&1], MinMax(4, 7)); /// assert_eq!(lookup[&2], OneElement(5)); /// assert_eq!(lookup.len(), 3); /// ``` pub fn minmax_by_key(self, mut f: F) -> HashMap> - where F: FnMut(&K, &V) -> CK, - CK: Ord, + where + F: FnMut(&K, &V) -> CK, + CK: Ord, { self.minmax_by(|key, v1, v2| f(key, v1).cmp(&f(key, v2))) } - + /// Groups elements from the `GroupingMap` source by key and sums them. - /// - /// This is just a shorthand for `self.fold_first(|acc, _, val| acc + val)`. + /// + /// This is just a shorthand for `self.reduce(|acc, _, val| acc + val)`. /// It is more limited than `Iterator::sum` since it doesn't use the `Sum` trait. - /// + /// /// Returns a `HashMap` associating the key of each group with the sum of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .sum(); - /// + /// /// assert_eq!(lookup[&0], 3 + 9 + 12); /// assert_eq!(lookup[&1], 1 + 4 + 7); /// assert_eq!(lookup[&2], 5 + 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn sum(self) -> HashMap - where V: Add + where + V: Add, { - self.fold_first(|acc, _, val| acc + val) + self.reduce(|acc, _, val| acc + val) } /// Groups elements from the `GroupingMap` source by key and multiply them. - /// - /// This is just a shorthand for `self.fold_first(|acc, _, val| acc * val)`. + /// + /// This is just a shorthand for `self.reduce(|acc, _, val| acc * val)`. /// It is more limited than `Iterator::product` since it doesn't use the `Product` trait. - /// + /// /// Returns a `HashMap` associating the key of each group with the product of that group's elements. - /// + /// /// ``` /// use itertools::Itertools; - /// + /// /// let lookup = vec![1, 3, 4, 5, 7, 8, 9, 12].into_iter() /// .into_grouping_map_by(|&n| n % 3) /// .product(); - /// + /// /// assert_eq!(lookup[&0], 3 * 9 * 12); /// assert_eq!(lookup[&1], 1 * 4 * 7); /// assert_eq!(lookup[&2], 5 * 8); /// assert_eq!(lookup.len(), 3); /// ``` pub fn product(self) -> HashMap - where V: Mul, + where + V: Mul, { - self.fold_first(|acc, _, val| acc * val) + self.reduce(|acc, _, val| acc * val) } } diff --git a/third_party/rust/itertools/src/impl_macros.rs b/third_party/rust/itertools/src/impl_macros.rs index a029843b05f..3db5ba02196 100644 --- a/third_party/rust/itertools/src/impl_macros.rs +++ b/third_party/rust/itertools/src/impl_macros.rs @@ -1,4 +1,4 @@ -//! +//! //! Implementation's internal macros macro_rules! debug_fmt_fields { @@ -27,3 +27,8 @@ macro_rules! clone_fields { macro_rules! ignore_ident{ ($id:ident, $($t:tt)*) => {$($t)*}; } + +macro_rules! count_ident { + () => {0}; + ($i0:ident $($i:ident)*) => {1 + count_ident!($($i)*)}; +} diff --git a/third_party/rust/itertools/src/intersperse.rs b/third_party/rust/itertools/src/intersperse.rs index 10a3a5389c0..5f4f7938ad0 100644 --- a/third_party/rust/itertools/src/intersperse.rs +++ b/third_party/rust/itertools/src/intersperse.rs @@ -1,5 +1,5 @@ -use std::iter::{Fuse, FusedIterator}; use super::size_hint; +use std::iter::{Fuse, FusedIterator}; pub trait IntersperseElement { fn generate(&mut self) -> Item; @@ -26,12 +26,13 @@ pub type Intersperse = IntersperseWith(iter: I, elt: I::Item) -> Intersperse - where I: Iterator, +where + I: Iterator, { intersperse_with(iter, IntersperseElementSimple(elt)) } -implItem> IntersperseElement for F { +impl Item> IntersperseElement for F { fn generate(&mut self) -> Item { self() } @@ -48,71 +49,94 @@ implItem> IntersperseElement for F { #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct IntersperseWith - where I: Iterator, +where + I: Iterator, { element: ElemF, iter: Fuse, - peek: Option, + /// `peek` is None while no item have been taken out of `iter` (at definition). + /// Then `peek` will alternatively be `Some(None)` and `Some(Some(item))`, + /// where `None` indicates it's time to generate from `element` (unless `iter` is empty). + peek: Option>, } /// Create a new `IntersperseWith` iterator pub fn intersperse_with(iter: I, elt: ElemF) -> IntersperseWith - where I: Iterator, +where + I: Iterator, { - let mut iter = iter.fuse(); IntersperseWith { - peek: iter.next(), - iter, + peek: None, + iter: iter.fuse(), element: elt, } } impl Iterator for IntersperseWith - where I: Iterator, - ElemF: IntersperseElement +where + I: Iterator, + ElemF: IntersperseElement, { type Item = I::Item; #[inline] fn next(&mut self) -> Option { - if self.peek.is_some() { - self.peek.take() - } else { - self.peek = self.iter.next(); - if self.peek.is_some() { - Some(self.element.generate()) - } else { - None + let Self { + element, + iter, + peek, + } = self; + match peek { + Some(item @ Some(_)) => item.take(), + Some(None) => match iter.next() { + new @ Some(_) => { + *peek = Some(new); + Some(element.generate()) + } + None => None, + }, + None => { + *peek = Some(None); + iter.next() } } } fn size_hint(&self) -> (usize, Option) { - // 2 * SH + { 1 or 0 } - let has_peek = self.peek.is_some() as usize; - let sh = self.iter.size_hint(); - size_hint::add_scalar(size_hint::add(sh, sh), has_peek) + let mut sh = self.iter.size_hint(); + sh = size_hint::add(sh, sh); + match self.peek { + Some(Some(_)) => size_hint::add_scalar(sh, 1), + Some(None) => sh, + None => size_hint::sub_scalar(sh, 1), + } } - fn fold(mut self, init: B, mut f: F) -> B where - Self: Sized, F: FnMut(B, Self::Item) -> B, + fn fold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, { + let Self { + mut element, + mut iter, + peek, + } = self; let mut accum = init; - if let Some(x) = self.peek.take() { + if let Some(x) = peek.unwrap_or_else(|| iter.next()) { accum = f(accum, x); } - let element = &mut self.element; - - self.iter.fold(accum, - |accum, x| { - let accum = f(accum, element.generate()); - f(accum, x) + iter.fold(accum, |accum, x| { + let accum = f(accum, element.generate()); + f(accum, x) }) } } impl FusedIterator for IntersperseWith - where I: Iterator, - ElemF: IntersperseElement -{} +where + I: Iterator, + ElemF: IntersperseElement, +{ +} diff --git a/third_party/rust/itertools/src/iter_index.rs b/third_party/rust/itertools/src/iter_index.rs new file mode 100644 index 00000000000..aadaa72a766 --- /dev/null +++ b/third_party/rust/itertools/src/iter_index.rs @@ -0,0 +1,116 @@ +use core::iter::{Skip, Take}; +use core::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive}; + +#[cfg(doc)] +use crate::Itertools; + +mod private_iter_index { + use core::ops; + + pub trait Sealed {} + + impl Sealed for ops::Range {} + impl Sealed for ops::RangeInclusive {} + impl Sealed for ops::RangeTo {} + impl Sealed for ops::RangeToInclusive {} + impl Sealed for ops::RangeFrom {} + impl Sealed for ops::RangeFull {} +} + +/// Used by [`Itertools::get`] to know which iterator +/// to turn different ranges into. +pub trait IteratorIndex: private_iter_index::Sealed +where + I: Iterator, +{ + /// The type returned for this type of index. + type Output: Iterator; + + /// Returns an adapted iterator for the current index. + /// + /// Prefer calling [`Itertools::get`] instead + /// of calling this directly. + fn index(self, from: I) -> Self::Output; +} + +impl IteratorIndex for Range +where + I: Iterator, +{ + type Output = Skip>; + + fn index(self, iter: I) -> Self::Output { + iter.take(self.end).skip(self.start) + } +} + +impl IteratorIndex for RangeInclusive +where + I: Iterator, +{ + type Output = Take>; + + fn index(self, iter: I) -> Self::Output { + // end - start + 1 without overflowing if possible + let length = if *self.end() == usize::MAX { + assert_ne!(*self.start(), 0); + self.end() - self.start() + 1 + } else { + (self.end() + 1).saturating_sub(*self.start()) + }; + iter.skip(*self.start()).take(length) + } +} + +impl IteratorIndex for RangeTo +where + I: Iterator, +{ + type Output = Take; + + fn index(self, iter: I) -> Self::Output { + iter.take(self.end) + } +} + +impl IteratorIndex for RangeToInclusive +where + I: Iterator, +{ + type Output = Take; + + fn index(self, iter: I) -> Self::Output { + assert_ne!(self.end, usize::MAX); + iter.take(self.end + 1) + } +} + +impl IteratorIndex for RangeFrom +where + I: Iterator, +{ + type Output = Skip; + + fn index(self, iter: I) -> Self::Output { + iter.skip(self.start) + } +} + +impl IteratorIndex for RangeFull +where + I: Iterator, +{ + type Output = I; + + fn index(self, iter: I) -> Self::Output { + iter + } +} + +pub fn get(iter: I, index: R) -> R::Output +where + I: IntoIterator, + R: IteratorIndex, +{ + index.index(iter.into_iter()) +} diff --git a/third_party/rust/itertools/src/k_smallest.rs b/third_party/rust/itertools/src/k_smallest.rs index acaea5941cb..7e4ace262b7 100644 --- a/third_party/rust/itertools/src/k_smallest.rs +++ b/third_party/rust/itertools/src/k_smallest.rs @@ -1,20 +1,138 @@ -use alloc::collections::BinaryHeap; -use core::cmp::Ord; +use alloc::vec::Vec; +use core::cmp::Ordering; -pub(crate) fn k_smallest>(mut iter: I, k: usize) -> BinaryHeap { - if k == 0 { return BinaryHeap::new(); } +/// Consumes a given iterator, returning the minimum elements in **ascending** order. +pub(crate) fn k_smallest_general(iter: I, k: usize, mut comparator: F) -> Vec +where + I: Iterator, + F: FnMut(&I::Item, &I::Item) -> Ordering, +{ + /// Sift the element currently at `origin` away from the root until it is properly ordered. + /// + /// This will leave **larger** elements closer to the root of the heap. + fn sift_down(heap: &mut [T], is_less_than: &mut F, mut origin: usize) + where + F: FnMut(&T, &T) -> bool, + { + #[inline] + fn children_of(n: usize) -> (usize, usize) { + (2 * n + 1, 2 * n + 2) + } - let mut heap = iter.by_ref().take(k).collect::>(); + while origin < heap.len() { + let (left_idx, right_idx) = children_of(origin); + if left_idx >= heap.len() { + return; + } - iter.for_each(|i| { - debug_assert_eq!(heap.len(), k); - // Equivalent to heap.push(min(i, heap.pop())) but more efficient. - // This should be done with a single `.peek_mut().unwrap()` but - // `PeekMut` sifts-down unconditionally on Rust 1.46.0 and prior. - if *heap.peek().unwrap() > i { - *heap.peek_mut().unwrap() = i; + let replacement_idx = + if right_idx < heap.len() && is_less_than(&heap[left_idx], &heap[right_idx]) { + right_idx + } else { + left_idx + }; + + if is_less_than(&heap[origin], &heap[replacement_idx]) { + heap.swap(origin, replacement_idx); + origin = replacement_idx; + } else { + return; + } + } + } + + if k == 0 { + iter.last(); + return Vec::new(); + } + if k == 1 { + return iter.min_by(comparator).into_iter().collect(); + } + let mut iter = iter.fuse(); + let mut storage: Vec = iter.by_ref().take(k).collect(); + + let mut is_less_than = move |a: &_, b: &_| comparator(a, b) == Ordering::Less; + + // Rearrange the storage into a valid heap by reordering from the second-bottom-most layer up to the root. + // Slightly faster than ordering on each insert, but only by a factor of lg(k). + // The resulting heap has the **largest** item on top. + for i in (0..=(storage.len() / 2)).rev() { + sift_down(&mut storage, &mut is_less_than, i); + } + + iter.for_each(|val| { + debug_assert_eq!(storage.len(), k); + if is_less_than(&val, &storage[0]) { + // Treating this as an push-and-pop saves having to write a sift-up implementation. + // https://en.wikipedia.org/wiki/Binary_heap#Insert_then_extract + storage[0] = val; + // We retain the smallest items we've seen so far, but ordered largest first so we can drop the largest efficiently. + sift_down(&mut storage, &mut is_less_than, 0); } }); - heap + // Ultimately the items need to be in least-first, strict order, but the heap is currently largest-first. + // To achieve this, repeatedly, + // 1) "pop" the largest item off the heap into the tail slot of the underlying storage, + // 2) shrink the logical size of the heap by 1, + // 3) restore the heap property over the remaining items. + let mut heap = &mut storage[..]; + while heap.len() > 1 { + let last_idx = heap.len() - 1; + heap.swap(0, last_idx); + // Sifting over a truncated slice means that the sifting will not disturb already popped elements. + heap = &mut heap[..last_idx]; + sift_down(heap, &mut is_less_than, 0); + } + + storage +} + +pub(crate) fn k_smallest_relaxed_general(iter: I, k: usize, mut comparator: F) -> Vec +where + I: Iterator, + F: FnMut(&I::Item, &I::Item) -> Ordering, +{ + if k == 0 { + iter.last(); + return Vec::new(); + } + + let mut iter = iter.fuse(); + let mut buf = iter.by_ref().take(2 * k).collect::>(); + + if buf.len() < k { + buf.sort_unstable_by(&mut comparator); + return buf; + } + + buf.select_nth_unstable_by(k - 1, &mut comparator); + buf.truncate(k); + + iter.for_each(|val| { + if comparator(&val, &buf[k - 1]) != Ordering::Less { + return; + } + + assert_ne!(buf.len(), buf.capacity()); + buf.push(val); + + if buf.len() == 2 * k { + buf.select_nth_unstable_by(k - 1, &mut comparator); + buf.truncate(k); + } + }); + + buf.sort_unstable_by(&mut comparator); + buf.truncate(k); + buf +} + +#[inline] +pub(crate) fn key_to_cmp(mut key: F) -> impl FnMut(&T, &T) -> Ordering +where + F: FnMut(&T) -> K, + K: Ord, +{ + move |a, b| key(a).cmp(&key(b)) } diff --git a/third_party/rust/itertools/src/kmerge_impl.rs b/third_party/rust/itertools/src/kmerge_impl.rs index 509d5fc6a3e..9ea73f9e8b1 100644 --- a/third_party/rust/itertools/src/kmerge_impl.rs +++ b/third_party/rust/itertools/src/kmerge_impl.rs @@ -1,10 +1,9 @@ use crate::size_hint; -use crate::Itertools; use alloc::vec::Vec; +use std::fmt; use std::iter::FusedIterator; use std::mem::replace; -use std::fmt; /// Head element and Tail iterator pair /// @@ -15,24 +14,21 @@ use std::fmt; /// `KMerge` into a min-heap. #[derive(Debug)] struct HeadTail - where I: Iterator +where + I: Iterator, { head: I::Item, tail: I, } impl HeadTail - where I: Iterator +where + I: Iterator, { /// Constructs a `HeadTail` from an `Iterator`. Returns `None` if the `Iterator` is empty. - fn new(mut it: I) -> Option> { + fn new(mut it: I) -> Option { let head = it.next(); - head.map(|h| { - HeadTail { - head: h, - tail: it, - } - }) + head.map(|h| Self { head: h, tail: it }) } /// Get the next element and update `head`, returning the old head in `Some`. @@ -53,15 +49,17 @@ impl HeadTail } impl Clone for HeadTail - where I: Iterator + Clone, - I::Item: Clone +where + I: Iterator + Clone, + I::Item: Clone, { clone_fields!(head, tail); } /// Make `data` a heap (min-heap w.r.t the sorting). fn heapify(data: &mut [T], mut less_than: S) - where S: FnMut(&T, &T) -> bool +where + S: FnMut(&T, &T) -> bool, { for i in (0..data.len() / 2).rev() { sift_down(data, i, &mut less_than); @@ -70,7 +68,8 @@ fn heapify(data: &mut [T], mut less_than: S) /// Sift down element at `index` (`heap` is a min-heap wrt the ordering) fn sift_down(heap: &mut [T], index: usize, mut less_than: S) - where S: FnMut(&T, &T) -> bool +where + S: FnMut(&T, &T) -> bool, { debug_assert!(index <= heap.len()); let mut pos = index; @@ -81,7 +80,7 @@ fn sift_down(heap: &mut [T], index: usize, mut less_than: S) while child + 1 < heap.len() { // pick the smaller of the two children // use arithmetic to avoid an unpredictable branch - child += less_than(&heap[child+1], &heap[child]) as usize; + child += less_than(&heap[child + 1], &heap[child]) as usize; // sift down is done if we are already in order if !less_than(&heap[child], &heap[pos]) { @@ -119,7 +118,7 @@ impl KMergePredicate for KMergeByLt { } } -implbool> KMergePredicate for F { +impl bool> KMergePredicate for F { fn kmerge_pred(&mut self, a: &T, b: &T) -> bool { self(a, b) } @@ -128,19 +127,21 @@ implbool> KMergePredicate for F { /// Create an iterator that merges elements of the contained iterators using /// the ordering function. /// -/// [`IntoIterator`] enabled version of [`Itertools::kmerge`]. +/// [`IntoIterator`] enabled version of [`Itertools::kmerge`](crate::Itertools::kmerge). /// /// ``` /// use itertools::kmerge; /// /// for elt in kmerge(vec![vec![0, 2, 4], vec![1, 3, 5], vec![6, 7]]) { /// /* loop body */ +/// # let _ = elt; /// } /// ``` pub fn kmerge(iterable: I) -> KMerge<::IntoIter> - where I: IntoIterator, - I::Item: IntoIterator, - <::Item as IntoIterator>::Item: PartialOrd +where + I: IntoIterator, + I::Item: IntoIterator, + <::Item as IntoIterator>::Item: PartialOrd, { kmerge_by(iterable, KMergeByLt) } @@ -152,29 +153,34 @@ pub fn kmerge(iterable: I) -> KMerge<::IntoIter> /// /// See [`.kmerge_by()`](crate::Itertools::kmerge_by) for more /// information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[must_use = "this iterator adaptor is not lazy but does nearly nothing unless consumed"] pub struct KMergeBy - where I: Iterator, +where + I: Iterator, { heap: Vec>, less_than: F, } impl fmt::Debug for KMergeBy - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, { debug_fmt_fields!(KMergeBy, heap); } /// Create an iterator that merges elements of the contained iterators. /// -/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`]. -pub fn kmerge_by(iterable: I, mut less_than: F) - -> KMergeBy<::IntoIter, F> - where I: IntoIterator, - I::Item: IntoIterator, - F: KMergePredicate<<::Item as IntoIterator>::Item>, +/// [`IntoIterator`] enabled version of [`Itertools::kmerge_by`](crate::Itertools::kmerge_by). +pub fn kmerge_by( + iterable: I, + mut less_than: F, +) -> KMergeBy<::IntoIter, F> +where + I: IntoIterator, + I::Item: IntoIterator, + F: KMergePredicate<<::Item as IntoIterator>::Item>, { let iter = iterable.into_iter(); let (lower, _) = iter.size_hint(); @@ -185,16 +191,18 @@ pub fn kmerge_by(iterable: I, mut less_than: F) } impl Clone for KMergeBy - where I: Iterator + Clone, - I::Item: Clone, - F: Clone, +where + I: Iterator + Clone, + I::Item: Clone, + F: Clone, { clone_fields!(heap, less_than); } impl Iterator for KMergeBy - where I: Iterator, - F: KMergePredicate +where + I: Iterator, + F: KMergePredicate, { type Item = I::Item; @@ -208,20 +216,24 @@ impl Iterator for KMergeBy self.heap.swap_remove(0).head }; let less_than = &mut self.less_than; - sift_down(&mut self.heap, 0, |a, b| less_than.kmerge_pred(&a.head, &b.head)); + sift_down(&mut self.heap, 0, |a, b| { + less_than.kmerge_pred(&a.head, &b.head) + }); Some(result) } fn size_hint(&self) -> (usize, Option) { - #[allow(deprecated)] //TODO: once msrv hits 1.51. replace `fold1` with `reduce` - self.heap.iter() - .map(|i| i.size_hint()) - .fold1(size_hint::add) - .unwrap_or((0, Some(0))) + self.heap + .iter() + .map(|i| i.size_hint()) + .reduce(size_hint::add) + .unwrap_or((0, Some(0))) } } impl FusedIterator for KMergeBy - where I: Iterator, - F: KMergePredicate -{} +where + I: Iterator, + F: KMergePredicate, +{ +} diff --git a/third_party/rust/itertools/src/lazy_buffer.rs b/third_party/rust/itertools/src/lazy_buffer.rs index ca24062aab0..fafa5f72613 100644 --- a/third_party/rust/itertools/src/lazy_buffer.rs +++ b/third_party/rust/itertools/src/lazy_buffer.rs @@ -1,10 +1,12 @@ -use std::ops::Index; use alloc::vec::Vec; +use std::iter::Fuse; +use std::ops::Index; + +use crate::size_hint::{self, SizeHint}; #[derive(Debug, Clone)] pub struct LazyBuffer { - pub it: I, - done: bool, + it: Fuse, buffer: Vec, } @@ -12,10 +14,9 @@ impl LazyBuffer where I: Iterator, { - pub fn new(it: I) -> LazyBuffer { - LazyBuffer { - it, - done: false, + pub fn new(it: I) -> Self { + Self { + it: it.fuse(), buffer: Vec::new(), } } @@ -24,36 +25,51 @@ where self.buffer.len() } + pub fn size_hint(&self) -> SizeHint { + size_hint::add_scalar(self.it.size_hint(), self.len()) + } + + pub fn count(self) -> usize { + self.len() + self.it.count() + } + pub fn get_next(&mut self) -> bool { - if self.done { - return false; - } if let Some(x) = self.it.next() { self.buffer.push(x); true } else { - self.done = true; false } } pub fn prefill(&mut self, len: usize) { let buffer_len = self.buffer.len(); - - if !self.done && len > buffer_len { + if len > buffer_len { let delta = len - buffer_len; - self.buffer.extend(self.it.by_ref().take(delta)); - self.done = self.buffer.len() < len; } } } +impl LazyBuffer +where + I: Iterator, + I::Item: Clone, +{ + pub fn get_at(&self, indices: &[usize]) -> Vec { + indices.iter().map(|i| self.buffer[*i].clone()).collect() + } + + pub fn get_array(&self, indices: [usize; K]) -> [I::Item; K] { + indices.map(|i| self.buffer[i].clone()) + } +} + impl Index for LazyBuffer where I: Iterator, I::Item: Sized, - Vec: Index + Vec: Index, { type Output = as Index>::Output; diff --git a/third_party/rust/itertools/src/lib.rs b/third_party/rust/itertools/src/lib.rs index f91968870fa..20226d88a00 100644 --- a/third_party/rust/itertools/src/lib.rs +++ b/third_party/rust/itertools/src/lib.rs @@ -1,6 +1,7 @@ -#![warn(missing_docs)] -#![crate_name="itertools"] +#![warn(missing_docs, clippy::default_numeric_fallback)] +#![crate_name = "itertools"] #![cfg_attr(not(feature = "use_std"), no_std)] +#![doc(test(attr(deny(warnings), allow(deprecated, unstable_name_collisions))))] //! Extra iterator adaptors, functions and macros. //! @@ -8,6 +9,7 @@ //! the [`Itertools`] trait: //! //! ``` +//! # #[allow(unused_imports)] //! use itertools::Itertools; //! ``` //! @@ -29,6 +31,7 @@ //! //! for elt in interleave(&[1, 2, 3], &[2, 3, 4]) { //! /* loop body */ +//! # let _ = elt; //! } //! ``` //! @@ -37,13 +40,16 @@ //! - `use_std` //! - Enabled by default. //! - Disable to compile itertools using `#![no_std]`. This disables -//! any items that depend on collections (like `group_by`, `unique`, +//! any item that depend on allocations (see the `use_alloc` feature) +//! and hash maps (like `unique`, `counts`, `into_grouping_map` and more). +//! - `use_alloc` +//! - Enabled by default. +//! - Enables any item that depend on allocations (like `chunk_by`, //! `kmerge`, `join` and many more). //! //! ## Rust Version //! -//! This version of itertools requires Rust 1.32 or later. -#![doc(html_root_url="https://docs.rs/itertools/0.8/")] +//! This version of itertools requires Rust 1.63.0 or later. #[cfg(not(feature = "use_std"))] extern crate core as std; @@ -52,28 +58,26 @@ extern crate core as std; extern crate alloc; #[cfg(feature = "use_alloc")] -use alloc::{ - string::String, - vec::Vec, -}; +use alloc::{collections::VecDeque, string::String, vec::Vec}; pub use either::Either; use core::borrow::Borrow; +use std::cmp::Ordering; #[cfg(feature = "use_std")] use std::collections::HashMap; -use std::iter::{IntoIterator, once}; -use std::cmp::Ordering; -use std::fmt; #[cfg(feature = "use_std")] use std::collections::HashSet; -#[cfg(feature = "use_std")] -use std::hash::Hash; +use std::fmt; #[cfg(feature = "use_alloc")] use std::fmt::Write; +#[cfg(feature = "use_std")] +use std::hash::Hash; +use std::iter::{once, IntoIterator}; +#[cfg(feature = "use_alloc")] +type VecDequeIntoIter = alloc::collections::vec_deque::IntoIter; #[cfg(feature = "use_alloc")] type VecIntoIter = alloc::vec::IntoIter; -#[cfg(feature = "use_alloc")] use std::iter::FromIterator; #[macro_use] @@ -85,72 +89,56 @@ pub use std::iter as __std_iter; /// The concrete iterator types. pub mod structs { - pub use crate::adaptors::{ - Dedup, - DedupBy, - DedupWithCount, - DedupByWithCount, - Interleave, - InterleaveShortest, - FilterMapOk, - FilterOk, - Product, - PutBack, - Batching, - MapInto, - MapOk, - Merge, - MergeBy, - TakeWhileRef, - WhileSome, - Coalesce, - TupleCombinations, - Positions, - Update, - }; - #[allow(deprecated)] - pub use crate::adaptors::{MapResults, Step}; #[cfg(feature = "use_alloc")] pub use crate::adaptors::MultiProduct; + pub use crate::adaptors::{ + Batching, Coalesce, Dedup, DedupBy, DedupByWithCount, DedupWithCount, FilterMapOk, + FilterOk, Interleave, InterleaveShortest, MapInto, MapOk, Positions, Product, PutBack, + TakeWhileRef, TupleCombinations, Update, WhileSome, + }; #[cfg(feature = "use_alloc")] - pub use crate::combinations::Combinations; + pub use crate::combinations::{ArrayCombinations, Combinations}; #[cfg(feature = "use_alloc")] pub use crate::combinations_with_replacement::CombinationsWithReplacement; pub use crate::cons_tuples_impl::ConsTuples; + #[cfg(feature = "use_std")] + pub use crate::duplicates_impl::{Duplicates, DuplicatesBy}; pub use crate::exactly_one_err::ExactlyOneError; - pub use crate::format::{Format, FormatWith}; pub use crate::flatten_ok::FlattenOk; + pub use crate::format::{Format, FormatWith}; + #[allow(deprecated)] + #[cfg(feature = "use_alloc")] + pub use crate::groupbylazy::GroupBy; + #[cfg(feature = "use_alloc")] + pub use crate::groupbylazy::{Chunk, ChunkBy, Chunks, Group, Groups, IntoChunks}; #[cfg(feature = "use_std")] pub use crate::grouping_map::{GroupingMap, GroupingMapBy}; - #[cfg(feature = "use_alloc")] - pub use crate::groupbylazy::{IntoChunks, Chunk, Chunks, GroupBy, Group, Groups}; pub use crate::intersperse::{Intersperse, IntersperseWith}; #[cfg(feature = "use_alloc")] pub use crate::kmerge_impl::{KMerge, KMergeBy}; - pub use crate::merge_join::MergeJoinBy; + pub use crate::merge_join::{Merge, MergeBy, MergeJoinBy}; #[cfg(feature = "use_alloc")] pub use crate::multipeek_impl::MultiPeek; + pub use crate::pad_tail::PadUsing; #[cfg(feature = "use_alloc")] pub use crate::peek_nth::PeekNth; - pub use crate::pad_tail::PadUsing; pub use crate::peeking_take_while::PeekingTakeWhile; #[cfg(feature = "use_alloc")] pub use crate::permutations::Permutations; - pub use crate::process_results_impl::ProcessResults; #[cfg(feature = "use_alloc")] pub use crate::powerset::Powerset; + pub use crate::process_results_impl::ProcessResults; #[cfg(feature = "use_alloc")] pub use crate::put_back_n_impl::PutBackN; #[cfg(feature = "use_alloc")] pub use crate::rciter_impl::RcIter; pub use crate::repeatn::RepeatN; #[allow(deprecated)] - pub use crate::sources::{RepeatCall, Unfold, Iterate}; + pub use crate::sources::{Iterate, Unfold}; + pub use crate::take_while_inclusive::TakeWhileInclusive; #[cfg(feature = "use_alloc")] pub use crate::tee::Tee; - pub use crate::tuple_impl::{TupleBuffer, TupleWindows, CircularTupleWindows, Tuples}; - #[cfg(feature = "use_std")] - pub use crate::duplicates_impl::{Duplicates, DuplicatesBy}; + pub use crate::tuple_impl::{CircularTupleWindows, TupleBuffer, TupleWindows, Tuples}; #[cfg(feature = "use_std")] pub use crate::unique_impl::{Unique, UniqueBy}; pub use crate::with_position::WithPosition; @@ -161,25 +149,26 @@ pub mod structs { /// Traits helpful for using certain `Itertools` methods in generic contexts. pub mod traits { + pub use crate::iter_index::IteratorIndex; pub use crate::tuple_impl::HomogeneousTuple; } -#[allow(deprecated)] -pub use crate::structs::*; pub use crate::concat_impl::concat; pub use crate::cons_tuples_impl::cons_tuples; pub use crate::diff::diff_with; pub use crate::diff::Diff; #[cfg(feature = "use_alloc")] -pub use crate::kmerge_impl::{kmerge_by}; +pub use crate::kmerge_impl::kmerge_by; pub use crate::minmax::MinMaxResult; pub use crate::peeking_take_while::PeekingNext; pub use crate::process_results_impl::process_results; pub use crate::repeatn::repeat_n; #[allow(deprecated)] -pub use crate::sources::{repeat_call, unfold, iterate}; -pub use crate::with_position::Position; +pub use crate::sources::{iterate, unfold}; +#[allow(deprecated)] +pub use crate::structs::*; pub use crate::unziptuple::{multiunzip, MultiUnzip}; +pub use crate::with_position::Position; pub use crate::ziptuple::multizip; mod adaptors; mod either_or_both; @@ -188,25 +177,28 @@ pub use crate::either_or_both::EitherOrBoth; pub mod free; #[doc(inline)] pub use crate::free::*; -mod concat_impl; -mod cons_tuples_impl; #[cfg(feature = "use_alloc")] mod combinations; #[cfg(feature = "use_alloc")] mod combinations_with_replacement; -mod exactly_one_err; +mod concat_impl; +mod cons_tuples_impl; mod diff; -mod flatten_ok; #[cfg(feature = "use_std")] +mod duplicates_impl; +mod exactly_one_err; +#[cfg(feature = "use_alloc")] mod extrema_set; +mod flatten_ok; mod format; -#[cfg(feature = "use_std")] -mod grouping_map; #[cfg(feature = "use_alloc")] mod group_map; #[cfg(feature = "use_alloc")] mod groupbylazy; +#[cfg(feature = "use_std")] +mod grouping_map; mod intersperse; +mod iter_index; #[cfg(feature = "use_alloc")] mod k_smallest; #[cfg(feature = "use_alloc")] @@ -217,6 +209,7 @@ mod merge_join; mod minmax; #[cfg(feature = "use_alloc")] mod multipeek_impl; +mod next_array; mod pad_tail; #[cfg(feature = "use_alloc")] mod peek_nth; @@ -233,12 +226,11 @@ mod rciter_impl; mod repeatn; mod size_hint; mod sources; +mod take_while_inclusive; #[cfg(feature = "use_alloc")] mod tee; mod tuple_impl; #[cfg(feature = "use_std")] -mod duplicates_impl; -#[cfg(feature = "use_std")] mod unique_impl; mod unziptuple; mod with_position; @@ -260,6 +252,7 @@ mod ziptuple; /// // from (0, 0, 0), (0, 0, 1), .., (0, 1, 0), (0, 1, 1), .. etc until (3, 3, 3) /// for (i, j, k) in iproduct!(0..4, 0..4, 0..4) { /// // .. +/// # let _ = (i, j, k); /// } /// # } /// ``` @@ -270,13 +263,22 @@ macro_rules! iproduct { (@flatten $I:expr, $J:expr, $($K:expr,)*) => ( $crate::iproduct!(@flatten $crate::cons_tuples($crate::iproduct!($I, $J)), $($K,)*) ); - ($I:expr) => ( - $crate::__std_iter::IntoIterator::into_iter($I) + () => ( + $crate::__std_iter::once(()) ); - ($I:expr, $J:expr) => ( - $crate::Itertools::cartesian_product($crate::iproduct!($I), $crate::iproduct!($J)) + ($I:expr $(,)?) => ( + $crate::__std_iter::Iterator::map( + $crate::__std_iter::IntoIterator::into_iter($I), + |elt| (elt,) + ) ); - ($I:expr, $J:expr, $($K:expr),+) => ( + ($I:expr, $J:expr $(,)?) => ( + $crate::Itertools::cartesian_product( + $crate::__std_iter::IntoIterator::into_iter($I), + $crate::__std_iter::IntoIterator::into_iter($J), + ) + ); + ($I:expr, $J:expr, $($K:expr),+ $(,)?) => ( $crate::iproduct!(@flatten $crate::iproduct!($I, $J), $($K,)+) ); } @@ -336,19 +338,24 @@ macro_rules! izip { // binary ($first:expr, $second:expr $(,)*) => { - $crate::izip!($first) - .zip($second) + $crate::__std_iter::Iterator::zip( + $crate::__std_iter::IntoIterator::into_iter($first), + $second, + ) }; // n-ary where n > 2 ( $first:expr $( , $rest:expr )* $(,)* ) => { - $crate::izip!($first) + { + let iter = $crate::__std_iter::IntoIterator::into_iter($first); $( - .zip($rest) + let iter = $crate::__std_iter::Iterator::zip(iter, $rest); )* - .map( + $crate::__std_iter::Iterator::map( + iter, $crate::izip!(@closure a => (a) $( , $rest )*) ) + } }; } @@ -373,16 +380,16 @@ macro_rules! izip { /// /// Invocations of `chain!` with one argument expand to [`arg.into_iter()`](IntoIterator): /// ``` -/// use std::{ops::Range, slice}; +/// use std::ops::Range; /// use itertools::chain; -/// let _: as IntoIterator>::IntoIter = chain!((2..6),); // trailing comma optional! +/// let _: as IntoIterator>::IntoIter = chain!(2..6,); // trailing comma optional! /// let _: <&[_] as IntoIterator>::IntoIter = chain!(&[2, 3, 4]); /// ``` /// /// Invocations of `chain!` with multiple arguments [`.into_iter()`](IntoIterator) each /// argument, and then [`chain`] them together: /// ``` -/// use std::{iter::*, ops::Range, slice}; +/// use std::{iter::*, slice}; /// use itertools::{assert_equal, chain}; /// /// // e.g., this: @@ -399,16 +406,16 @@ macro_rules! izip { /// ``` macro_rules! chain { () => { - core::iter::empty() + $crate::__std_iter::empty() }; ($first:expr $(, $rest:expr )* $(,)?) => { { - let iter = core::iter::IntoIterator::into_iter($first); + let iter = $crate::__std_iter::IntoIterator::into_iter($first); $( let iter = - core::iter::Iterator::chain( + $crate::__std_iter::Iterator::chain( iter, - core::iter::IntoIterator::into_iter($rest)); + $crate::__std_iter::IntoIterator::into_iter($rest)); )* iter } @@ -421,14 +428,14 @@ macro_rules! chain { /// This trait defines a number of methods. They are divided into two groups: /// /// * *Adaptors* take an iterator and parameter as input, and return -/// a new iterator value. These are listed first in the trait. An example -/// of an adaptor is [`.interleave()`](Itertools::interleave) +/// a new iterator value. These are listed first in the trait. An example +/// of an adaptor is [`.interleave()`](Itertools::interleave) /// /// * *Regular methods* are those that don't return iterators and instead -/// return a regular value of some other kind. -/// [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular -/// method in the list. -pub trait Itertools : Iterator { +/// return a regular value of some other kind. +/// [`.next_tuple()`](Itertools::next_tuple) is an example and the first regular +/// method in the list. +pub trait Itertools: Iterator { // adaptors /// Alternate elements from two iterators until both have run out. @@ -444,8 +451,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]); /// ``` fn interleave(self, other: J) -> Interleave - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { interleave(self, other) } @@ -462,8 +470,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![1, -1, 2, -2, 3]); /// ``` fn interleave_shortest(self, other: J) -> InterleaveShortest - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { adaptors::interleave_shortest(self, other.into_iter()) } @@ -481,8 +490,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal((0..3).intersperse(8), vec![0, 8, 1, 8, 2]); /// ``` fn intersperse(self, element: Self::Item) -> Intersperse - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { intersperse::intersperse(self, element) } @@ -502,12 +512,63 @@ pub trait Itertools : Iterator { /// assert_eq!(i, 8); /// ``` fn intersperse_with(self, element: F) -> IntersperseWith - where Self: Sized, - F: FnMut() -> Self::Item + where + Self: Sized, + F: FnMut() -> Self::Item, { intersperse::intersperse_with(self, element) } + /// Returns an iterator over a subsection of the iterator. + /// + /// Works similarly to [`slice::get`](https://doc.rust-lang.org/std/primitive.slice.html#method.get). + /// + /// **Panics** for ranges `..=usize::MAX` and `0..=usize::MAX`. + /// + /// It's a generalisation of [`Iterator::take`] and [`Iterator::skip`], + /// and uses these under the hood. + /// Therefore, the resulting iterator is: + /// - [`ExactSizeIterator`] if the adapted iterator is [`ExactSizeIterator`]. + /// - [`DoubleEndedIterator`] if the adapted iterator is [`DoubleEndedIterator`] and [`ExactSizeIterator`]. + /// + /// # Unspecified Behavior + /// The result of indexing with an exhausted [`core::ops::RangeInclusive`] is unspecified. + /// + /// # Examples + /// + /// ``` + /// use itertools::Itertools; + /// + /// let vec = vec![3, 1, 4, 1, 5]; + /// + /// let mut range: Vec<_> = + /// vec.iter().get(1..=3).copied().collect(); + /// assert_eq!(&range, &[1, 4, 1]); + /// + /// // It works with other types of ranges, too + /// range = vec.iter().get(..2).copied().collect(); + /// assert_eq!(&range, &[3, 1]); + /// + /// range = vec.iter().get(0..1).copied().collect(); + /// assert_eq!(&range, &[3]); + /// + /// range = vec.iter().get(2..).copied().collect(); + /// assert_eq!(&range, &[4, 1, 5]); + /// + /// range = vec.iter().get(..=2).copied().collect(); + /// assert_eq!(&range, &[3, 1, 4]); + /// + /// range = vec.iter().get(..).copied().collect(); + /// assert_eq!(range, vec); + /// ``` + fn get(self, index: R) -> R::Output + where + Self: Sized, + R: traits::IteratorIndex, + { + iter_index::get(self, index) + } + /// Create an iterator which iterates over both this and the specified /// iterator simultaneously, yielding pairs of two optional elements. /// @@ -536,8 +597,9 @@ pub trait Itertools : Iterator { /// ``` #[inline] fn zip_longest(self, other: J) -> ZipLongest - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { zip_longest::zip_longest(self, other.into_iter()) } @@ -549,8 +611,9 @@ pub trait Itertools : Iterator { /// lengths. #[inline] fn zip_eq(self, other: J) -> ZipEq - where J: IntoIterator, - Self: Sized + where + J: IntoIterator, + Self: Sized, { zip_eq(self, other) } @@ -579,8 +642,9 @@ pub trait Itertools : Iterator { /// ``` /// fn batching(self, f: F) -> Batching - where F: FnMut(&mut Self) -> Option, - Self: Sized + where + F: FnMut(&mut Self) -> Option, + Self: Sized, { adaptors::batching(self, f) } @@ -589,10 +653,10 @@ pub trait Itertools : Iterator { /// Consecutive elements that map to the same key (“runs”), are assigned /// to the same group. /// - /// `GroupBy` is the storage for the lazy grouping operation. + /// `ChunkBy` is the storage for the lazy grouping operation. /// /// If the groups are consumed in order, or if each group's iterator is - /// dropped without keeping it around, then `GroupBy` uses no + /// dropped without keeping it around, then `ChunkBy` uses no /// allocations. It needs allocations only if several group iterators /// are alive at the same time. /// @@ -607,34 +671,47 @@ pub trait Itertools : Iterator { /// ``` /// use itertools::Itertools; /// - /// // group data into runs of larger than zero or not. + /// // chunk data into runs of larger than zero or not. /// let data = vec![1, 3, -2, -2, 1, 0, 1, 2]; - /// // groups: |---->|------>|--------->| + /// // chunks: |---->|------>|--------->| /// - /// // Note: The `&` is significant here, `GroupBy` is iterable + /// // Note: The `&` is significant here, `ChunkBy` is iterable /// // only by reference. You can also call `.into_iter()` explicitly. /// let mut data_grouped = Vec::new(); - /// for (key, group) in &data.into_iter().group_by(|elt| *elt >= 0) { - /// data_grouped.push((key, group.collect())); + /// for (key, chunk) in &data.into_iter().chunk_by(|elt| *elt >= 0) { + /// data_grouped.push((key, chunk.collect())); /// } /// assert_eq!(data_grouped, vec![(true, vec![1, 3]), (false, vec![-2, -2]), (true, vec![1, 0, 1, 2])]); /// ``` #[cfg(feature = "use_alloc")] - fn group_by(self, key: F) -> GroupBy - where Self: Sized, - F: FnMut(&Self::Item) -> K, - K: PartialEq, + fn chunk_by(self, key: F) -> ChunkBy + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq, { groupbylazy::new(self, key) } + /// See [`.chunk_by()`](Itertools::chunk_by). + #[deprecated(note = "Use .chunk_by() instead", since = "0.13.0")] + #[cfg(feature = "use_alloc")] + fn group_by(self, key: F) -> ChunkBy + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: PartialEq, + { + self.chunk_by(key) + } + /// Return an *iterable* that can chunk the iterator. /// /// Yield subiterators (chunks) that each yield a fixed number elements, /// determined by `size`. The last chunk will be shorter if there aren't /// enough elements. /// - /// `IntoChunks` is based on `GroupBy`: it is iterable (implements + /// `IntoChunks` is based on `ChunkBy`: it is iterable (implements /// `IntoIterator`, **not** `Iterator`), and it only buffers if several /// chunk iterators are alive at the same time. /// @@ -657,7 +734,8 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn chunks(self, size: usize) -> IntoChunks - where Self: Sized, + where + Self: Sized, { assert!(size != 0); groupbylazy::new_chunks(self, size) @@ -697,9 +775,10 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4)]); /// ``` fn tuple_windows(self) -> TupleWindows - where Self: Sized + Iterator, - T: traits::HomogeneousTuple, - T::Item: Clone + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, + T::Item: Clone, { tuple_impl::tuple_windows(self) } @@ -732,9 +811,10 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(1, 2, 3), (2, 3, 4), (3, 4, 1), (4, 1, 2)]); /// ``` fn circular_tuple_windows(self) -> CircularTupleWindows - where Self: Sized + Clone + Iterator + ExactSizeIterator, - T: tuple_impl::TupleCollect + Clone, - T::Item: Clone + where + Self: Sized + Clone + Iterator + ExactSizeIterator, + T: tuple_impl::TupleCollect + Clone, + T::Item: Clone, { tuple_impl::circular_tuple_windows(self) } @@ -770,8 +850,9 @@ pub trait Itertools : Iterator { /// /// See also [`Tuples::into_buffer`]. fn tuples(self) -> Tuples - where Self: Sized + Iterator, - T: traits::HomogeneousTuple + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, { tuple_impl::tuples(self) } @@ -795,36 +876,13 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn tee(self) -> (Tee, Tee) - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { tee::new(self) } - /// Return an iterator adaptor that steps `n` elements in the base iterator - /// for each iteration. - /// - /// The iterator steps by yielding the next element from the base iterator, - /// then skipping forward `n - 1` elements. - /// - /// Iterator element type is `Self::Item`. - /// - /// **Panics** if the step is 0. - /// - /// ``` - /// use itertools::Itertools; - /// - /// let it = (0..8).step(3); - /// itertools::assert_equal(it, vec![0, 3, 6]); - /// ``` - #[deprecated(note="Use std .step_by() instead", since="0.8.0")] - #[allow(deprecated)] - fn step(self, n: usize) -> Step - where Self: Sized - { - adaptors::step(self, n) - } - /// Convert each item of the iterator using the [`Into`] trait. /// /// ```rust @@ -833,21 +891,13 @@ pub trait Itertools : Iterator { /// (1i32..42i32).map_into::().collect_vec(); /// ``` fn map_into(self) -> MapInto - where Self: Sized, - Self::Item: Into, + where + Self: Sized, + Self::Item: Into, { adaptors::map_into(self) } - /// See [`.map_ok()`](Itertools::map_ok). - #[deprecated(note="Use .map_ok() instead", since="0.10.0")] - fn map_results(self, f: F) -> MapOk - where Self: Iterator> + Sized, - F: FnMut(T) -> U, - { - self.map_ok(f) - } - /// Return an iterator adaptor that applies the provided closure /// to every `Result::Ok` value. `Result::Err` values are /// unchanged. @@ -860,8 +910,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![Ok(42), Err(false), Ok(12)]); /// ``` fn map_ok(self, f: F) -> MapOk - where Self: Iterator> + Sized, - F: FnMut(T) -> U, + where + Self: Iterator> + Sized, + F: FnMut(T) -> U, { adaptors::map_ok(self, f) } @@ -878,8 +929,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![Ok(22), Err(false)]); /// ``` fn filter_ok(self, f: F) -> FilterOk - where Self: Iterator> + Sized, - F: FnMut(&T) -> bool, + where + Self: Iterator> + Sized, + F: FnMut(&T) -> bool, { adaptors::filter_ok(self, f) } @@ -896,15 +948,16 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![Ok(44), Err(false)]); /// ``` fn filter_map_ok(self, f: F) -> FilterMapOk - where Self: Iterator> + Sized, - F: FnMut(T) -> Option, + where + Self: Iterator> + Sized, + F: FnMut(T) -> Option, { adaptors::filter_map_ok(self, f) } /// Return an iterator adaptor that flattens every `Result::Ok` value into /// a series of `Result::Ok` values. `Result::Err` values are unchanged. - /// + /// /// This is useful when you have some common error type for your crate and /// need to propagate it upwards, but the `Result::Ok` case needs to be flattened. /// @@ -914,18 +967,57 @@ pub trait Itertools : Iterator { /// let input = vec![Ok(0..2), Err(false), Ok(2..4)]; /// let it = input.iter().cloned().flatten_ok(); /// itertools::assert_equal(it.clone(), vec![Ok(0), Ok(1), Err(false), Ok(2), Ok(3)]); - /// + /// /// // This can also be used to propagate errors when collecting. /// let output_result: Result, bool> = it.collect(); /// assert_eq!(output_result, Err(false)); /// ``` fn flatten_ok(self) -> FlattenOk - where Self: Iterator> + Sized, - T: IntoIterator + where + Self: Iterator> + Sized, + T: IntoIterator, { flatten_ok::flatten_ok(self) } + /// “Lift” a function of the values of the current iterator so as to process + /// an iterator of `Result` values instead. + /// + /// `processor` is a closure that receives an adapted version of the iterator + /// as the only argument — the adapted iterator produces elements of type `T`, + /// as long as the original iterator produces `Ok` values. + /// + /// If the original iterable produces an error at any point, the adapted + /// iterator ends and it will return the error iself. + /// + /// Otherwise, the return value from the closure is returned wrapped + /// inside `Ok`. + /// + /// # Example + /// + /// ``` + /// use itertools::Itertools; + /// + /// type Item = Result; + /// + /// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; + /// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; + /// + /// // “Lift” the iterator .max() method to work on the Ok-values. + /// let first_max = first_values.into_iter().process_results(|iter| iter.max().unwrap_or(0)); + /// let second_max = second_values.into_iter().process_results(|iter| iter.max().unwrap_or(0)); + /// + /// assert_eq!(first_max, Ok(3)); + /// assert!(second_max.is_err()); + /// ``` + fn process_results(self, processor: F) -> Result + where + Self: Iterator> + Sized, + F: FnOnce(ProcessResults) -> R, + { + process_results(self, processor) + } + /// Return an iterator adaptor that merges the two base iterators in /// ascending order. If both base iterators are sorted (ascending), the /// result is sorted. @@ -935,15 +1027,16 @@ pub trait Itertools : Iterator { /// ``` /// use itertools::Itertools; /// - /// let a = (0..11).step(3); - /// let b = (0..11).step(5); + /// let a = (0..11).step_by(3); + /// let b = (0..11).step_by(5); /// let it = a.merge(b); /// itertools::assert_equal(it, vec![0, 0, 3, 5, 6, 9, 10]); /// ``` fn merge(self, other: J) -> Merge - where Self: Sized, - Self::Item: PartialOrd, - J: IntoIterator + where + Self: Sized, + Self::Item: PartialOrd, + J: IntoIterator, { merge(self, other) } @@ -963,19 +1056,22 @@ pub trait Itertools : Iterator { /// let it = a.merge_by(b, |x, y| x.1 <= y.1); /// itertools::assert_equal(it, vec![(0, 'a'), (0, 'b'), (1, 'c'), (1, 'd')]); /// ``` - fn merge_by(self, other: J, is_first: F) -> MergeBy - where Self: Sized, - J: IntoIterator, - F: FnMut(&Self::Item, &Self::Item) -> bool + where + Self: Sized, + J: IntoIterator, + F: FnMut(&Self::Item, &Self::Item) -> bool, { - adaptors::merge_by_new(self, other.into_iter(), is_first) + merge_join::merge_by_new(self, other, is_first) } /// Create an iterator that merges items from both this and the specified /// iterator in ascending order. /// - /// It chooses whether to pair elements based on the `Ordering` returned by the + /// The function can either return an `Ordering` variant or a boolean. + /// + /// If `cmp_fn` returns `Ordering`, + /// it chooses whether to pair elements based on the `Ordering` returned by the /// specified compare function. At any point, inspecting the tip of the /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type /// `J::Item` respectively, the resulting iterator will: @@ -991,19 +1087,50 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// use itertools::EitherOrBoth::{Left, Right, Both}; /// - /// let multiples_of_2 = (0..10).step(2); - /// let multiples_of_3 = (0..10).step(3); + /// let a = vec![0, 2, 4, 6, 1].into_iter(); + /// let b = (0..10).step_by(3); /// /// itertools::assert_equal( - /// multiples_of_2.merge_join_by(multiples_of_3, |i, j| i.cmp(j)), - /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(8), Right(9)] + /// // This performs a diff in the style of the Unix command comm(1), + /// // generalized to arbitrary types rather than text. + /// a.merge_join_by(b, Ord::cmp), + /// vec![Both(0, 0), Left(2), Right(3), Left(4), Both(6, 6), Left(1), Right(9)] + /// ); + /// ``` + /// + /// If `cmp_fn` returns `bool`, + /// it chooses whether to pair elements based on the boolean returned by the + /// specified function. At any point, inspecting the tip of the + /// iterators `I` and `J` as items `i` of type `I::Item` and `j` of type + /// `J::Item` respectively, the resulting iterator will: + /// + /// - Emit `Either::Left(i)` when `true`, + /// and remove `i` from its source iterator + /// - Emit `Either::Right(j)` when `false`, + /// and remove `j` from its source iterator + /// + /// It is similar to the `Ordering` case if the first argument is considered + /// "less" than the second argument. + /// + /// ``` + /// use itertools::Itertools; + /// use itertools::Either::{Left, Right}; + /// + /// let a = vec![0, 2, 4, 6, 1].into_iter(); + /// let b = (0..10).step_by(3); + /// + /// itertools::assert_equal( + /// a.merge_join_by(b, |i, j| i <= j), + /// vec![Left(0), Right(0), Left(2), Right(3), Left(4), Left(6), Left(1), Right(6), Right(9)] /// ); /// ``` #[inline] - fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy - where J: IntoIterator, - F: FnMut(&Self::Item, &J::Item) -> std::cmp::Ordering, - Self: Sized + #[doc(alias = "comm")] + fn merge_join_by(self, other: J, cmp_fn: F) -> MergeJoinBy + where + J: IntoIterator, + F: FnMut(&Self::Item, &J::Item) -> T, + Self: Sized, { merge_join_by(self, other, cmp_fn) } @@ -1018,17 +1145,18 @@ pub trait Itertools : Iterator { /// ``` /// use itertools::Itertools; /// - /// let a = (0..6).step(3); - /// let b = (1..6).step(3); - /// let c = (2..6).step(3); + /// let a = (0..6).step_by(3); + /// let b = (1..6).step_by(3); + /// let c = (2..6).step_by(3); /// let it = vec![a, b, c].into_iter().kmerge(); /// itertools::assert_equal(it, vec![0, 1, 2, 3, 4, 5]); /// ``` #[cfg(feature = "use_alloc")] fn kmerge(self) -> KMerge<::IntoIter> - where Self: Sized, - Self::Item: IntoIterator, - ::Item: PartialOrd, + where + Self: Sized, + Self::Item: IntoIterator, + ::Item: PartialOrd, { kmerge(self) } @@ -1054,12 +1182,11 @@ pub trait Itertools : Iterator { /// assert_eq!(it.last(), Some(-7.)); /// ``` #[cfg(feature = "use_alloc")] - fn kmerge_by(self, first: F) - -> KMergeBy<::IntoIter, F> - where Self: Sized, - Self::Item: IntoIterator, - F: FnMut(&::Item, - &::Item) -> bool + fn kmerge_by(self, first: F) -> KMergeBy<::IntoIter, F> + where + Self: Sized, + Self::Item: IntoIterator, + F: FnMut(&::Item, &::Item) -> bool, { kmerge_by(self, first) } @@ -1076,10 +1203,11 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(0, 'α'), (0, 'β'), (1, 'α'), (1, 'β')]); /// ``` fn cartesian_product(self, other: J) -> Product - where Self: Sized, - Self::Item: Clone, - J: IntoIterator, - J::IntoIter: Clone + where + Self: Sized, + Self::Item: Clone, + J: IntoIterator, + J::IntoIter: Clone, { adaptors::cartesian_product(self, other.into_iter()) } @@ -1091,10 +1219,11 @@ pub trait Itertools : Iterator { /// the product of iterators yielding multiple types, use the /// [`iproduct`] macro instead. /// - /// /// The iterator element type is `Vec`, where `T` is the iterator element /// of the subiterators. /// + /// Note that the iterator is fused. + /// /// ``` /// use itertools::Itertools; /// let mut multi_prod = (0..3).map(|i| (i * 2)..(i * 2 + 2)) @@ -1109,12 +1238,23 @@ pub trait Itertools : Iterator { /// assert_eq!(multi_prod.next(), Some(vec![1, 3, 5])); /// assert_eq!(multi_prod.next(), None); /// ``` + /// + /// If the adapted iterator is empty, the result is an iterator yielding a single empty vector. + /// This is known as the [nullary cartesian product](https://en.wikipedia.org/wiki/Empty_product#Nullary_Cartesian_product). + /// + /// ``` + /// use itertools::Itertools; + /// let mut nullary_cartesian_product = (0..0).map(|i| (i * 2)..(i * 2 + 2)).multi_cartesian_product(); + /// assert_eq!(nullary_cartesian_product.next(), Some(vec![])); + /// assert_eq!(nullary_cartesian_product.next(), None); + /// ``` #[cfg(feature = "use_alloc")] fn multi_cartesian_product(self) -> MultiProduct<::IntoIter> - where Self: Sized, - Self::Item: IntoIterator, - ::IntoIter: Clone, - ::Item: Clone + where + Self: Sized, + Self::Item: IntoIterator, + ::IntoIter: Clone, + ::Item: Clone, { adaptors::multi_cartesian_product(self) } @@ -1148,9 +1288,9 @@ pub trait Itertools : Iterator { /// vec![-6., 4., -1.]); /// ``` fn coalesce(self, f: F) -> Coalesce - where Self: Sized, - F: FnMut(Self::Item, Self::Item) - -> Result + where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Result, { adaptors::coalesce(self, f) } @@ -1170,8 +1310,9 @@ pub trait Itertools : Iterator { /// vec![1., 2., 3., 2.]); /// ``` fn dedup(self) -> Dedup - where Self: Sized, - Self::Item: PartialEq, + where + Self: Sized, + Self::Item: PartialEq, { adaptors::dedup(self) } @@ -1192,8 +1333,9 @@ pub trait Itertools : Iterator { /// vec![(0, 1.), (0, 2.), (0, 3.), (1, 2.)]); /// ``` fn dedup_by(self, cmp: Cmp) -> DedupBy - where Self: Sized, - Cmp: FnMut(&Self::Item, &Self::Item)->bool, + where + Self: Sized, + Cmp: FnMut(&Self::Item, &Self::Item) -> bool, { adaptors::dedup_by(self, cmp) } @@ -1260,8 +1402,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn duplicates(self) -> Duplicates - where Self: Sized, - Self::Item: Eq + Hash + where + Self: Sized, + Self::Item: Eq + Hash, { duplicates_impl::duplicates(self) } @@ -1285,9 +1428,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn duplicates_by(self, f: F) -> DuplicatesBy - where Self: Sized, - V: Eq + Hash, - F: FnMut(&Self::Item) -> V + where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V, { duplicates_impl::duplicates_by(self, f) } @@ -1312,8 +1456,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn unique(self) -> Unique - where Self: Sized, - Self::Item: Clone + Eq + Hash + where + Self: Sized, + Self::Item: Clone + Eq + Hash, { unique_impl::unique(self) } @@ -1338,9 +1483,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn unique_by(self, f: F) -> UniqueBy - where Self: Sized, - V: Eq + Hash, - F: FnMut(&Self::Item) -> V + where + Self: Sized, + V: Eq + Hash, + F: FnMut(&Self::Item) -> V, { unique_impl::unique_by(self, f) } @@ -1358,8 +1504,9 @@ pub trait Itertools : Iterator { /// See also [`.take_while_ref()`](Itertools::take_while_ref) /// which is a similar adaptor. fn peeking_take_while(&mut self, accept: F) -> PeekingTakeWhile - where Self: Sized + PeekingNext, - F: FnMut(&Self::Item) -> bool, + where + Self: Sized + PeekingNext, + F: FnMut(&Self::Item) -> bool, { peeking_take_while::peeking_take_while(self, accept) } @@ -1383,12 +1530,82 @@ pub trait Itertools : Iterator { /// /// ``` fn take_while_ref(&mut self, accept: F) -> TakeWhileRef - where Self: Clone, - F: FnMut(&Self::Item) -> bool + where + Self: Clone, + F: FnMut(&Self::Item) -> bool, { adaptors::take_while_ref(self, accept) } + /// Returns an iterator adaptor that consumes elements while the given + /// predicate is `true`, *including* the element for which the predicate + /// first returned `false`. + /// + /// The [`.take_while()`][std::iter::Iterator::take_while] adaptor is useful + /// when you want items satisfying a predicate, but to know when to stop + /// taking elements, we have to consume that first element that doesn't + /// satisfy the predicate. This adaptor includes that element where + /// [`.take_while()`][std::iter::Iterator::take_while] would drop it. + /// + /// The [`.take_while_ref()`][crate::Itertools::take_while_ref] adaptor + /// serves a similar purpose, but this adaptor doesn't require [`Clone`]ing + /// the underlying elements. + /// + /// ```rust + /// # use itertools::Itertools; + /// let items = vec![1, 2, 3, 4, 5]; + /// let filtered: Vec<_> = items + /// .into_iter() + /// .take_while_inclusive(|&n| n % 3 != 0) + /// .collect(); + /// + /// assert_eq!(filtered, vec![1, 2, 3]); + /// ``` + /// + /// ```rust + /// # use itertools::Itertools; + /// let items = vec![1, 2, 3, 4, 5]; + /// + /// let take_while_inclusive_result: Vec<_> = items + /// .iter() + /// .copied() + /// .take_while_inclusive(|&n| n % 3 != 0) + /// .collect(); + /// let take_while_result: Vec<_> = items + /// .into_iter() + /// .take_while(|&n| n % 3 != 0) + /// .collect(); + /// + /// assert_eq!(take_while_inclusive_result, vec![1, 2, 3]); + /// assert_eq!(take_while_result, vec![1, 2]); + /// // both iterators have the same items remaining at this point---the 3 + /// // is lost from the `take_while` vec + /// ``` + /// + /// ```rust + /// # use itertools::Itertools; + /// #[derive(Debug, PartialEq)] + /// struct NoCloneImpl(i32); + /// + /// let non_clonable_items: Vec<_> = vec![1, 2, 3, 4, 5] + /// .into_iter() + /// .map(NoCloneImpl) + /// .collect(); + /// let filtered: Vec<_> = non_clonable_items + /// .into_iter() + /// .take_while_inclusive(|n| n.0 % 3 != 0) + /// .collect(); + /// let expected: Vec<_> = vec![1, 2, 3].into_iter().map(NoCloneImpl).collect(); + /// assert_eq!(filtered, expected); + #[doc(alias = "take_until")] + fn take_while_inclusive(self, accept: F) -> TakeWhileInclusive + where + Self: Sized, + F: FnMut(&Self::Item) -> bool, + { + take_while_inclusive::TakeWhileInclusive::new(self, accept) + } + /// Return an iterator adaptor that filters `Option` iterator elements /// and produces `A`. Stops on the first `None` encountered. /// @@ -1404,7 +1621,8 @@ pub trait Itertools : Iterator { /// /// ``` fn while_some(self) -> WhileSome - where Self: Sized + Iterator> + where + Self: Sized + Iterator>, { adaptors::while_some(self) } @@ -1415,6 +1633,11 @@ pub trait Itertools : Iterator { /// Iterator element can be any homogeneous tuple of type `Self::Item` with /// size up to 12. /// + /// # Guarantees + /// + /// If the adapted iterator is deterministic, + /// this iterator adapter yields items in a reliable order. + /// /// ``` /// use itertools::Itertools; /// @@ -1443,19 +1666,72 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]); /// ``` fn tuple_combinations(self) -> TupleCombinations - where Self: Sized + Clone, - Self::Item: Clone, - T: adaptors::HasCombination, + where + Self: Sized + Clone, + Self::Item: Clone, + T: adaptors::HasCombination, { adaptors::tuple_combinations(self) } + /// Return an iterator adaptor that iterates over the combinations of the + /// elements from an iterator. + /// + /// Iterator element type is [Self::Item; K]. The iterator produces a new + /// array per iteration, and clones the iterator elements. + /// + /// # Guarantees + /// + /// If the adapted iterator is deterministic, + /// this iterator adapter yields items in a reliable order. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut v = Vec::new(); + /// for [a, b] in (1..5).array_combinations() { + /// v.push([a, b]); + /// } + /// assert_eq!(v, vec![[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]); + /// + /// let mut it = (1..5).array_combinations(); + /// assert_eq!(Some([1, 2, 3]), it.next()); + /// assert_eq!(Some([1, 2, 4]), it.next()); + /// assert_eq!(Some([1, 3, 4]), it.next()); + /// assert_eq!(Some([2, 3, 4]), it.next()); + /// assert_eq!(None, it.next()); + /// + /// // this requires a type hint + /// let it = (1..5).array_combinations::<3>(); + /// itertools::assert_equal(it, vec![[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]); + /// + /// // you can also specify the complete type + /// use itertools::ArrayCombinations; + /// use std::ops::Range; + /// + /// let it: ArrayCombinations, 3> = (1..5).array_combinations(); + /// itertools::assert_equal(it, vec![[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]); + /// ``` + #[cfg(feature = "use_alloc")] + fn array_combinations(self) -> ArrayCombinations + where + Self: Sized + Clone, + Self::Item: Clone, + { + combinations::array_combinations(self) + } + /// Return an iterator adaptor that iterates over the `k`-length combinations of /// the elements from an iterator. /// - /// Iterator element type is `Vec`. The iterator produces a new Vec per iteration, + /// Iterator element type is `Vec`. The iterator produces a new `Vec` per iteration, /// and clones the iterator elements. /// + /// # Guarantees + /// + /// If the adapted iterator is deterministic, + /// this iterator adapter yields items in a reliable order. + /// /// ``` /// use itertools::Itertools; /// @@ -1481,8 +1757,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn combinations(self, k: usize) -> Combinations - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { combinations::combinations(self, k) } @@ -1490,7 +1767,7 @@ pub trait Itertools : Iterator { /// Return an iterator that iterates over the `k`-length combinations of /// the elements from an iterator, with replacement. /// - /// Iterator element type is `Vec`. The iterator produces a new Vec per iteration, + /// Iterator element type is `Vec`. The iterator produces a new `Vec` per iteration, /// and clones the iterator elements. /// /// ``` @@ -1519,11 +1796,14 @@ pub trait Itertools : Iterator { /// elements from an iterator. /// /// Iterator element type is `Vec` with length `k`. The iterator - /// produces a new Vec per iteration, and clones the iterator elements. + /// produces a new `Vec` per iteration, and clones the iterator elements. /// /// If `k` is greater than the length of the input iterator, the resultant /// iterator adaptor will be empty. /// + /// If you are looking for permutations with replacements, + /// use `repeat_n(iter, k).multi_cartesian_product()` instead. + /// /// ``` /// use itertools::Itertools; /// @@ -1554,8 +1834,9 @@ pub trait Itertools : Iterator { /// re-iterated if the permutations adaptor is completed and re-iterated. #[cfg(feature = "use_alloc")] fn permutations(self, k: usize) -> Permutations - where Self: Sized, - Self::Item: Clone + where + Self: Sized, + Self::Item: Clone, { permutations::permutations(self, k) } @@ -1590,8 +1871,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn powerset(self) -> Powerset - where Self: Sized, - Self::Item: Clone, + where + Self: Sized, + Self::Item: Clone, { powerset::powerset(self) } @@ -1614,33 +1896,35 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(it, vec![18, 16, 14, 12, 10, 4, 3, 2, 1, 0]); /// ``` fn pad_using(self, min: usize, f: F) -> PadUsing - where Self: Sized, - F: FnMut(usize) -> Self::Item + where + Self: Sized, + F: FnMut(usize) -> Self::Item, { pad_tail::pad_using(self, min, f) } - /// Return an iterator adaptor that wraps each element in a `Position` to + /// Return an iterator adaptor that combines each element with a `Position` to /// ease special-case handling of the first or last elements. /// /// Iterator element type is - /// [`Position`](Position) + /// [`(Position, Self::Item)`](Position) /// /// ``` /// use itertools::{Itertools, Position}; /// /// let it = (0..4).with_position(); /// itertools::assert_equal(it, - /// vec![Position::First(0), - /// Position::Middle(1), - /// Position::Middle(2), - /// Position::Last(3)]); + /// vec![(Position::First, 0), + /// (Position::Middle, 1), + /// (Position::Middle, 2), + /// (Position::Last, 3)]); /// /// let it = (0..1).with_position(); - /// itertools::assert_equal(it, vec![Position::Only(0)]); + /// itertools::assert_equal(it, vec![(Position::Only, 0)]); /// ``` fn with_position(self) -> WithPosition - where Self: Sized, + where + Self: Sized, { with_position::with_position(self) } @@ -1648,7 +1932,7 @@ pub trait Itertools : Iterator { /// Return an iterator adaptor that yields the indices of all elements /// satisfying a predicate, counted from the start of the iterator. /// - /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(v)).map(|(i, _)| i)`. + /// Equivalent to `iter.enumerate().filter(|(_, v)| predicate(*v)).map(|(i, _)| i)`. /// /// ``` /// use itertools::Itertools; @@ -1659,8 +1943,9 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(data.iter().positions(|v| v % 2 == 1).rev(), vec![7, 6, 3, 2, 0]); /// ``` fn positions

    (self, predicate: P) -> Positions - where Self: Sized, - P: FnMut(Self::Item) -> bool, + where + Self: Sized, + P: FnMut(Self::Item) -> bool, { adaptors::positions(self, predicate) } @@ -1672,17 +1957,62 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// let input = vec![vec![1], vec![3, 2, 1]]; - /// let it = input.into_iter().update(|mut v| v.push(0)); + /// let it = input.into_iter().update(|v| v.push(0)); /// itertools::assert_equal(it, vec![vec![1, 0], vec![3, 2, 1, 0]]); /// ``` fn update(self, updater: F) -> Update - where Self: Sized, - F: FnMut(&mut Self::Item), + where + Self: Sized, + F: FnMut(&mut Self::Item), { adaptors::update(self, updater) } // non-adaptor methods + /// Advances the iterator and returns the next items grouped in an array of + /// a specific size. + /// + /// If there are enough elements to be grouped in an array, then the array + /// is returned inside `Some`, otherwise `None` is returned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let mut iter = 1..5; + /// + /// assert_eq!(Some([1, 2]), iter.next_array()); + /// ``` + fn next_array(&mut self) -> Option<[Self::Item; N]> + where + Self: Sized, + { + next_array::next_array(self) + } + + /// Collects all items from the iterator into an array of a specific size. + /// + /// If the number of elements inside the iterator is **exactly** equal to + /// the array size, then the array is returned inside `Some`, otherwise + /// `None` is returned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let iter = 1..3; + /// + /// if let Some([x, y]) = iter.collect_array() { + /// assert_eq!([x, y], [1, 2]) + /// } else { + /// panic!("Expected two elements") + /// } + /// ``` + fn collect_array(mut self) -> Option<[Self::Item; N]> + where + Self: Sized, + { + self.next_array().filter(|_| self.next().is_none()) + } + /// Advances the iterator and returns the next items grouped in a tuple of /// a specific size (up to 12). /// @@ -1697,8 +2027,9 @@ pub trait Itertools : Iterator { /// assert_eq!(Some((1, 2)), iter.next_tuple()); /// ``` fn next_tuple(&mut self) -> Option - where Self: Sized + Iterator, - T: traits::HomogeneousTuple + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, { T::collect_from_iter_no_buf(self) } @@ -1722,19 +2053,19 @@ pub trait Itertools : Iterator { /// } /// ``` fn collect_tuple(mut self) -> Option - where Self: Sized + Iterator, - T: traits::HomogeneousTuple + where + Self: Sized + Iterator, + T: traits::HomogeneousTuple, { match self.next_tuple() { elt @ Some(_) => match self.next() { Some(_) => None, None => elt, }, - _ => None + _ => None, } } - /// Find the position and value of the first element satisfying a predicate. /// /// The iterator is not advanced past the first element found. @@ -1746,14 +2077,10 @@ pub trait Itertools : Iterator { /// assert_eq!(text.chars().find_position(|ch| ch.is_lowercase()), Some((1, 'α'))); /// ``` fn find_position

    (&mut self, mut pred: P) -> Option<(usize, Self::Item)> - where P: FnMut(&Self::Item) -> bool + where + P: FnMut(&Self::Item) -> bool, { - for (index, elt) in self.enumerate() { - if pred(&elt) { - return Some((index, elt)); - } - } - None + self.enumerate().find(|(_, elt)| pred(elt)) } /// Find the value of the first element satisfying a predicate or return the last element, if any. /// @@ -1766,14 +2093,31 @@ pub trait Itertools : Iterator { /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 5), Some(&4)); /// assert_eq!(numbers.iter().find_or_last(|&&x| x > 2), Some(&3)); /// assert_eq!(std::iter::empty::().find_or_last(|&x| x > 5), None); + /// + /// // An iterator of Results can return the first Ok or the last Err: + /// let input = vec![Err(()), Ok(11), Err(()), Ok(22)]; + /// assert_eq!(input.into_iter().find_or_last(Result::is_ok), Some(Ok(11))); + /// + /// let input: Vec> = vec![Err(11), Err(22)]; + /// assert_eq!(input.into_iter().find_or_last(Result::is_ok), Some(Err(22))); + /// + /// assert_eq!(std::iter::empty::>().find_or_last(Result::is_ok), None); /// ``` fn find_or_last

    (mut self, mut predicate: P) -> Option - where Self: Sized, - P: FnMut(&Self::Item) -> bool, + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { let mut prev = None; - self.find_map(|x| if predicate(&x) { Some(x) } else { prev = Some(x); None }) - .or(prev) + self.find_map(|x| { + if predicate(&x) { + Some(x) + } else { + prev = Some(x); + None + } + }) + .or(prev) } /// Find the value of the first element satisfying a predicate or return the first element, if any. /// @@ -1786,10 +2130,20 @@ pub trait Itertools : Iterator { /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 5), Some(&1)); /// assert_eq!(numbers.iter().find_or_first(|&&x| x > 2), Some(&3)); /// assert_eq!(std::iter::empty::().find_or_first(|&x| x > 5), None); + /// + /// // An iterator of Results can return the first Ok or the first Err: + /// let input = vec![Err(()), Ok(11), Err(()), Ok(22)]; + /// assert_eq!(input.into_iter().find_or_first(Result::is_ok), Some(Ok(11))); + /// + /// let input: Vec> = vec![Err(11), Err(22)]; + /// assert_eq!(input.into_iter().find_or_first(Result::is_ok), Some(Err(11))); + /// + /// assert_eq!(std::iter::empty::>().find_or_first(Result::is_ok), None); /// ``` fn find_or_first

    (mut self, mut predicate: P) -> Option - where Self: Sized, - P: FnMut(&Self::Item) -> bool, + where + Self: Sized, + P: FnMut(&Self::Item) -> bool, { let first = self.next()?; Some(if predicate(&first) { @@ -1810,14 +2164,14 @@ pub trait Itertools : Iterator { /// /// #[derive(PartialEq, Debug)] /// enum Enum { A, B, C, D, E, } - /// + /// /// let mut iter = vec![Enum::A, Enum::B, Enum::C, Enum::D].into_iter(); - /// + /// /// // search `iter` for `B` /// assert_eq!(iter.contains(&Enum::B), true); /// // `B` was found, so the iterator now rests at the item after `B` (i.e, `C`). /// assert_eq!(iter.next(), Some(Enum::C)); - /// + /// /// // search `iter` for `E` /// assert_eq!(iter.contains(&Enum::E), false); /// // `E` wasn't found, so `iter` is now exhausted @@ -1827,7 +2181,7 @@ pub trait Itertools : Iterator { where Self: Sized, Self::Item: Borrow, - Q: PartialEq, + Q: PartialEq + ?Sized, { self.any(|x| x.borrow() == query) } @@ -1849,8 +2203,9 @@ pub trait Itertools : Iterator { /// assert!(data.into_iter().all_equal()); /// ``` fn all_equal(&mut self) -> bool - where Self: Sized, - Self::Item: PartialEq, + where + Self: Sized, + Self::Item: PartialEq, { match self.next() { None => true, @@ -1858,6 +2213,38 @@ pub trait Itertools : Iterator { } } + /// If there are elements and they are all equal, return a single copy of that element. + /// If there are no elements, return an Error containing None. + /// If there are elements and they are not all equal, return a tuple containing the first + /// two non-equal elements found. + /// + /// ``` + /// use itertools::Itertools; + /// + /// let data = vec![1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5]; + /// assert_eq!(data.iter().all_equal_value(), Err(Some((&1, &2)))); + /// assert_eq!(data[0..3].iter().all_equal_value(), Ok(&1)); + /// assert_eq!(data[3..5].iter().all_equal_value(), Ok(&2)); + /// assert_eq!(data[5..8].iter().all_equal_value(), Ok(&3)); + /// + /// let data : Option = None; + /// assert_eq!(data.into_iter().all_equal_value(), Err(None)); + /// ``` + #[allow(clippy::type_complexity)] + fn all_equal_value(&mut self) -> Result> + where + Self: Sized, + Self::Item: PartialEq, + { + let first = self.next().ok_or(None)?; + let other = self.find(|x| x != &first); + if let Some(other) = other { + Err(Some((first, other))) + } else { + Ok(first) + } + } + /// Check whether all elements are unique (non equal). /// /// Empty iterators are considered to have unique elements: @@ -1875,8 +2262,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn all_unique(&mut self) -> bool - where Self: Sized, - Self::Item: Eq + Hash + where + Self: Sized, + Self::Item: Eq + Hash, { let mut used = HashSet::new(); self.all(move |elt| used.insert(elt)) @@ -1885,20 +2273,21 @@ pub trait Itertools : Iterator { /// Consume the first `n` elements from the iterator eagerly, /// and return the same iterator again. /// - /// It works similarly to *.skip(* `n` *)* except it is eager and + /// It works similarly to `.skip(n)` except it is eager and /// preserves the iterator type. /// /// ``` /// use itertools::Itertools; /// - /// let mut iter = "αβγ".chars().dropping(2); + /// let iter = "αβγ".chars().dropping(2); /// itertools::assert_equal(iter, "γ".chars()); /// ``` /// /// *Fusing notes: if the iterator is exhausted by dropping, /// the result of calling `.next()` again depends on the iterator implementation.* fn dropping(mut self, n: usize) -> Self - where Self: Sized + where + Self: Sized, { if n > 0 { self.nth(n - 1); @@ -1922,8 +2311,8 @@ pub trait Itertools : Iterator { /// itertools::assert_equal(init, vec![0, 3, 6]); /// ``` fn dropping_back(mut self, n: usize) -> Self - where Self: Sized, - Self: DoubleEndedIterator + where + Self: Sized + DoubleEndedIterator, { if n > 0 { (&mut self).rev().nth(n - 1); @@ -1931,31 +2320,6 @@ pub trait Itertools : Iterator { self } - /// Run the closure `f` eagerly on each element of the iterator. - /// - /// Consumes the iterator until its end. - /// - /// ``` - /// use std::sync::mpsc::channel; - /// use itertools::Itertools; - /// - /// let (tx, rx) = channel(); - /// - /// // use .foreach() to apply a function to each value -- sending it - /// (0..5).map(|x| x * 2 + 1).foreach(|x| { tx.send(x).unwrap(); } ); - /// - /// drop(tx); - /// - /// itertools::assert_equal(rx.iter(), vec![1, 3, 5, 7, 9]); - /// ``` - #[deprecated(note="Use .for_each() instead", since="0.8.0")] - fn foreach(self, f: F) - where F: FnMut(Self::Item), - Self: Sized, - { - self.for_each(f); - } - /// Combine all an iterator's elements into one element by using [`Extend`]. /// /// This combinator will extend the first item with each of the rest of the @@ -1970,8 +2334,10 @@ pub trait Itertools : Iterator { /// vec![1, 2, 3, 4, 5, 6]); /// ``` fn concat(self) -> Self::Item - where Self: Sized, - Self::Item: Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default + where + Self: Sized, + Self::Item: + Extend<<::Item as IntoIterator>::Item> + IntoIterator + Default, { concat(self) } @@ -1980,7 +2346,8 @@ pub trait Itertools : Iterator { /// for convenience. #[cfg(feature = "use_alloc")] fn collect_vec(self) -> Vec - where Self: Sized + where + Self: Sized, { self.collect() } @@ -1996,16 +2363,18 @@ pub trait Itertools : Iterator { /// /// fn process_dir_entries(entries: &[fs::DirEntry]) { /// // ... + /// # let _ = entries; /// } /// - /// fn do_stuff() -> std::io::Result<()> { + /// fn do_stuff() -> io::Result<()> { /// let entries: Vec<_> = fs::read_dir(".")?.try_collect()?; /// process_dir_entries(&entries); /// /// Ok(()) /// } + /// + /// # let _ = do_stuff; /// ``` - #[cfg(feature = "use_alloc")] fn try_collect(self) -> Result where Self: Sized + Iterator>, @@ -2031,21 +2400,17 @@ pub trait Itertools : Iterator { /// ``` #[inline] fn set_from<'a, A: 'a, J>(&mut self, from: J) -> usize - where Self: Iterator, - J: IntoIterator + where + Self: Iterator, + J: IntoIterator, { - let mut count = 0; - for elt in from { - match self.next() { - None => break, - Some(ptr) => *ptr = elt, - } - count += 1; - } - count + from.into_iter() + .zip(self) + .map(|(new, old)| *old = new) + .count() } - /// Combine all iterator elements into one String, separated by `sep`. + /// Combine all iterator elements into one `String`, separated by `sep`. /// /// Use the `Display` implementation of each element. /// @@ -2057,7 +2422,8 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn join(&mut self, sep: &str) -> String - where Self::Item: std::fmt::Display + where + Self::Item: std::fmt::Display, { match self.next() { None => String::new(), @@ -2091,7 +2457,8 @@ pub trait Itertools : Iterator { /// "1.10, 2.72, -3.00"); /// ``` fn format(self, sep: &str) -> Format - where Self: Sized, + where + Self: Sized, { format::new_format_default(self, sep) } @@ -2129,21 +2496,13 @@ pub trait Itertools : Iterator { /// /// ``` fn format_with(self, sep: &str, format: F) -> FormatWith - where Self: Sized, - F: FnMut(Self::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, + where + Self: Sized, + F: FnMut(Self::Item, &mut dyn FnMut(&dyn fmt::Display) -> fmt::Result) -> fmt::Result, { format::new_format(self, sep, format) } - /// See [`.fold_ok()`](Itertools::fold_ok). - #[deprecated(note="Use .fold_ok() instead", since="0.10.0")] - fn fold_results(&mut self, start: B, f: F) -> Result - where Self: Iterator>, - F: FnMut(B, A) -> B - { - self.fold_ok(start, f) - } - /// Fold `Result` values from an iterator. /// /// Only `Ok` values are folded. If no error is encountered, the folded @@ -2158,11 +2517,14 @@ pub trait Itertools : Iterator { /// For example the sequence *Ok(1), Ok(2), Ok(3)* will result in a /// computation like this: /// - /// ```ignore + /// ```no_run + /// # let start = 0; + /// # let f = |x, y| x + y; /// let mut accum = start; /// accum = f(accum, 1); /// accum = f(accum, 2); /// accum = f(accum, 3); + /// # let _ = accum; /// ``` /// /// With a `start` value of 0 and an addition as folding function, @@ -2187,8 +2549,9 @@ pub trait Itertools : Iterator { /// ); /// ``` fn fold_ok(&mut self, mut start: B, mut f: F) -> Result - where Self: Iterator>, - F: FnMut(B, A) -> B + where + Self: Iterator>, + F: FnMut(B, A) -> B, { for elt in self { match elt { @@ -2219,8 +2582,9 @@ pub trait Itertools : Iterator { /// assert_eq!(more_values.next().unwrap(), Some(0)); /// ``` fn fold_options(&mut self, mut start: B, mut f: F) -> Option - where Self: Iterator>, - F: FnMut(B, A) -> B + where + Self: Iterator>, + F: FnMut(B, A) -> B, { for elt in self { match elt { @@ -2243,10 +2607,14 @@ pub trait Itertools : Iterator { /// assert_eq!((0..10).fold1(|x, y| x + y).unwrap_or(0), 45); /// assert_eq!((0..0).fold1(|x, y| x * y), None); /// ``` - #[deprecated(since = "0.10.2", note = "Use `Iterator::reduce` instead")] + #[deprecated( + note = "Use [`Iterator::reduce`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.reduce) instead", + since = "0.10.2" + )] fn fold1(mut self, f: F) -> Option - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, { self.next().map(move |x| self.fold(x, f)) } @@ -2279,65 +2647,110 @@ pub trait Itertools : Iterator { /// └─f─f─f─f─f─f /// ``` /// - /// If `f` is associative, prefer the normal [`Iterator::reduce`] instead. + /// If `f` is associative you should also decide carefully: + /// + /// For an iterator producing `n` elements, both [`Iterator::reduce`] and `tree_reduce` will + /// call `f` `n - 1` times. However, `tree_reduce` will call `f` on earlier intermediate + /// results, which is beneficial for `f` that allocate and produce longer results for longer + /// arguments. For example if `f` combines arguments using `format!`, then `tree_reduce` will + /// operate on average on shorter arguments resulting in less bytes being allocated overall. + /// + /// Moreover, the output of `tree_reduce` is preferable to that of [`Iterator::reduce`] in + /// certain cases. For example, building a binary search tree using `tree_reduce` will result in + /// a balanced tree with height `O(ln(n))`, while [`Iterator::reduce`] will output a tree with + /// height `O(n)`, essentially a linked list. + /// + /// If `f` does not benefit from such a reordering, like `u32::wrapping_add`, prefer the + /// normal [`Iterator::reduce`] instead since it will most likely result in the generation of + /// simpler code because the compiler is able to optimize it. /// /// ``` /// use itertools::Itertools; /// + /// let f = |a: String, b: String| { + /// format!("f({a}, {b})") + /// }; + /// /// // The same tree as above - /// let num_strings = (1..8).map(|x| x.to_string()); - /// assert_eq!(num_strings.tree_fold1(|x, y| format!("f({}, {})", x, y)), - /// Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))"))); + /// assert_eq!((1..8).map(|x| x.to_string()).tree_reduce(f), + /// Some(String::from("f(f(f(1, 2), f(3, 4)), f(f(5, 6), 7))"))); /// - /// // Like fold1, an empty iterator produces None - /// assert_eq!((0..0).tree_fold1(|x, y| x * y), None); + /// // Like reduce, an empty iterator produces None + /// assert_eq!((0..0).tree_reduce(|x, y| x * y), None); + /// + /// // tree_reduce matches reduce for associative operations... + /// assert_eq!((0..10).tree_reduce(|x, y| x + y), + /// (0..10).reduce(|x, y| x + y)); /// - /// // tree_fold1 matches fold1 for associative operations... - /// assert_eq!((0..10).tree_fold1(|x, y| x + y), - /// (0..10).fold1(|x, y| x + y)); /// // ...but not for non-associative ones - /// assert_ne!((0..10).tree_fold1(|x, y| x - y), - /// (0..10).fold1(|x, y| x - y)); + /// assert_ne!((0..10).tree_reduce(|x, y| x - y), + /// (0..10).reduce(|x, y| x - y)); + /// + /// let mut total_len_reduce = 0; + /// let reduce_res = (1..100).map(|x| x.to_string()) + /// .reduce(|a, b| { + /// let r = f(a, b); + /// total_len_reduce += r.len(); + /// r + /// }) + /// .unwrap(); + /// + /// let mut total_len_tree_reduce = 0; + /// let tree_reduce_res = (1..100).map(|x| x.to_string()) + /// .tree_reduce(|a, b| { + /// let r = f(a, b); + /// total_len_tree_reduce += r.len(); + /// r + /// }) + /// .unwrap(); + /// + /// assert_eq!(total_len_reduce, 33299); + /// assert_eq!(total_len_tree_reduce, 4228); + /// assert_eq!(reduce_res.len(), tree_reduce_res.len()); /// ``` - fn tree_fold1(mut self, mut f: F) -> Option - where F: FnMut(Self::Item, Self::Item) -> Self::Item, - Self: Sized, + fn tree_reduce(mut self, mut f: F) -> Option + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, { type State = Result>; fn inner0(it: &mut II, f: &mut FF) -> State - where - II: Iterator, - FF: FnMut(T, T) -> T + where + II: Iterator, + FF: FnMut(T, T) -> T, { // This function could be replaced with `it.next().ok_or(None)`, - // but half the useful tree_fold1 work is combining adjacent items, + // but half the useful tree_reduce work is combining adjacent items, // so put that in a form that LLVM is more likely to optimize well. - let a = - if let Some(v) = it.next() { v } - else { return Err(None) }; - let b = - if let Some(v) = it.next() { v } - else { return Err(Some(a)) }; + let a = if let Some(v) = it.next() { + v + } else { + return Err(None); + }; + let b = if let Some(v) = it.next() { + v + } else { + return Err(Some(a)); + }; Ok(f(a, b)) } fn inner(stop: usize, it: &mut II, f: &mut FF) -> State - where - II: Iterator, - FF: FnMut(T, T) -> T + where + II: Iterator, + FF: FnMut(T, T) -> T, { let mut x = inner0(it, f)?; for height in 0..stop { // Try to get another tree the same size with which to combine it, // creating a new tree that's twice as big for next time around. - let next = - if height == 0 { - inner0(it, f) - } else { - inner(height, it, f) - }; + let next = if height == 0 { + inner0(it, f) + } else { + inner(height, it, f) + }; match next { Ok(y) => x = f(x, y), @@ -2352,12 +2765,22 @@ pub trait Itertools : Iterator { Ok(x) } - match inner(usize::max_value(), &mut self, &mut f) { + match inner(usize::MAX, &mut self, &mut f) { Err(x) => x, _ => unreachable!(), } } + /// See [`.tree_reduce()`](Itertools::tree_reduce). + #[deprecated(note = "Use .tree_reduce() instead", since = "0.13.0")] + fn tree_fold1(self, f: F) -> Option + where + F: FnMut(Self::Item, Self::Item) -> Self::Item, + Self: Sized, + { + self.tree_reduce(f) + } + /// An iterator method that applies a function, producing a single, final value. /// /// `fold_while()` is basically equivalent to [`Iterator::fold`] but with additional support for @@ -2398,19 +2821,19 @@ pub trait Itertools : Iterator { /// `fold()` called the provided closure for every item of the callee iterator, /// `fold_while()` actually stopped iterating as soon as it encountered `Fold::Done(_)`. fn fold_while(&mut self, init: B, mut f: F) -> FoldWhile - where Self: Sized, - F: FnMut(B, Self::Item) -> FoldWhile + where + Self: Sized, + F: FnMut(B, Self::Item) -> FoldWhile, { - use Result::{ - Ok as Continue, - Err as Break, - }; + use Result::{Err as Break, Ok as Continue}; - let result = self.try_fold(init, #[inline(always)] |acc, v| - match f(acc, v) { - FoldWhile::Continue(acc) => Continue(acc), - FoldWhile::Done(acc) => Break(acc), - } + let result = self.try_fold( + init, + #[inline(always)] + |acc, v| match f(acc, v) { + FoldWhile::Continue(acc) => Continue(acc), + FoldWhile::Done(acc) => Break(acc), + }, ); match result { @@ -2441,11 +2864,11 @@ pub trait Itertools : Iterator { /// assert_eq!(nonempty_sum, Some(55)); /// ``` fn sum1(mut self) -> Option - where Self: Sized, - S: std::iter::Sum, + where + Self: Sized, + S: std::iter::Sum, { - self.next() - .map(|first| once(first).chain(self).sum()) + self.next().map(|first| once(first).chain(self).sum()) } /// Iterate over the entire iterator and multiply all the elements. @@ -2469,11 +2892,11 @@ pub trait Itertools : Iterator { /// assert_eq!(nonempty_product, Some(3628800)); /// ``` fn product1

    (mut self) -> Option

    - where Self: Sized, - P: std::iter::Product, + where + Self: Sized, + P: std::iter::Product, { - self.next() - .map(|first| once(first).chain(self).product()) + self.next().map(|first| once(first).chain(self).product()) } /// Sort all iterator elements into a new iterator in ascending order. @@ -2482,6 +2905,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_unstable`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is unstable (i.e., may reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2495,8 +2920,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_unstable(self) -> VecIntoIter - where Self: Sized, - Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { // Use .sort_unstable() directly since it is not quite identical with // .sort_by(Ord::cmp) @@ -2511,6 +2937,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_unstable_by`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is unstable (i.e., may reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2530,8 +2958,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_unstable_by(self, cmp: F) -> VecIntoIter - where Self: Sized, - F: FnMut(&Self::Item, &Self::Item) -> Ordering, + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { let mut v = Vec::from_iter(self); v.sort_unstable_by(cmp); @@ -2544,6 +2973,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_unstable_by_key`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is unstable (i.e., may reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2563,9 +2994,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_unstable_by_key(self, f: F) -> VecIntoIter - where Self: Sized, - K: Ord, - F: FnMut(&Self::Item) -> K, + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { let mut v = Vec::from_iter(self); v.sort_unstable_by_key(f); @@ -2578,6 +3010,8 @@ pub trait Itertools : Iterator { /// [`slice::sort`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2591,8 +3025,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted(self) -> VecIntoIter - where Self: Sized, - Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { // Use .sort() directly since it is not quite identical with // .sort_by(Ord::cmp) @@ -2607,6 +3042,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_by`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2614,7 +3051,7 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2626,8 +3063,9 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_by(self, cmp: F) -> VecIntoIter - where Self: Sized, - F: FnMut(&Self::Item, &Self::Item) -> Ordering, + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { let mut v = Vec::from_iter(self); v.sort_by(cmp); @@ -2640,6 +3078,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_by_key`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2647,7 +3087,7 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2659,9 +3099,10 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn sorted_by_key(self, f: F) -> VecIntoIter - where Self: Sized, - K: Ord, - F: FnMut(&Self::Item) -> K, + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { let mut v = Vec::from_iter(self); v.sort_by_key(f); @@ -2675,6 +3116,8 @@ pub trait Itertools : Iterator { /// [`slice::sort_by_cached_key`] method and returns the result as a new /// iterator that owns its elements. /// + /// This sort is stable (i.e., does not reorder equal elements). + /// /// The sorted iterator, if directly collected to a `Vec`, is converted /// without any extra copying or allocation cost. /// @@ -2682,7 +3125,7 @@ pub trait Itertools : Iterator { /// use itertools::Itertools; /// /// // sort people in descending order by age - /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 27)]; + /// let people = vec![("Jane", 20), ("John", 18), ("Jill", 30), ("Jack", 30)]; /// /// let oldest_people_first = people /// .into_iter() @@ -2733,12 +3176,440 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_alloc")] fn k_smallest(self, k: usize) -> VecIntoIter - where Self: Sized, - Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { - crate::k_smallest::k_smallest(self, k) - .into_sorted_vec() - .into_iter() + // The stdlib heap has optimised handling of "holes", which is not included in our heap implementation in k_smallest_general. + // While the difference is unlikely to have practical impact unless `Self::Item` is very large, this method uses the stdlib structure + // to maintain performance compared to previous versions of the crate. + use alloc::collections::BinaryHeap; + + if k == 0 { + self.last(); + return Vec::new().into_iter(); + } + if k == 1 { + return self.min().into_iter().collect_vec().into_iter(); + } + + let mut iter = self.fuse(); + let mut heap: BinaryHeap<_> = iter.by_ref().take(k).collect(); + + iter.for_each(|i| { + debug_assert_eq!(heap.len(), k); + // Equivalent to heap.push(min(i, heap.pop())) but more efficient. + // This should be done with a single `.peek_mut().unwrap()` but + // `PeekMut` sifts-down unconditionally on Rust 1.46.0 and prior. + if *heap.peek().unwrap() > i { + *heap.peek_mut().unwrap() = i; + } + }); + + heap.into_sorted_vec().into_iter() + } + + /// Sort the k smallest elements into a new iterator using the provided comparison. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by(cmp).take(k)` in the same way that + /// [`k_smallest`](Itertools::k_smallest) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// Particularly, a custom heap implementation ensures the comparison is not cloned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_by(self, k: usize, cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + k_smallest::k_smallest_general(self, k, cmp).into_iter() + } + + /// Return the elements producing the k smallest outputs of the provided function. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by_key(key).take(k)` in the same way that + /// [`k_smallest`](Itertools::k_smallest) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// Particularly, a custom heap implementation ensures the comparison is not cloned. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_smallest_by(k, k_smallest::key_to_cmp(key)) + } + + /// Sort the k smallest elements into a new iterator, in ascending order, relaxing the amount of memory required. + /// + /// **Note:** This consumes the entire iterator, and returns the result + /// as a new iterator that owns its elements. If the input contains + /// less than k elements, the result is equivalent to `self.sorted()`. + /// + /// This is guaranteed to use `2 * k * sizeof(Self::Item) + O(1)` memory + /// and `O(n + k log k)` time, with `n` the number of elements in the input, + /// meaning it uses more memory than the minimum obtained by [`k_smallest`](Itertools::k_smallest) + /// but achieves linear time in the number of elements. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// **Note:** This is functionally-equivalent to `self.sorted().take(k)` + /// but much more efficient. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_relaxed(5); + /// + /// itertools::assert_equal(five_smallest, 0..5); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_relaxed(self, k: usize) -> VecIntoIter + where + Self: Sized, + Self::Item: Ord, + { + self.k_smallest_relaxed_by(k, Ord::cmp) + } + + /// Sort the k smallest elements into a new iterator using the provided comparison, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by(cmp).take(k)` in the same way that + /// [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_relaxed_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_relaxed_by(self, k: usize, cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + k_smallest::k_smallest_relaxed_general(self, k, cmp).into_iter() + } + + /// Return the elements producing the k smallest outputs of the provided function, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// This corresponds to `self.sorted_by_key(key).take(k)` in the same way that + /// [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) corresponds to `self.sorted().take(k)`, + /// in both semantics and complexity. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_smallest = numbers + /// .into_iter() + /// .k_smallest_relaxed_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_smallest, vec![0, 7, 14, 1, 8]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_smallest_relaxed_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_smallest_relaxed_by(k, k_smallest::key_to_cmp(key)) + } + + /// Sort the k largest elements into a new iterator, in descending order. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// It is semantically equivalent to [`k_smallest`](Itertools::k_smallest) + /// with a reversed `Ord`. + /// However, this is implemented with a custom binary heap which does not + /// have the same performance characteristics for very large `Self::Item`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest(5); + /// + /// itertools::assert_equal(five_largest, vec![14, 13, 12, 11, 10]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest(self, k: usize) -> VecIntoIter + where + Self: Sized, + Self::Item: Ord, + { + self.k_largest_by(k, Self::Item::cmp) + } + + /// Sort the k largest elements into a new iterator using the provided comparison. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_by`](Itertools::k_smallest_by) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_by(self, k: usize, mut cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + self.k_smallest_by(k, move |a, b| cmp(b, a)) + } + + /// Return the elements producing the k largest outputs of the provided function. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_by_key`](Itertools::k_smallest_by_key) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_largest_by(k, k_smallest::key_to_cmp(key)) + } + + /// Sort the k largest elements into a new iterator, in descending order, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// It is semantically equivalent to [`k_smallest_relaxed`](Itertools::k_smallest_relaxed) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_relaxed(5); + /// + /// itertools::assert_equal(five_largest, vec![14, 13, 12, 11, 10]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_relaxed(self, k: usize) -> VecIntoIter + where + Self: Sized, + Self::Item: Ord, + { + self.k_largest_relaxed_by(k, Self::Item::cmp) + } + + /// Sort the k largest elements into a new iterator using the provided comparison, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_relaxed_by`](Itertools::k_smallest_relaxed_by) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_relaxed_by(5, |a, b| (a % 7).cmp(&(b % 7)).then(a.cmp(b))); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_relaxed_by(self, k: usize, mut cmp: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, + { + self.k_smallest_relaxed_by(k, move |a, b| cmp(b, a)) + } + + /// Return the elements producing the k largest outputs of the provided function, relaxing the amount of memory required. + /// + /// The sorted iterator, if directly collected to a `Vec`, is converted + /// without any extra copying or allocation cost. + /// + /// Functionally equivalent to [`k_smallest_relaxed_by_key`](Itertools::k_smallest_relaxed_by_key) + /// with a reversed `Ord`. + /// + /// ``` + /// use itertools::Itertools; + /// + /// // A random permutation of 0..15 + /// let numbers = vec![6, 9, 1, 14, 0, 4, 8, 7, 11, 2, 10, 3, 13, 12, 5]; + /// + /// let five_largest = numbers + /// .into_iter() + /// .k_largest_relaxed_by_key(5, |n| (n % 7, *n)); + /// + /// itertools::assert_equal(five_largest, vec![13, 6, 12, 5, 11]); + /// ``` + #[cfg(feature = "use_alloc")] + fn k_largest_relaxed_by_key(self, k: usize, key: F) -> VecIntoIter + where + Self: Sized, + F: FnMut(&Self::Item) -> K, + K: Ord, + { + self.k_largest_relaxed_by(k, k_smallest::key_to_cmp(key)) + } + + /// Consumes the iterator and return an iterator of the last `n` elements. + /// + /// The iterator, if directly collected to a `VecDeque`, is converted + /// without any extra copying or allocation cost. + /// If directly collected to a `Vec`, it may need some data movement + /// but no re-allocation. + /// + /// ``` + /// use itertools::{assert_equal, Itertools}; + /// + /// let v = vec![5, 9, 8, 4, 2, 12, 0]; + /// assert_equal(v.iter().tail(3), &[2, 12, 0]); + /// assert_equal(v.iter().tail(10), &v); + /// + /// assert_equal(v.iter().tail(1), v.iter().last()); + /// + /// assert_equal((0..100).tail(10), 90..100); + /// + /// assert_equal((0..100).filter(|x| x % 3 == 0).tail(10), (72..100).step_by(3)); + /// ``` + /// + /// For double ended iterators without side-effects, you might prefer + /// `.rev().take(n).rev()` to have a similar result (lazy and non-allocating) + /// without consuming the entire iterator. + #[cfg(feature = "use_alloc")] + fn tail(self, n: usize) -> VecDequeIntoIter + where + Self: Sized, + { + match n { + 0 => { + self.last(); + VecDeque::new() + } + 1 => self.last().into_iter().collect(), + _ => { + // Skip the starting part of the iterator if possible. + let (low, _) = self.size_hint(); + let mut iter = self.fuse().skip(low.saturating_sub(n)); + // TODO: If VecDeque has a more efficient method than + // `.pop_front();.push_back(val)` in the future then maybe revisit this. + let mut data: Vec<_> = iter.by_ref().take(n).collect(); + // Update `data` cyclically. + let idx = iter.fold(0, |i, val| { + debug_assert_eq!(data.len(), n); + data[i] = val; + if i + 1 == n { + 0 + } else { + i + 1 + } + }); + // Respect the insertion order, efficiently. + let mut data = VecDeque::from(data); + data.rotate_left(idx); + data + } + } + .into_iter() } /// Collect all iterator elements into one of two @@ -2763,10 +3634,11 @@ pub trait Itertools : Iterator { /// assert_eq!(failures, [false, true]); /// ``` fn partition_map(self, mut predicate: F) -> (A, B) - where Self: Sized, - F: FnMut(Self::Item) -> Either, - A: Default + Extend, - B: Default + Extend, + where + Self: Sized, + F: FnMut(Self::Item) -> Either, + A: Default + Extend, + B: Default + Extend, { let mut left = A::default(); let mut right = B::default(); @@ -2795,10 +3667,10 @@ pub trait Itertools : Iterator { /// assert_eq!(failures, [false, true]); /// ``` fn partition_result(self) -> (A, B) - where - Self: Iterator> + Sized, - A: Default + Extend, - B: Default + Extend, + where + Self: Iterator> + Sized, + A: Default + Extend, + B: Default + Extend, { self.partition_map(|r| match r { Ok(v) => Either::Left(v), @@ -2824,14 +3696,15 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn into_group_map(self) -> HashMap> - where Self: Iterator + Sized, - K: Hash + Eq, + where + Self: Iterator + Sized, + K: Hash + Eq, { group_map::into_group_map(self) } - /// Return an `Iterator` on a `HashMap`. Keys mapped to `Vec`s of values. The key is specified - /// in the closure. + /// Return a `HashMap` of keys mapped to `Vec`s of values. The key is specified + /// in the closure. The values are taken from the input iterator. /// /// Essentially a shorthand for `.into_grouping_map_by(f).collect::>()`. /// @@ -2843,7 +3716,7 @@ pub trait Itertools : Iterator { /// let lookup: HashMap> = /// data.clone().into_iter().into_group_map_by(|a| a.0); /// - /// assert_eq!(lookup[&0], vec![(0,10),(0,20)]); + /// assert_eq!(lookup[&0], vec![(0,10), (0,20)]); /// assert_eq!(lookup.get(&1), None); /// assert_eq!(lookup[&2], vec![(2,12), (2,42)]); /// assert_eq!(lookup[&3], vec![(3,13), (3,33)]); @@ -2859,46 +3732,48 @@ pub trait Itertools : Iterator { /// ``` #[cfg(feature = "use_std")] fn into_group_map_by(self, f: F) -> HashMap> - where - Self: Iterator + Sized, - K: Hash + Eq, - F: Fn(&V) -> K, + where + Self: Iterator + Sized, + K: Hash + Eq, + F: FnMut(&V) -> K, { group_map::into_group_map_by(self, f) } - /// Constructs a `GroupingMap` to be used later with one of the efficient + /// Constructs a `GroupingMap` to be used later with one of the efficient /// group-and-fold operations it allows to perform. - /// + /// /// The input iterator must yield item in the form of `(K, V)` where the /// value of type `K` will be used as key to identify the groups and the /// value of type `V` as value for the folding operation. - /// + /// /// See [`GroupingMap`] for more informations /// on what operations are available. #[cfg(feature = "use_std")] fn into_grouping_map(self) -> GroupingMap - where Self: Iterator + Sized, - K: Hash + Eq, + where + Self: Iterator + Sized, + K: Hash + Eq, { grouping_map::new(self) } - /// Constructs a `GroupingMap` to be used later with one of the efficient + /// Constructs a `GroupingMap` to be used later with one of the efficient /// group-and-fold operations it allows to perform. - /// + /// /// The values from this iterator will be used as values for the folding operation /// while the keys will be obtained from the values by calling `key_mapper`. - /// + /// /// See [`GroupingMap`] for more informations /// on what operations are available. #[cfg(feature = "use_std")] fn into_grouping_map_by(self, key_mapper: F) -> GroupingMapBy - where Self: Iterator + Sized, - K: Hash + Eq, - F: FnMut(&V) -> K + where + Self: Iterator + Sized, + K: Hash + Eq, + F: FnMut(&V) -> K, { - grouping_map::new(grouping_map::MapForGrouping::new(self, key_mapper)) + grouping_map::new(grouping_map::new_map_for_grouping(self, key_mapper)) } /// Return all minimum elements of an iterator. @@ -2923,9 +3798,11 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn min_set(self) -> Vec - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { extrema_set::min_set_impl(self, |_| (), |x, y, _, _| x.cmp(y)) } @@ -2954,15 +3831,13 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn min_set_by(self, mut compare: F) -> Vec - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - extrema_set::min_set_impl( - self, - |_| (), - |x, y, _, _| compare(x, y) - ) + extrema_set::min_set_impl(self, |_| (), |x, y, _, _| compare(x, y)) } /// Return all minimum elements of an iterator, as determined by @@ -2988,9 +3863,12 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn min_set_by_key(self, key: F) -> Vec - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { extrema_set::min_set_impl(self, key, |_, _, kx, ky| kx.cmp(ky)) } @@ -3017,9 +3895,11 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn max_set(self) -> Vec - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { extrema_set::max_set_impl(self, |_| (), |x, y, _, _| x.cmp(y)) } @@ -3048,18 +3928,16 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn max_set_by(self, mut compare: F) -> Vec - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - extrema_set::max_set_impl( - self, - |_| (), - |x, y, _, _| compare(x, y) - ) + extrema_set::max_set_impl(self, |_| (), |x, y, _, _| compare(x, y)) } - /// Return all minimum elements of an iterator, as determined by + /// Return all maximum elements of an iterator, as determined by /// the specified function. /// /// # Examples @@ -3082,9 +3960,12 @@ pub trait Itertools : Iterator { /// /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. - #[cfg(feature = "use_std")] + #[cfg(feature = "use_alloc")] fn max_set_by_key(self, key: F) -> Vec - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { extrema_set::max_set_impl(self, key, |_, _, kx, ky| kx.cmp(ky)) } @@ -3125,7 +4006,9 @@ pub trait Itertools : Iterator { /// The elements can be floats but no particular result is guaranteed /// if an element is NaN. fn minmax(self) -> MinMaxResult - where Self: Sized, Self::Item: PartialOrd + where + Self: Sized, + Self::Item: PartialOrd, { minmax::minmax_impl(self, |_| (), |x, y, _, _| x < y) } @@ -3142,7 +4025,10 @@ pub trait Itertools : Iterator { /// The keys can be floats but no particular result is guaranteed /// if a key is NaN. fn minmax_by_key(self, key: F) -> MinMaxResult - where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K, { minmax::minmax_impl(self, key, |_, _, xk, yk| xk < yk) } @@ -3156,13 +4042,11 @@ pub trait Itertools : Iterator { /// the last maximal element wins. This matches the behavior of the standard /// [`Iterator::min`] and [`Iterator::max`] methods. fn minmax_by(self, mut compare: F) -> MinMaxResult - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - minmax::minmax_impl( - self, - |_| (), - |x, y, _, _| Ordering::Less == compare(x, y) - ) + minmax::minmax_impl(self, |_| (), |x, y, _, _| Ordering::Less == compare(x, y)) } /// Return the position of the maximum element in the iterator. @@ -3185,7 +4069,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_max(), Some(1)); /// ``` fn position_max(self) -> Option - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { self.enumerate() .max_by(|x, y| Ord::cmp(&x.1, &y.1)) @@ -3213,7 +4099,10 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_max_by_key(|x| x.abs()), Some(3)); /// ``` fn position_max_by_key(self, mut key: F) -> Option - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { self.enumerate() .max_by(|x, y| Ord::cmp(&key(&x.1), &key(&y.1))) @@ -3241,7 +4130,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_max_by(|x, y| x.cmp(y)), Some(1)); /// ``` fn position_max_by(self, mut compare: F) -> Option - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { self.enumerate() .max_by(|x, y| compare(&x.1, &y.1)) @@ -3268,7 +4159,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_min(), Some(2)); /// ``` fn position_min(self) -> Option - where Self: Sized, Self::Item: Ord + where + Self: Sized, + Self::Item: Ord, { self.enumerate() .min_by(|x, y| Ord::cmp(&x.1, &y.1)) @@ -3296,7 +4189,10 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_min_by_key(|x| x.abs()), Some(0)); /// ``` fn position_min_by_key(self, mut key: F) -> Option - where Self: Sized, K: Ord, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: Ord, + F: FnMut(&Self::Item) -> K, { self.enumerate() .min_by(|x, y| Ord::cmp(&key(&x.1), &key(&y.1))) @@ -3324,7 +4220,9 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_min_by(|x, y| x.cmp(y)), Some(2)); /// ``` fn position_min_by(self, mut compare: F) -> Option - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { self.enumerate() .min_by(|x, y| compare(&x.1, &y.1)) @@ -3374,9 +4272,11 @@ pub trait Itertools : Iterator { /// assert_eq!(a.iter().position_minmax(), MinMax(2, 1)); /// ``` fn position_minmax(self) -> MinMaxResult - where Self: Sized, Self::Item: PartialOrd + where + Self: Sized, + Self::Item: PartialOrd, { - use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + use crate::MinMaxResult::{MinMax, NoElements, OneElement}; match minmax::minmax_impl(self.enumerate(), |_| (), |x, y, _, _| x.1 < y.1) { NoElements => NoElements, OneElement(x) => OneElement(x.0), @@ -3419,9 +4319,12 @@ pub trait Itertools : Iterator { /// /// [`position_minmax`]: Self::position_minmax fn position_minmax_by_key(self, mut key: F) -> MinMaxResult - where Self: Sized, K: PartialOrd, F: FnMut(&Self::Item) -> K + where + Self: Sized, + K: PartialOrd, + F: FnMut(&Self::Item) -> K, { - use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + use crate::MinMaxResult::{MinMax, NoElements, OneElement}; match self.enumerate().minmax_by_key(|e| key(&e.1)) { NoElements => NoElements, OneElement(x) => OneElement(x.0), @@ -3461,9 +4364,11 @@ pub trait Itertools : Iterator { /// /// [`position_minmax`]: Self::position_minmax fn position_minmax_by(self, mut compare: F) -> MinMaxResult - where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Ordering + where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering, { - use crate::MinMaxResult::{NoElements, OneElement, MinMax}; + use crate::MinMaxResult::{MinMax, NoElements, OneElement}; match self.enumerate().minmax_by(|x, y| compare(&x.1, &y.1)) { NoElements => NoElements, OneElement(x) => OneElement(x.0), @@ -3493,21 +4398,18 @@ pub trait Itertools : Iterator { Self: Sized, { match self.next() { - Some(first) => { - match self.next() { - Some(second) => { - Err(ExactlyOneError::new(Some(Either::Left([first, second])), self)) - } - None => { - Ok(first) - } - } - } + Some(first) => match self.next() { + Some(second) => Err(ExactlyOneError::new( + Some(Either::Left([first, second])), + self, + )), + None => Ok(first), + }, None => Err(ExactlyOneError::new(None, self)), } } - /// If the iterator yields no elements, Ok(None) will be returned. If the iterator yields + /// If the iterator yields no elements, `Ok(None)` will be returned. If the iterator yields /// exactly one element, that element will be returned, otherwise an error will be returned /// containing an iterator that has the same output as the input iterator. /// @@ -3529,16 +4431,13 @@ pub trait Itertools : Iterator { Self: Sized, { match self.next() { - Some(first) => { - match self.next() { - Some(second) => { - Err(ExactlyOneError::new(Some(Either::Left([first, second])), self)) - } - None => { - Ok(Some(first)) - } - } - } + Some(first) => match self.next() { + Some(second) => Err(ExactlyOneError::new( + Some(Either::Left([first, second])), + self, + )), + None => Ok(Some(first)), + }, None => Ok(None), } } @@ -3572,7 +4471,7 @@ pub trait Itertools : Iterator { /// # Examples /// ``` /// # use itertools::Itertools; - /// let counts = [1, 1, 1, 3, 3, 5].into_iter().counts(); + /// let counts = [1, 1, 1, 3, 3, 5].iter().counts(); /// assert_eq!(counts[&1], 3); /// assert_eq!(counts[&3], 2); /// assert_eq!(counts[&5], 1); @@ -3598,9 +4497,10 @@ pub trait Itertools : Iterator { /// # use itertools::Itertools; /// struct Character { /// first_name: &'static str, + /// # #[allow(dead_code)] /// last_name: &'static str, /// } - /// + /// /// let characters = /// vec![ /// Character { first_name: "Amy", last_name: "Pond" }, @@ -3611,12 +4511,12 @@ pub trait Itertools : Iterator { /// Character { first_name: "James", last_name: "Norington" }, /// Character { first_name: "James", last_name: "Kirk" }, /// ]; - /// - /// let first_name_frequency = + /// + /// let first_name_frequency = /// characters /// .into_iter() /// .counts_by(|c| c.first_name); - /// + /// /// assert_eq!(first_name_frequency["Amy"], 3); /// assert_eq!(first_name_frequency["James"], 4); /// assert_eq!(first_name_frequency.contains_key("Asha"), false); @@ -3633,11 +4533,11 @@ pub trait Itertools : Iterator { /// Converts an iterator of tuples into a tuple of containers. /// - /// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each + /// It consumes an entire iterator of n-ary tuples, producing `n` collections, one for each /// column. /// /// This function is, in some sense, the opposite of [`multizip`]. - /// + /// /// ``` /// use itertools::Itertools; /// @@ -3657,9 +4557,33 @@ pub trait Itertools : Iterator { { MultiUnzip::multiunzip(self) } + + /// Returns the length of the iterator if one exists. + /// Otherwise return `self.size_hint()`. + /// + /// Fallible [`ExactSizeIterator::len`]. + /// + /// Inherits guarantees and restrictions from [`Iterator::size_hint`]. + /// + /// ``` + /// use itertools::Itertools; + /// + /// assert_eq!([0; 10].iter().try_len(), Ok(10)); + /// assert_eq!((10..15).try_len(), Ok(5)); + /// assert_eq!((15..10).try_len(), Ok(0)); + /// assert_eq!((10..).try_len(), Err((usize::MAX, None))); + /// assert_eq!((10..15).filter(|x| x % 2 == 0).try_len(), Err((0, Some(5)))); + /// ``` + fn try_len(&self) -> Result { + let sh = self.size_hint(); + match sh { + (lo, Some(hi)) if lo == hi => Ok(lo), + _ => Err(sh), + } + } } -impl Itertools for T where T: Iterator { } +impl Itertools for T where T: Iterator + ?Sized {} /// Return `true` if both iterables produce equal sequences /// (elements pairwise equal and sequences of the same length), @@ -3672,9 +4596,10 @@ impl Itertools for T where T: Iterator { } /// assert!(!itertools::equal(&[0, 0], &[0, 0, 0])); /// ``` pub fn equal(a: I, b: J) -> bool - where I: IntoIterator, - J: IntoIterator, - I::Item: PartialEq +where + I: IntoIterator, + J: IntoIterator, + I::Item: PartialEq, { a.into_iter().eq(b) } @@ -3683,31 +4608,39 @@ pub fn equal(a: I, b: J) -> bool /// semantics as [`equal(a, b)`](equal). /// /// **Panics** on assertion failure with a message that shows the -/// two iteration elements. +/// two different elements and the iteration index. /// -/// ```ignore +/// ```should_panic +/// # use itertools::assert_equal; /// assert_equal("exceed".split('c'), "excess".split('c')); -/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1', +/// // ^PANIC: panicked at 'Failed assertion Some("eed") == Some("ess") for iteration 1'. /// ``` +#[track_caller] pub fn assert_equal(a: I, b: J) - where I: IntoIterator, - J: IntoIterator, - I::Item: fmt::Debug + PartialEq, - J::Item: fmt::Debug, +where + I: IntoIterator, + J: IntoIterator, + I::Item: fmt::Debug + PartialEq, + J::Item: fmt::Debug, { let mut ia = a.into_iter(); let mut ib = b.into_iter(); - let mut i = 0; + let mut i: usize = 0; loop { match (ia.next(), ib.next()) { (None, None) => return, (a, b) => { let equal = match (&a, &b) { - (&Some(ref a), &Some(ref b)) => a == b, + (Some(a), Some(b)) => a == b, _ => false, }; - assert!(equal, "Failed assertion {a:?} == {b:?} for iteration {i}", - i=i, a=a, b=b); + assert!( + equal, + "Failed assertion {a:?} == {b:?} for iteration {i}", + i = i, + a = a, + b = b + ); i += 1; } } @@ -3732,22 +4665,18 @@ pub fn assert_equal(a: I, b: J) /// assert_eq!(split_index, 3); /// ``` pub fn partition<'a, A: 'a, I, F>(iter: I, mut pred: F) -> usize - where I: IntoIterator, - I::IntoIter: DoubleEndedIterator, - F: FnMut(&A) -> bool +where + I: IntoIterator, + I::IntoIter: DoubleEndedIterator, + F: FnMut(&A) -> bool, { let mut split_index = 0; let mut iter = iter.into_iter(); - 'main: while let Some(front) = iter.next() { + while let Some(front) = iter.next() { if !pred(front) { - loop { - match iter.next_back() { - Some(back) => if pred(back) { - std::mem::swap(front, back); - break; - }, - None => break 'main, - } + match iter.rfind(|back| pred(back)) { + Some(back) => std::mem::swap(front, back), + None => break, } } split_index += 1; @@ -3770,15 +4699,15 @@ impl FoldWhile { /// Return the value in the continue or done. pub fn into_inner(self) -> T { match self { - FoldWhile::Continue(x) | FoldWhile::Done(x) => x, + Self::Continue(x) | Self::Done(x) => x, } } /// Return true if `self` is `Done`, false if it is `Continue`. pub fn is_done(&self) -> bool { match *self { - FoldWhile::Continue(_) => false, - FoldWhile::Done(_) => true, + Self::Continue(_) => false, + Self::Done(_) => true, } } } diff --git a/third_party/rust/itertools/src/merge_join.rs b/third_party/rust/itertools/src/merge_join.rs index f2fbdea2c48..5f4a605fa25 100644 --- a/third_party/rust/itertools/src/merge_join.rs +++ b/third_party/rust/itertools/src/merge_join.rs @@ -1,151 +1,315 @@ use std::cmp::Ordering; -use std::iter::Fuse; use std::fmt; +use std::iter::{Fuse, FusedIterator}; +use std::marker::PhantomData; -use super::adaptors::{PutBack, put_back}; +use either::Either; + +use super::adaptors::{put_back, PutBack}; use crate::either_or_both::EitherOrBoth; +use crate::size_hint::{self, SizeHint}; #[cfg(doc)] use crate::Itertools; +#[derive(Clone, Debug)] +pub struct MergeLte; + +/// An iterator adaptor that merges the two base iterators in ascending order. +/// If both base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.merge()`](crate::Itertools::merge_by) for more information. +pub type Merge = MergeBy; + +/// Create an iterator that merges elements in `i` and `j`. +/// +/// [`IntoIterator`] enabled version of [`Itertools::merge`](crate::Itertools::merge). +/// +/// ``` +/// use itertools::merge; +/// +/// for elt in merge(&[1, 2, 3], &[2, 3, 4]) { +/// /* loop body */ +/// # let _ = elt; +/// } +/// ``` +pub fn merge( + i: I, + j: J, +) -> Merge<::IntoIter, ::IntoIter> +where + I: IntoIterator, + J: IntoIterator, + I::Item: PartialOrd, +{ + merge_by_new(i, j, MergeLte) +} + +/// An iterator adaptor that merges the two base iterators in ascending order. +/// If both base iterators are sorted (ascending), the result is sorted. +/// +/// Iterator element type is `I::Item`. +/// +/// See [`.merge_by()`](crate::Itertools::merge_by) for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +pub struct MergeBy { + left: PutBack>, + right: PutBack>, + cmp_fn: F, +} + +/// Create a `MergeBy` iterator. +pub fn merge_by_new(a: I, b: J, cmp: F) -> MergeBy +where + I: IntoIterator, + J: IntoIterator, +{ + MergeBy { + left: put_back(a.into_iter().fuse()), + right: put_back(b.into_iter().fuse()), + cmp_fn: cmp, + } +} + /// Return an iterator adaptor that merge-joins items from the two base iterators in ascending order. /// /// [`IntoIterator`] enabled version of [`Itertools::merge_join_by`]. -pub fn merge_join_by(left: I, right: J, cmp_fn: F) - -> MergeJoinBy - where I: IntoIterator, - J: IntoIterator, - F: FnMut(&I::Item, &J::Item) -> Ordering +pub fn merge_join_by( + left: I, + right: J, + cmp_fn: F, +) -> MergeJoinBy +where + I: IntoIterator, + J: IntoIterator, + F: FnMut(&I::Item, &J::Item) -> T, { - MergeJoinBy { + MergeBy { left: put_back(left.into_iter().fuse()), right: put_back(right.into_iter().fuse()), - cmp_fn, + cmp_fn: MergeFuncLR(cmp_fn, PhantomData), } } /// An iterator adaptor that merge-joins items from the two base iterators in ascending order. /// /// See [`.merge_join_by()`](crate::Itertools::merge_join_by) for more information. -#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct MergeJoinBy { - left: PutBack>, - right: PutBack>, - cmp_fn: F +pub type MergeJoinBy = + MergeBy::Item, ::Item>>::T>>; + +#[derive(Clone, Debug)] +pub struct MergeFuncLR(F, PhantomData); + +pub trait FuncLR { + type T; } -impl Clone for MergeJoinBy - where I: Iterator, - J: Iterator, - PutBack>: Clone, - PutBack>: Clone, - F: Clone, -{ - clone_fields!(left, right, cmp_fn); +impl T> FuncLR for F { + type T = T; } -impl fmt::Debug for MergeJoinBy - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, - J: Iterator + fmt::Debug, - J::Item: fmt::Debug, -{ - debug_fmt_fields!(MergeJoinBy, left, right); +pub trait OrderingOrBool { + type MergeResult; + fn left(left: L) -> Self::MergeResult; + fn right(right: R) -> Self::MergeResult; + // "merge" never returns (Some(...), Some(...), ...) so Option> + // is appealing but it is always followed by two put_backs, so we think the compiler is + // smart enough to optimize it. Or we could move put_backs into "merge". + fn merge(&mut self, left: L, right: R) -> (Option>, Self::MergeResult); + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint; } -impl Iterator for MergeJoinBy - where I: Iterator, - J: Iterator, - F: FnMut(&I::Item, &J::Item) -> Ordering -{ - type Item = EitherOrBoth; - - fn next(&mut self) -> Option { - match (self.left.next(), self.right.next()) { - (None, None) => None, - (Some(left), None) => - Some(EitherOrBoth::Left(left)), - (None, Some(right)) => - Some(EitherOrBoth::Right(right)), - (Some(left), Some(right)) => { - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => - Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - }, - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } - } - } +impl Ordering> OrderingOrBool for MergeFuncLR { + type MergeResult = EitherOrBoth; + fn left(left: L) -> Self::MergeResult { + EitherOrBoth::Left(left) + } + fn right(right: R) -> Self::MergeResult { + EitherOrBoth::Right(right) + } + fn merge(&mut self, left: L, right: R) -> (Option>, Self::MergeResult) { + match self.0(&left, &right) { + Ordering::Equal => (None, EitherOrBoth::Both(left, right)), + Ordering::Less => (Some(Either::Right(right)), EitherOrBoth::Left(left)), + Ordering::Greater => (Some(Either::Left(left)), EitherOrBoth::Right(right)), } } - - fn size_hint(&self) -> (usize, Option) { - let (a_lower, a_upper) = self.left.size_hint(); - let (b_lower, b_upper) = self.right.size_hint(); - + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + let (a_lower, a_upper) = left; + let (b_lower, b_upper) = right; let lower = ::std::cmp::max(a_lower, b_lower); - let upper = match (a_upper, b_upper) { (Some(x), Some(y)) => x.checked_add(y), _ => None, }; - (lower, upper) } +} - fn count(mut self) -> usize { - let mut count = 0; - loop { - match (self.left.next(), self.right.next()) { - (None, None) => break count, - (Some(_left), None) => break count + 1 + self.left.into_parts().1.count(), - (None, Some(_right)) => break count + 1 + self.right.into_parts().1.count(), - (Some(left), Some(right)) => { - count += 1; - match (self.cmp_fn)(&left, &right) { - Ordering::Equal => {} - Ordering::Less => self.right.put_back(right), - Ordering::Greater => self.left.put_back(left), +impl bool> OrderingOrBool for MergeFuncLR { + type MergeResult = Either; + fn left(left: L) -> Self::MergeResult { + Either::Left(left) + } + fn right(right: R) -> Self::MergeResult { + Either::Right(right) + } + fn merge(&mut self, left: L, right: R) -> (Option>, Self::MergeResult) { + if self.0(&left, &right) { + (Some(Either::Right(right)), Either::Left(left)) + } else { + (Some(Either::Left(left)), Either::Right(right)) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } +} + +impl bool> OrderingOrBool for F { + type MergeResult = T; + fn left(left: T) -> Self::MergeResult { + left + } + fn right(right: T) -> Self::MergeResult { + right + } + fn merge(&mut self, left: T, right: T) -> (Option>, Self::MergeResult) { + if self(&left, &right) { + (Some(Either::Right(right)), left) + } else { + (Some(Either::Left(left)), right) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } +} + +impl OrderingOrBool for MergeLte { + type MergeResult = T; + fn left(left: T) -> Self::MergeResult { + left + } + fn right(right: T) -> Self::MergeResult { + right + } + fn merge(&mut self, left: T, right: T) -> (Option>, Self::MergeResult) { + if left <= right { + (Some(Either::Right(right)), left) + } else { + (Some(Either::Left(left)), right) + } + } + fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint { + // Not ExactSizeIterator because size may be larger than usize + size_hint::add(left, right) + } +} + +impl Clone for MergeBy +where + I: Iterator, + J: Iterator, + PutBack>: Clone, + PutBack>: Clone, + F: Clone, +{ + clone_fields!(left, right, cmp_fn); +} + +impl fmt::Debug for MergeBy +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, + J: Iterator + fmt::Debug, + J::Item: fmt::Debug, +{ + debug_fmt_fields!(MergeBy, left, right); +} + +impl Iterator for MergeBy +where + I: Iterator, + J: Iterator, + F: OrderingOrBool, +{ + type Item = F::MergeResult; + + fn next(&mut self) -> Option { + match (self.left.next(), self.right.next()) { + (None, None) => None, + (Some(left), None) => Some(F::left(left)), + (None, Some(right)) => Some(F::right(right)), + (Some(left), Some(right)) => { + let (not_next, next) = self.cmp_fn.merge(left, right); + match not_next { + Some(Either::Left(l)) => { + self.left.put_back(l); } + Some(Either::Right(r)) => { + self.right.put_back(r); + } + None => (), } + + Some(next) } } } - fn last(mut self) -> Option { - let mut previous_element = None; + fn fold(mut self, init: B, mut f: G) -> B + where + Self: Sized, + G: FnMut(B, Self::Item) -> B, + { + let mut acc = init; + let mut left = self.left.next(); + let mut right = self.right.next(); + loop { - match (self.left.next(), self.right.next()) { - (None, None) => break previous_element, - (Some(left), None) => { - break Some(EitherOrBoth::Left( - self.left.into_parts().1.last().unwrap_or(left), - )) - } - (None, Some(right)) => { - break Some(EitherOrBoth::Right( - self.right.into_parts().1.last().unwrap_or(right), - )) - } - (Some(left), Some(right)) => { - previous_element = match (self.cmp_fn)(&left, &right) { - Ordering::Equal => Some(EitherOrBoth::Both(left, right)), - Ordering::Less => { - self.right.put_back(right); - Some(EitherOrBoth::Left(left)) - } - Ordering::Greater => { - self.left.put_back(left); - Some(EitherOrBoth::Right(right)) - } + match (left, right) { + (Some(l), Some(r)) => match self.cmp_fn.merge(l, r) { + (Some(Either::Right(r)), x) => { + acc = f(acc, x); + left = self.left.next(); + right = Some(r); } + (Some(Either::Left(l)), x) => { + acc = f(acc, x); + left = Some(l); + right = self.right.next(); + } + (None, x) => { + acc = f(acc, x); + left = self.left.next(); + right = self.right.next(); + } + }, + (Some(l), None) => { + self.left.put_back(l); + acc = self.left.fold(acc, |acc, x| f(acc, F::left(x))); + break; + } + (None, Some(r)) => { + self.right.put_back(r); + acc = self.right.fold(acc, |acc, x| f(acc, F::right(x))); + break; + } + (None, None) => { + break; } } } + + acc + } + + fn size_hint(&self) -> SizeHint { + F::size_hint(self.left.size_hint(), self.right.size_hint()) } fn nth(&mut self, mut n: usize) -> Option { @@ -156,14 +320,29 @@ impl Iterator for MergeJoinBy n -= 1; match (self.left.next(), self.right.next()) { (None, None) => break None, - (Some(_left), None) => break self.left.nth(n).map(EitherOrBoth::Left), - (None, Some(_right)) => break self.right.nth(n).map(EitherOrBoth::Right), - (Some(left), Some(right)) => match (self.cmp_fn)(&left, &right) { - Ordering::Equal => {} - Ordering::Less => self.right.put_back(right), - Ordering::Greater => self.left.put_back(left), - }, + (Some(_left), None) => break self.left.nth(n).map(F::left), + (None, Some(_right)) => break self.right.nth(n).map(F::right), + (Some(left), Some(right)) => { + let (not_next, _) = self.cmp_fn.merge(left, right); + match not_next { + Some(Either::Left(l)) => { + self.left.put_back(l); + } + Some(Either::Right(r)) => { + self.right.put_back(r); + } + None => (), + } + } } } } } + +impl FusedIterator for MergeBy +where + I: Iterator, + J: Iterator, + F: OrderingOrBool, +{ +} diff --git a/third_party/rust/itertools/src/minmax.rs b/third_party/rust/itertools/src/minmax.rs index 52b2f115ddd..5c9674e0112 100644 --- a/third_party/rust/itertools/src/minmax.rs +++ b/third_party/rust/itertools/src/minmax.rs @@ -1,8 +1,7 @@ - /// `MinMaxResult` is an enum returned by `minmax`. /// /// See [`.minmax()`](crate::Itertools::minmax) for more detail. -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum MinMaxResult { /// Empty iterator NoElements, @@ -12,7 +11,7 @@ pub enum MinMaxResult { /// More than one element in the iterator, the first element is not larger /// than the second - MinMax(T, T) + MinMax(T, T), } impl MinMaxResult { @@ -36,34 +35,36 @@ impl MinMaxResult { /// let r = MinMax(1, 2); /// assert_eq!(r.into_option(), Some((1, 2))); /// ``` - pub fn into_option(self) -> Option<(T,T)> { + pub fn into_option(self) -> Option<(T, T)> { match self { - MinMaxResult::NoElements => None, - MinMaxResult::OneElement(x) => Some((x.clone(), x)), - MinMaxResult::MinMax(x, y) => Some((x, y)) + Self::NoElements => None, + Self::OneElement(x) => Some((x.clone(), x)), + Self::MinMax(x, y) => Some((x, y)), } } } /// Implementation guts for `minmax` and `minmax_by_key`. -pub fn minmax_impl(mut it: I, mut key_for: F, - mut lt: L) -> MinMaxResult - where I: Iterator, - F: FnMut(&I::Item) -> K, - L: FnMut(&I::Item, &I::Item, &K, &K) -> bool, +pub fn minmax_impl(mut it: I, mut key_for: F, mut lt: L) -> MinMaxResult +where + I: Iterator, + F: FnMut(&I::Item) -> K, + L: FnMut(&I::Item, &I::Item, &K, &K) -> bool, { let (mut min, mut max, mut min_key, mut max_key) = match it.next() { None => return MinMaxResult::NoElements, - Some(x) => { - match it.next() { - None => return MinMaxResult::OneElement(x), - Some(y) => { - let xk = key_for(&x); - let yk = key_for(&y); - if !lt(&y, &x, &yk, &xk) {(x, y, xk, yk)} else {(y, x, yk, xk)} + Some(x) => match it.next() { + None => return MinMaxResult::OneElement(x), + Some(y) => { + let xk = key_for(&x); + let yk = key_for(&y); + if !lt(&y, &x, &yk, &xk) { + (x, y, xk, yk) + } else { + (y, x, yk, xk) } } - } + }, }; loop { @@ -74,7 +75,7 @@ pub fn minmax_impl(mut it: I, mut key_for: F, // for 2 elements. let first = match it.next() { None => break, - Some(x) => x + Some(x) => x, }; let second = match it.next() { None => { @@ -86,7 +87,7 @@ pub fn minmax_impl(mut it: I, mut key_for: F, } break; } - Some(x) => x + Some(x) => x, }; let first_key = key_for(&first); let second_key = key_for(&second); diff --git a/third_party/rust/itertools/src/multipeek_impl.rs b/third_party/rust/itertools/src/multipeek_impl.rs index 8b49c695eb0..6f800b6fb6c 100644 --- a/third_party/rust/itertools/src/multipeek_impl.rs +++ b/third_party/rust/itertools/src/multipeek_impl.rs @@ -1,14 +1,16 @@ -use std::iter::Fuse; -use alloc::collections::VecDeque; use crate::size_hint; -use crate::PeekingNext; #[cfg(doc)] use crate::Itertools; +use crate::PeekingNext; +use alloc::collections::VecDeque; +use std::iter::Fuse; /// See [`multipeek()`] for more information. #[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct MultiPeek - where I: Iterator +where + I: Iterator, { iter: Fuse, buf: VecDeque, @@ -20,7 +22,8 @@ pub struct MultiPeek /// /// [`IntoIterator`] enabled version of [`Itertools::multipeek`]. pub fn multipeek(iterable: I) -> MultiPeek - where I: IntoIterator +where + I: IntoIterator, { MultiPeek { iter: iterable.into_iter().fuse(), @@ -30,7 +33,8 @@ pub fn multipeek(iterable: I) -> MultiPeek } impl MultiPeek - where I: Iterator +where + I: Iterator, { /// Reset the peeking “cursor” pub fn reset_peek(&mut self) { @@ -62,24 +66,31 @@ impl MultiPeek { } impl PeekingNext for MultiPeek - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if self.buf.is_empty() { if let Some(r) = self.peek() { - if !accept(r) { return None } + if !accept(r) { + return None; + } + } + } else if let Some(r) = self.buf.front() { + if !accept(r) { + return None; } - } else if let Some(r) = self.buf.get(0) { - if !accept(r) { return None } } self.next() } } impl Iterator for MultiPeek - where I: Iterator +where + I: Iterator, { type Item = I::Item; @@ -91,11 +102,15 @@ impl Iterator for MultiPeek fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + init = self.buf.into_iter().fold(init, &mut f); + self.iter.fold(init, f) + } } // Same size -impl ExactSizeIterator for MultiPeek - where I: ExactSizeIterator -{} - - +impl ExactSizeIterator for MultiPeek where I: ExactSizeIterator {} diff --git a/third_party/rust/itertools/src/next_array.rs b/third_party/rust/itertools/src/next_array.rs new file mode 100644 index 00000000000..86480b19740 --- /dev/null +++ b/third_party/rust/itertools/src/next_array.rs @@ -0,0 +1,269 @@ +use core::mem::{self, MaybeUninit}; + +/// An array of at most `N` elements. +struct ArrayBuilder { + /// The (possibly uninitialized) elements of the `ArrayBuilder`. + /// + /// # Safety + /// + /// The elements of `arr[..len]` are valid `T`s. + arr: [MaybeUninit; N], + + /// The number of leading elements of `arr` that are valid `T`s, len <= N. + len: usize, +} + +impl ArrayBuilder { + /// Initializes a new, empty `ArrayBuilder`. + pub fn new() -> Self { + // SAFETY: The safety invariant of `arr` trivially holds for `len = 0`. + Self { + arr: [(); N].map(|_| MaybeUninit::uninit()), + len: 0, + } + } + + /// Pushes `value` onto the end of the array. + /// + /// # Panics + /// + /// This panics if `self.len >= N`. + #[inline(always)] + pub fn push(&mut self, value: T) { + // PANICS: This will panic if `self.len >= N`. + let place = &mut self.arr[self.len]; + // SAFETY: The safety invariant of `self.arr` applies to elements at + // indices `0..self.len` — not to the element at `self.len`. Writing to + // the element at index `self.len` therefore does not violate the safety + // invariant of `self.arr`. Even if this line panics, we have not + // created any intermediate invalid state. + *place = MaybeUninit::new(value); + // Lemma: `self.len < N`. By invariant, `self.len <= N`. Above, we index + // into `self.arr`, which has size `N`, at index `self.len`. If `self.len == N` + // at that point, that index would be out-of-bounds, and the index + // operation would panic. Thus, `self.len != N`, and since `self.len <= N`, + // that means that `self.len < N`. + // + // PANICS: Since `self.len < N`, and since `N <= usize::MAX`, + // `self.len + 1 <= usize::MAX`, and so `self.len += 1` will not + // overflow. Overflow is the only panic condition of `+=`. + // + // SAFETY: + // - We are required to uphold the invariant that `self.len <= N`. + // Since, by the preceding lemma, `self.len < N` at this point in the + // code, `self.len += 1` results in `self.len <= N`. + // - We are required to uphold the invariant that `self.arr[..self.len]` + // are valid instances of `T`. Since this invariant already held when + // this method was called, and since we only increment `self.len` + // by 1 here, we only need to prove that the element at + // `self.arr[self.len]` (using the value of `self.len` before incrementing) + // is valid. Above, we construct `place` to point to `self.arr[self.len]`, + // and then initialize `*place` to `MaybeUninit::new(value)`, which is + // a valid `T` by construction. + self.len += 1; + } + + /// Consumes the elements in the `ArrayBuilder` and returns them as an array + /// `[T; N]`. + /// + /// If `self.len() < N`, this returns `None`. + pub fn take(&mut self) -> Option<[T; N]> { + if self.len == N { + // SAFETY: Decreasing the value of `self.len` cannot violate the + // safety invariant on `self.arr`. + self.len = 0; + + // SAFETY: Since `self.len` is 0, `self.arr` may safely contain + // uninitialized elements. + let arr = mem::replace(&mut self.arr, [(); N].map(|_| MaybeUninit::uninit())); + + Some(arr.map(|v| { + // SAFETY: We know that all elements of `arr` are valid because + // we checked that `len == N`. + unsafe { v.assume_init() } + })) + } else { + None + } + } +} + +impl AsMut<[T]> for ArrayBuilder { + fn as_mut(&mut self) -> &mut [T] { + let valid = &mut self.arr[..self.len]; + // SAFETY: By invariant on `self.arr`, the elements of `self.arr` at + // indices `0..self.len` are in a valid state. Since `valid` references + // only these elements, the safety precondition of + // `slice_assume_init_mut` is satisfied. + unsafe { slice_assume_init_mut(valid) } + } +} + +impl Drop for ArrayBuilder { + // We provide a non-trivial `Drop` impl, because the trivial impl would be a + // no-op; `MaybeUninit` has no innate awareness of its own validity, and + // so it can only forget its contents. By leveraging the safety invariant of + // `self.arr`, we do know which elements of `self.arr` are valid, and can + // selectively run their destructors. + fn drop(&mut self) { + // SAFETY: + // - by invariant on `&mut [T]`, `self.as_mut()` is: + // - valid for reads and writes + // - properly aligned + // - non-null + // - the dropped `T` are valid for dropping; they do not have any + // additional library invariants that we've violated + // - no other pointers to `valid` exist (since we're in the context of + // `drop`) + unsafe { core::ptr::drop_in_place(self.as_mut()) } + } +} + +/// Assuming all the elements are initialized, get a mutable slice to them. +/// +/// # Safety +/// +/// The caller guarantees that the elements `T` referenced by `slice` are in a +/// valid state. +unsafe fn slice_assume_init_mut(slice: &mut [MaybeUninit]) -> &mut [T] { + // SAFETY: Casting `&mut [MaybeUninit]` to `&mut [T]` is sound, because + // `MaybeUninit` is guaranteed to have the same size, alignment and ABI + // as `T`, and because the caller has guaranteed that `slice` is in the + // valid state. + unsafe { &mut *(slice as *mut [MaybeUninit] as *mut [T]) } +} + +/// Equivalent to `it.next_array()`. +pub(crate) fn next_array(it: &mut I) -> Option<[I::Item; N]> +where + I: Iterator, +{ + let mut builder = ArrayBuilder::new(); + for _ in 0..N { + builder.push(it.next()?); + } + builder.take() +} + +#[cfg(test)] +mod test { + use super::ArrayBuilder; + + #[test] + fn zero_len_take() { + let mut builder = ArrayBuilder::<(), 0>::new(); + let taken = builder.take(); + assert_eq!(taken, Some([(); 0])); + } + + #[test] + #[should_panic] + fn zero_len_push() { + let mut builder = ArrayBuilder::<(), 0>::new(); + builder.push(()); + } + + #[test] + fn push_4() { + let mut builder = ArrayBuilder::<(), 4>::new(); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), None); + + builder.push(()); + assert_eq!(builder.take(), Some([(); 4])); + } + + #[test] + fn tracked_drop() { + use std::panic::{catch_unwind, AssertUnwindSafe}; + use std::sync::atomic::{AtomicU16, Ordering}; + + static DROPPED: AtomicU16 = AtomicU16::new(0); + + #[derive(Debug, PartialEq)] + struct TrackedDrop; + + impl Drop for TrackedDrop { + fn drop(&mut self) { + DROPPED.fetch_add(1, Ordering::Relaxed); + } + } + + { + let builder = ArrayBuilder::::new(); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + drop(builder); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + } + + { + let mut builder = ArrayBuilder::::new(); + builder.push(TrackedDrop); + assert_eq!(builder.take(), None); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + drop(builder); + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 1); + } + + { + let mut builder = ArrayBuilder::::new(); + builder.push(TrackedDrop); + builder.push(TrackedDrop); + assert!(matches!(builder.take(), Some(_))); + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 2); + drop(builder); + assert_eq!(DROPPED.load(Ordering::Relaxed), 0); + } + + { + let mut builder = ArrayBuilder::::new(); + + builder.push(TrackedDrop); + builder.push(TrackedDrop); + + assert!(catch_unwind(AssertUnwindSafe(|| { + builder.push(TrackedDrop); + })) + .is_err()); + + assert_eq!(DROPPED.load(Ordering::Relaxed), 1); + + drop(builder); + + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 3); + } + + { + let mut builder = ArrayBuilder::::new(); + + builder.push(TrackedDrop); + builder.push(TrackedDrop); + + assert!(catch_unwind(AssertUnwindSafe(|| { + builder.push(TrackedDrop); + })) + .is_err()); + + assert_eq!(DROPPED.load(Ordering::Relaxed), 1); + + assert!(matches!(builder.take(), Some(_))); + + assert_eq!(DROPPED.load(Ordering::Relaxed), 3); + + builder.push(TrackedDrop); + builder.push(TrackedDrop); + + assert!(matches!(builder.take(), Some(_))); + + assert_eq!(DROPPED.swap(0, Ordering::Relaxed), 5); + } + } +} diff --git a/third_party/rust/itertools/src/pad_tail.rs b/third_party/rust/itertools/src/pad_tail.rs index 248a4324368..5595b42bacf 100644 --- a/third_party/rust/itertools/src/pad_tail.rs +++ b/third_party/rust/itertools/src/pad_tail.rs @@ -1,5 +1,5 @@ -use std::iter::{Fuse, FusedIterator}; use crate::size_hint; +use std::iter::{Fuse, FusedIterator}; /// An iterator adaptor that pads a sequence to a minimum length by filling /// missing elements using a closure. @@ -25,8 +25,9 @@ where /// Create a new `PadUsing` iterator. pub fn pad_using(iter: I, min: usize, filler: F) -> PadUsing - where I: Iterator, - F: FnMut(usize) -> I::Item +where + I: Iterator, + F: FnMut(usize) -> I::Item, { PadUsing { iter: iter.fuse(), @@ -37,8 +38,9 @@ pub fn pad_using(iter: I, min: usize, filler: F) -> PadUsing } impl Iterator for PadUsing - where I: Iterator, - F: FnMut(usize) -> I::Item +where + I: Iterator, + F: FnMut(usize) -> I::Item, { type Item = I::Item; @@ -53,7 +55,7 @@ impl Iterator for PadUsing } else { None } - }, + } e => { self.pos += 1; e @@ -65,11 +67,24 @@ impl Iterator for PadUsing let tail = self.min.saturating_sub(self.pos); size_hint::max(self.iter.size_hint(), (tail, Some(tail))) } + + fn fold(self, mut init: B, mut f: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + let mut pos = self.pos; + init = self.iter.fold(init, |acc, item| { + pos += 1; + f(acc, item) + }); + (pos..self.min).map(self.filler).fold(init, f) + } } impl DoubleEndedIterator for PadUsing - where I: DoubleEndedIterator + ExactSizeIterator, - F: FnMut(usize) -> I::Item +where + I: DoubleEndedIterator + ExactSizeIterator, + F: FnMut(usize) -> I::Item, { fn next_back(&mut self) -> Option { if self.min == 0 { @@ -82,15 +97,28 @@ impl DoubleEndedIterator for PadUsing Some((self.filler)(self.min)) } } + + fn rfold(self, mut init: B, mut f: G) -> B + where + G: FnMut(B, Self::Item) -> B, + { + init = (self.iter.len()..self.min) + .map(self.filler) + .rfold(init, &mut f); + self.iter.rfold(init, f) + } } impl ExactSizeIterator for PadUsing - where I: ExactSizeIterator, - F: FnMut(usize) -> I::Item -{} - +where + I: ExactSizeIterator, + F: FnMut(usize) -> I::Item, +{ +} impl FusedIterator for PadUsing - where I: FusedIterator, - F: FnMut(usize) -> I::Item -{} +where + I: FusedIterator, + F: FnMut(usize) -> I::Item, +{ +} diff --git a/third_party/rust/itertools/src/peek_nth.rs b/third_party/rust/itertools/src/peek_nth.rs index bcca45838eb..b03a3ef5f2a 100644 --- a/third_party/rust/itertools/src/peek_nth.rs +++ b/third_party/rust/itertools/src/peek_nth.rs @@ -5,6 +5,7 @@ use std::iter::Fuse; /// See [`peek_nth()`] for more information. #[derive(Clone, Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct PeekNth where I: Iterator, @@ -34,30 +35,35 @@ impl PeekNth where I: Iterator, { - /// Works exactly like the `peek` method in `std::iter::Peekable` + /// Works exactly like the `peek` method in [`std::iter::Peekable`]. pub fn peek(&mut self) -> Option<&I::Item> { self.peek_nth(0) } + /// Works exactly like the `peek_mut` method in [`std::iter::Peekable`]. + pub fn peek_mut(&mut self) -> Option<&mut I::Item> { + self.peek_nth_mut(0) + } + /// Returns a reference to the `nth` value without advancing the iterator. /// /// # Examples /// /// Basic usage: /// - /// ```rust + /// ``` /// use itertools::peek_nth; /// - /// let xs = vec![1,2,3]; - /// let mut iter = peek_nth(xs.iter()); + /// let xs = vec![1, 2, 3]; + /// let mut iter = peek_nth(xs.into_iter()); /// - /// assert_eq!(iter.peek_nth(0), Some(&&1)); - /// assert_eq!(iter.next(), Some(&1)); + /// assert_eq!(iter.peek_nth(0), Some(&1)); + /// assert_eq!(iter.next(), Some(1)); /// /// // The iterator does not advance even if we call `peek_nth` multiple times - /// assert_eq!(iter.peek_nth(0), Some(&&2)); - /// assert_eq!(iter.peek_nth(1), Some(&&3)); - /// assert_eq!(iter.next(), Some(&2)); + /// assert_eq!(iter.peek_nth(0), Some(&2)); + /// assert_eq!(iter.peek_nth(1), Some(&3)); + /// assert_eq!(iter.next(), Some(2)); /// /// // Calling `peek_nth` past the end of the iterator will return `None` /// assert_eq!(iter.peek_nth(1), None); @@ -69,6 +75,68 @@ where self.buf.get(n) } + + /// Returns a mutable reference to the `nth` value without advancing the iterator. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use itertools::peek_nth; + /// + /// let xs = vec![1, 2, 3, 4, 5]; + /// let mut iter = peek_nth(xs.into_iter()); + /// + /// assert_eq!(iter.peek_nth_mut(0), Some(&mut 1)); + /// assert_eq!(iter.next(), Some(1)); + /// + /// // The iterator does not advance even if we call `peek_nth_mut` multiple times + /// assert_eq!(iter.peek_nth_mut(0), Some(&mut 2)); + /// assert_eq!(iter.peek_nth_mut(1), Some(&mut 3)); + /// assert_eq!(iter.next(), Some(2)); + /// + /// // Peek into the iterator and set the value behind the mutable reference. + /// if let Some(p) = iter.peek_nth_mut(1) { + /// assert_eq!(*p, 4); + /// *p = 9; + /// } + /// + /// // The value we put in reappears as the iterator continues. + /// assert_eq!(iter.next(), Some(3)); + /// assert_eq!(iter.next(), Some(9)); + /// + /// // Calling `peek_nth_mut` past the end of the iterator will return `None` + /// assert_eq!(iter.peek_nth_mut(1), None); + /// ``` + pub fn peek_nth_mut(&mut self, n: usize) -> Option<&mut I::Item> { + let unbuffered_items = (n + 1).saturating_sub(self.buf.len()); + + self.buf.extend(self.iter.by_ref().take(unbuffered_items)); + + self.buf.get_mut(n) + } + + /// Works exactly like the `next_if` method in [`std::iter::Peekable`]. + pub fn next_if(&mut self, func: impl FnOnce(&I::Item) -> bool) -> Option { + match self.next() { + Some(item) if func(&item) => Some(item), + Some(item) => { + self.buf.push_front(item); + None + } + _ => None, + } + } + + /// Works exactly like the `next_if_eq` method in [`std::iter::Peekable`]. + pub fn next_if_eq(&mut self, expected: &T) -> Option + where + T: ?Sized, + I::Item: PartialEq, + { + self.next_if(|next| next == expected) + } } impl Iterator for PeekNth @@ -84,6 +152,14 @@ where fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.buf.len()) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + init = self.buf.into_iter().fold(init, &mut f); + self.iter.fold(init, f) + } } impl ExactSizeIterator for PeekNth where I: ExactSizeIterator {} diff --git a/third_party/rust/itertools/src/peeking_take_while.rs b/third_party/rust/itertools/src/peeking_take_while.rs index b3a9c5ccb46..f3259a91901 100644 --- a/third_party/rust/itertools/src/peeking_take_while.rs +++ b/third_party/rust/itertools/src/peeking_take_while.rs @@ -1,7 +1,8 @@ -use std::iter::Peekable; use crate::PutBack; #[cfg(feature = "use_alloc")] use crate::PutBackN; +use crate::RepeatN; +use std::iter::Peekable; /// An iterator that allows peeking at an element before deciding to accept it. /// @@ -10,20 +11,36 @@ use crate::PutBackN; /// /// This is implemented by peeking adaptors like peekable and put back, /// but also by a few iterators that can be peeked natively, like the slice’s -/// by reference iterator (`std::slice::Iter`). -pub trait PeekingNext : Iterator { +/// by reference iterator ([`std::slice::Iter`]). +pub trait PeekingNext: Iterator { /// Pass a reference to the next iterator element to the closure `accept`; - /// if `accept` returns true, return it as the next element, - /// else None. + /// if `accept` returns `true`, return it as the next element, + /// else `None`. fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool; + where + Self: Sized, + F: FnOnce(&Self::Item) -> bool; +} + +impl PeekingNext for &mut I +where + I: PeekingNext, +{ + fn peeking_next(&mut self, accept: F) -> Option + where + F: FnOnce(&Self::Item) -> bool, + { + (*self).peeking_next(accept) + } } impl PeekingNext for Peekable - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if let Some(r) = self.peek() { if !accept(r) { @@ -35,10 +52,12 @@ impl PeekingNext for Peekable } impl PeekingNext for PutBack - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if let Some(r) = self.next() { if !accept(&r) { @@ -54,10 +73,12 @@ impl PeekingNext for PutBack #[cfg(feature = "use_alloc")] impl PeekingNext for PutBackN - where I: Iterator, +where + I: Iterator, { fn peeking_next(&mut self, accept: F) -> Option - where F: FnOnce(&Self::Item) -> bool + where + F: FnOnce(&Self::Item) -> bool, { if let Some(r) = self.next() { if !accept(&r) { @@ -71,39 +92,51 @@ impl PeekingNext for PutBackN } } +impl PeekingNext for RepeatN { + fn peeking_next(&mut self, accept: F) -> Option + where + F: FnOnce(&Self::Item) -> bool, + { + let r = self.elt.as_ref()?; + if !accept(r) { + return None; + } + self.next() + } +} + /// An iterator adaptor that takes items while a closure returns `true`. /// /// See [`.peeking_take_while()`](crate::Itertools::peeking_take_while) /// for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct PeekingTakeWhile<'a, I: 'a, F> - where I: Iterator, +pub struct PeekingTakeWhile<'a, I, F> +where + I: Iterator + 'a, { iter: &'a mut I, f: F, } -impl<'a, I: 'a, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> +impl<'a, I, F> std::fmt::Debug for PeekingTakeWhile<'a, I, F> where - I: Iterator + std::fmt::Debug, + I: Iterator + std::fmt::Debug + 'a, { debug_fmt_fields!(PeekingTakeWhile, iter); } /// Create a `PeekingTakeWhile` pub fn peeking_take_while(iter: &mut I, f: F) -> PeekingTakeWhile - where I: Iterator, +where + I: Iterator, { - PeekingTakeWhile { - iter, - f, - } + PeekingTakeWhile { iter, f } } -impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> - where I: PeekingNext, - F: FnMut(&I::Item) -> bool, - +impl Iterator for PeekingTakeWhile<'_, I, F> +where + I: PeekingNext, + F: FnMut(&I::Item) -> bool, { type Item = I::Item; fn next(&mut self) -> Option { @@ -115,6 +148,20 @@ impl<'a, I, F> Iterator for PeekingTakeWhile<'a, I, F> } } +impl PeekingNext for PeekingTakeWhile<'_, I, F> +where + I: PeekingNext, + F: FnMut(&I::Item) -> bool, +{ + fn peeking_next(&mut self, g: G) -> Option + where + G: FnOnce(&Self::Item) -> bool, + { + let f = &mut self.f; + self.iter.peeking_next(|r| f(r) && g(r)) + } +} + // Some iterators are so lightweight we can simply clone them to save their // state and use that for peeking. macro_rules! peeking_next_by_clone { @@ -151,4 +198,4 @@ peeking_next_by_clone! { ['a, T] alloc::collections::vec_deque::Iter<'a, T> } // cloning a Rev has no extra overhead; peekable and put backs are never DEI. peeking_next_by_clone! { [I: Clone + PeekingNext + DoubleEndedIterator] - ::std::iter::Rev } +::std::iter::Rev } diff --git a/third_party/rust/itertools/src/permutations.rs b/third_party/rust/itertools/src/permutations.rs index d03b852626c..91389a73a75 100644 --- a/third_party/rust/itertools/src/permutations.rs +++ b/third_party/rust/itertools/src/permutations.rs @@ -1,8 +1,11 @@ +use alloc::boxed::Box; use alloc::vec::Vec; use std::fmt; use std::iter::once; +use std::iter::FusedIterator; use super::lazy_buffer::LazyBuffer; +use crate::size_hint::{self, SizeHint}; /// An iterator adaptor that iterates through all the `k`-permutations of the /// elements from an iterator. @@ -16,262 +19,168 @@ pub struct Permutations { } impl Clone for Permutations - where I: Clone + Iterator, - I::Item: Clone, +where + I: Clone + Iterator, + I::Item: Clone, { clone_fields!(vals, state); } #[derive(Clone, Debug)] enum PermutationState { - StartUnknownLen { - k: usize, + /// No permutation generated yet. + Start { k: usize }, + /// Values from the iterator are not fully loaded yet so `n` is still unknown. + Buffered { k: usize, min_n: usize }, + /// All values from the iterator are known so `n` is known. + Loaded { + indices: Box<[usize]>, + cycles: Box<[usize]>, }, - OngoingUnknownLen { - k: usize, - min_n: usize, - }, - Complete(CompleteState), - Empty, -} - -#[derive(Clone, Debug)] -enum CompleteState { - Start { - n: usize, - k: usize, - }, - Ongoing { - indices: Vec, - cycles: Vec, - } -} - -enum CompleteStateRemaining { - Known(usize), - Overflow, + /// No permutation left to generate. + End, } impl fmt::Debug for Permutations - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, { debug_fmt_fields!(Permutations, vals, state); } pub fn permutations(iter: I, k: usize) -> Permutations { - let mut vals = LazyBuffer::new(iter); - - if k == 0 { - // Special case, yields single empty vec; `n` is irrelevant - let state = PermutationState::Complete(CompleteState::Start { n: 0, k: 0 }); - - return Permutations { - vals, - state - }; - } - - let mut enough_vals = true; - - while vals.len() < k { - if !vals.get_next() { - enough_vals = false; - break; - } - } - - let state = if enough_vals { - PermutationState::StartUnknownLen { k } - } else { - PermutationState::Empty - }; - Permutations { - vals, - state + vals: LazyBuffer::new(iter), + state: PermutationState::Start { k }, } } impl Iterator for Permutations where I: Iterator, - I::Item: Clone + I::Item: Clone, { type Item = Vec; fn next(&mut self) -> Option { - self.advance(); - - let &mut Permutations { ref vals, ref state } = self; - - match *state { - PermutationState::StartUnknownLen { .. } => panic!("unexpected iterator state"), - PermutationState::OngoingUnknownLen { k, min_n } => { - let latest_idx = min_n - 1; - let indices = (0..(k - 1)).chain(once(latest_idx)); - - Some(indices.map(|i| vals[i].clone()).collect()) + let Self { vals, state } = self; + match state { + PermutationState::Start { k: 0 } => { + *state = PermutationState::End; + Some(Vec::new()) } - PermutationState::Complete(CompleteState::Ongoing { ref indices, ref cycles }) => { + &mut PermutationState::Start { k } => { + vals.prefill(k); + if vals.len() != k { + *state = PermutationState::End; + return None; + } + *state = PermutationState::Buffered { k, min_n: k }; + Some(vals[0..k].to_vec()) + } + PermutationState::Buffered { ref k, min_n } => { + if vals.get_next() { + let item = (0..*k - 1) + .chain(once(*min_n)) + .map(|i| vals[i].clone()) + .collect(); + *min_n += 1; + Some(item) + } else { + let n = *min_n; + let prev_iteration_count = n - *k + 1; + let mut indices: Box<[_]> = (0..n).collect(); + let mut cycles: Box<[_]> = (n - k..n).rev().collect(); + // Advance the state to the correct point. + for _ in 0..prev_iteration_count { + if advance(&mut indices, &mut cycles) { + *state = PermutationState::End; + return None; + } + } + let item = vals.get_at(&indices[0..*k]); + *state = PermutationState::Loaded { indices, cycles }; + Some(item) + } + } + PermutationState::Loaded { indices, cycles } => { + if advance(indices, cycles) { + *state = PermutationState::End; + return None; + } let k = cycles.len(); - Some(indices[0..k].iter().map(|&i| vals[i].clone()).collect()) - }, - PermutationState::Complete(CompleteState::Start { .. }) | PermutationState::Empty => None + Some(vals.get_at(&indices[0..k])) + } + PermutationState::End => None, } } fn count(self) -> usize { - fn from_complete(complete_state: CompleteState) -> usize { - match complete_state.remaining() { - CompleteStateRemaining::Known(count) => count, - CompleteStateRemaining::Overflow => { - panic!("Iterator count greater than usize::MAX"); - } - } - } - - let Permutations { vals, state } = self; - match state { - PermutationState::StartUnknownLen { k } => { - let n = vals.len() + vals.it.count(); - let complete_state = CompleteState::Start { n, k }; - - from_complete(complete_state) - } - PermutationState::OngoingUnknownLen { k, min_n } => { - let prev_iteration_count = min_n - k + 1; - let n = vals.len() + vals.it.count(); - let complete_state = CompleteState::Start { n, k }; - - from_complete(complete_state) - prev_iteration_count - }, - PermutationState::Complete(state) => from_complete(state), - PermutationState::Empty => 0 - } + let Self { vals, state } = self; + let n = vals.count(); + state.size_hint_for(n).1.unwrap() } - fn size_hint(&self) -> (usize, Option) { - match self.state { - PermutationState::StartUnknownLen { .. } | - PermutationState::OngoingUnknownLen { .. } => (0, None), // TODO can we improve this lower bound? - PermutationState::Complete(ref state) => match state.remaining() { - CompleteStateRemaining::Known(count) => (count, Some(count)), - CompleteStateRemaining::Overflow => (::std::usize::MAX, None) - } - PermutationState::Empty => (0, Some(0)) - } + fn size_hint(&self) -> SizeHint { + let (mut low, mut upp) = self.vals.size_hint(); + low = self.state.size_hint_for(low).0; + upp = upp.and_then(|n| self.state.size_hint_for(n).1); + (low, upp) } } -impl Permutations +impl FusedIterator for Permutations where I: Iterator, - I::Item: Clone + I::Item: Clone, { - fn advance(&mut self) { - let &mut Permutations { ref mut vals, ref mut state } = self; +} - *state = match *state { - PermutationState::StartUnknownLen { k } => { - PermutationState::OngoingUnknownLen { k, min_n: k } - } - PermutationState::OngoingUnknownLen { k, min_n } => { - if vals.get_next() { - PermutationState::OngoingUnknownLen { k, min_n: min_n + 1 } - } else { - let n = min_n; - let prev_iteration_count = n - k + 1; - let mut complete_state = CompleteState::Start { n, k }; +fn advance(indices: &mut [usize], cycles: &mut [usize]) -> bool { + let n = indices.len(); + let k = cycles.len(); + // NOTE: if `cycles` are only zeros, then we reached the last permutation. + for i in (0..k).rev() { + if cycles[i] == 0 { + cycles[i] = n - i - 1; + indices[i..].rotate_left(1); + } else { + let swap_index = n - cycles[i]; + indices.swap(i, swap_index); + cycles[i] -= 1; + return false; + } + } + true +} - // Advance the complete-state iterator to the correct point - for _ in 0..(prev_iteration_count + 1) { - complete_state.advance(); - } - - PermutationState::Complete(complete_state) - } - } - PermutationState::Complete(ref mut state) => { - state.advance(); - - return; - } - PermutationState::Empty => { return; } +impl PermutationState { + fn size_hint_for(&self, n: usize) -> SizeHint { + // At the beginning, there are `n!/(n-k)!` items to come. + let at_start = |n, k| { + debug_assert!(n >= k); + let total = (n - k + 1..=n).try_fold(1usize, |acc, i| acc.checked_mul(i)); + (total.unwrap_or(usize::MAX), total) }; - } -} - -impl CompleteState { - fn advance(&mut self) { - *self = match *self { - CompleteState::Start { n, k } => { - let indices = (0..n).collect(); - let cycles = ((n - k)..n).rev().collect(); - - CompleteState::Ongoing { - cycles, - indices - } - }, - CompleteState::Ongoing { ref mut indices, ref mut cycles } => { - let n = indices.len(); - let k = cycles.len(); - - for i in (0..k).rev() { - if cycles[i] == 0 { - cycles[i] = n - i - 1; - - let to_push = indices.remove(i); - indices.push(to_push); - } else { - let swap_index = n - cycles[i]; - indices.swap(i, swap_index); - - cycles[i] -= 1; - return; - } - } - - CompleteState::Start { n, k } - } - } - } - - fn remaining(&self) -> CompleteStateRemaining { - use self::CompleteStateRemaining::{Known, Overflow}; - match *self { - CompleteState::Start { n, k } => { - if n < k { - return Known(0); - } - - let count: Option = (n - k + 1..n + 1).fold(Some(1), |acc, i| { - acc.and_then(|acc| acc.checked_mul(i)) + Self::Start { k } if n < k => (0, Some(0)), + Self::Start { k } => at_start(n, k), + Self::Buffered { k, min_n } => { + // Same as `Start` minus the previously generated items. + size_hint::sub_scalar(at_start(n, k), min_n - k + 1) + } + Self::Loaded { + ref indices, + ref cycles, + } => { + let count = cycles.iter().enumerate().try_fold(0usize, |acc, (i, &c)| { + acc.checked_mul(indices.len() - i) + .and_then(|count| count.checked_add(c)) }); - - match count { - Some(count) => Known(count), - None => Overflow - } - } - CompleteState::Ongoing { ref indices, ref cycles } => { - let mut count: usize = 0; - - for (i, &c) in cycles.iter().enumerate() { - let radix = indices.len() - i; - let next_count = count.checked_mul(radix) - .and_then(|count| count.checked_add(c)); - - count = match next_count { - Some(count) => count, - None => { return Overflow; } - }; - } - - Known(count) + (count.unwrap_or(usize::MAX), count) } + Self::End => (0, Some(0)), } } } diff --git a/third_party/rust/itertools/src/powerset.rs b/third_party/rust/itertools/src/powerset.rs index 4d7685b12a8..734eaf6149a 100644 --- a/third_party/rust/itertools/src/powerset.rs +++ b/third_party/rust/itertools/src/powerset.rs @@ -1,10 +1,10 @@ +use alloc::vec::Vec; use std::fmt; use std::iter::FusedIterator; -use std::usize; -use alloc::vec::Vec; -use super::combinations::{Combinations, combinations}; -use super::size_hint; +use super::combinations::{combinations, Combinations}; +use crate::adaptors::checked_binomial; +use crate::size_hint::{self, SizeHint}; /// An iterator to iterate through the powerset of the elements from an iterator. /// @@ -13,78 +13,119 @@ use super::size_hint; #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Powerset { combs: Combinations, - // Iterator `position` (equal to count of yielded elements). - pos: usize, } impl Clone for Powerset - where I: Clone + Iterator, - I::Item: Clone, +where + I: Clone + Iterator, + I::Item: Clone, { - clone_fields!(combs, pos); + clone_fields!(combs); } impl fmt::Debug for Powerset - where I: Iterator + fmt::Debug, - I::Item: fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: fmt::Debug, { - debug_fmt_fields!(Powerset, combs, pos); + debug_fmt_fields!(Powerset, combs); } /// Create a new `Powerset` from a clonable iterator. pub fn powerset(src: I) -> Powerset - where I: Iterator, - I::Item: Clone, +where + I: Iterator, + I::Item: Clone, { Powerset { combs: combinations(src, 0), - pos: 0, + } +} + +impl Powerset { + /// Returns true if `k` has been incremented, false otherwise. + fn increment_k(&mut self) -> bool { + if self.combs.k() < self.combs.n() || self.combs.k() == 0 { + self.combs.reset(self.combs.k() + 1); + true + } else { + false + } } } impl Iterator for Powerset - where - I: Iterator, - I::Item: Clone, +where + I: Iterator, + I::Item: Clone, { type Item = Vec; fn next(&mut self) -> Option { if let Some(elt) = self.combs.next() { - self.pos = self.pos.saturating_add(1); Some(elt) - } else if self.combs.k() < self.combs.n() - || self.combs.k() == 0 - { - self.combs.reset(self.combs.k() + 1); - self.combs.next().map(|elt| { - self.pos = self.pos.saturating_add(1); - elt - }) + } else if self.increment_k() { + self.combs.next() } else { None } } - fn size_hint(&self) -> (usize, Option) { - // Total bounds for source iterator. - let src_total = size_hint::add_scalar(self.combs.src().size_hint(), self.combs.n()); - - // Total bounds for self ( length(powerset(set) == 2 ^ length(set) ) - let self_total = size_hint::pow_scalar_base(2, src_total); - - if self.pos < usize::MAX { - // Subtract count of elements already yielded from total. - size_hint::sub_scalar(self_total, self.pos) - } else { - // Fallback: self.pos is saturated and no longer reliable. - (0, self_total.1) + fn nth(&mut self, mut n: usize) -> Option { + loop { + match self.combs.try_nth(n) { + Ok(item) => return Some(item), + Err(steps) => { + if !self.increment_k() { + return None; + } + n -= steps; + } + } } } + + fn size_hint(&self) -> SizeHint { + let k = self.combs.k(); + // Total bounds for source iterator. + let (n_min, n_max) = self.combs.src().size_hint(); + let low = remaining_for(n_min, k).unwrap_or(usize::MAX); + let upp = n_max.and_then(|n| remaining_for(n, k)); + size_hint::add(self.combs.size_hint(), (low, upp)) + } + + fn count(self) -> usize { + let k = self.combs.k(); + let (n, combs_count) = self.combs.n_and_count(); + combs_count + remaining_for(n, k).unwrap() + } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let mut it = self.combs; + if it.k() == 0 { + init = it.by_ref().fold(init, &mut f); + it.reset(1); + } + init = it.by_ref().fold(init, &mut f); + // n is now known for sure because k >= 1 and all k-combinations have been generated. + for k in it.k() + 1..=it.n() { + it.reset(k); + init = it.by_ref().fold(init, &mut f); + } + init + } } impl FusedIterator for Powerset - where - I: Iterator, - I::Item: Clone, -{} +where + I: Iterator, + I::Item: Clone, +{ +} + +fn remaining_for(n: usize, k: usize) -> Option { + (k + 1..=n).try_fold(0usize, |sum, i| sum.checked_add(checked_binomial(n, i)?)) +} diff --git a/third_party/rust/itertools/src/process_results_impl.rs b/third_party/rust/itertools/src/process_results_impl.rs index 44308f37809..31389c5fda8 100644 --- a/third_party/rust/itertools/src/process_results_impl.rs +++ b/third_party/rust/itertools/src/process_results_impl.rs @@ -1,3 +1,5 @@ +#[cfg(doc)] +use crate::Itertools; /// An iterator that produces only the `T` values as long as the /// inner iterator produces `Ok(T)`. @@ -11,13 +13,10 @@ pub struct ProcessResults<'a, I, E: 'a> { iter: I, } -impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> - where I: Iterator> -{ - type Item = T; - - fn next(&mut self) -> Option { - match self.iter.next() { +impl ProcessResults<'_, I, E> { + #[inline(always)] + fn next_body(&mut self, item: Option>) -> Option { + match item { Some(Ok(x)) => Some(x), Some(Err(e)) => { *self.error = Err(e); @@ -26,6 +25,18 @@ impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> None => None, } } +} + +impl Iterator for ProcessResults<'_, I, E> +where + I: Iterator>, +{ + type Item = T; + + fn next(&mut self) -> Option { + let item = self.iter.next(); + self.next_body(item) + } fn size_hint(&self) -> (usize, Option) { (0, self.iter.size_hint().1) @@ -49,49 +60,49 @@ impl<'a, I, T, E> Iterator for ProcessResults<'a, I, E> } } +impl DoubleEndedIterator for ProcessResults<'_, I, E> +where + I: Iterator>, + I: DoubleEndedIterator, +{ + fn next_back(&mut self) -> Option { + let item = self.iter.next_back(); + self.next_body(item) + } + + fn rfold(mut self, init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let error = self.error; + self.iter + .try_rfold(init, |acc, opt| match opt { + Ok(x) => Ok(f(acc, x)), + Err(e) => { + *error = Err(e); + Err(acc) + } + }) + .unwrap_or_else(|e| e) + } +} + /// “Lift” a function of the values of an iterator so that it can process /// an iterator of `Result` values instead. /// -/// `iterable` is an iterator or iterable with `Result` elements, where -/// `T` is the value type and `E` the error type. -/// -/// `processor` is a closure that receives an adapted version of the iterable -/// as the only argument — the adapted iterator produces elements of type `T`, -/// as long as the original iterator produces `Ok` values. -/// -/// If the original iterable produces an error at any point, the adapted -/// iterator ends and the `process_results` function will return the -/// error iself. -/// -/// Otherwise, the return value from the closure is returned wrapped -/// inside `Ok`. -/// -/// # Example -/// -/// ``` -/// use itertools::process_results; -/// -/// type R = Result; -/// -/// let first_values: Vec = vec![Ok(1), Ok(0), Ok(3)]; -/// let second_values: Vec = vec![Ok(2), Ok(1), Err("overflow")]; -/// -/// // “Lift” the iterator .max() method to work on the values in Results using process_results -/// -/// let first_max = process_results(first_values, |iter| iter.max().unwrap_or(0)); -/// let second_max = process_results(second_values, |iter| iter.max().unwrap_or(0)); -/// -/// assert_eq!(first_max, Ok(3)); -/// assert!(second_max.is_err()); -/// ``` +/// [`IntoIterator`] enabled version of [`Itertools::process_results`]. pub fn process_results(iterable: I, processor: F) -> Result - where I: IntoIterator>, - F: FnOnce(ProcessResults) -> R +where + I: IntoIterator>, + F: FnOnce(ProcessResults) -> R, { let iter = iterable.into_iter(); let mut error = Ok(()); - let result = processor(ProcessResults { error: &mut error, iter }); + let result = processor(ProcessResults { + error: &mut error, + iter, + }); error.map(|_| result) } diff --git a/third_party/rust/itertools/src/put_back_n_impl.rs b/third_party/rust/itertools/src/put_back_n_impl.rs index 60ea8e64950..a9eb4179c49 100644 --- a/third_party/rust/itertools/src/put_back_n_impl.rs +++ b/third_party/rust/itertools/src/put_back_n_impl.rs @@ -7,6 +7,7 @@ use crate::size_hint; /// /// Iterator element type is `I::Item`. #[derive(Debug, Clone)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct PutBackN { top: Vec, iter: I, @@ -17,7 +18,8 @@ pub struct PutBackN { /// /// Iterator element type is `I::Item`. pub fn put_back_n(iterable: I) -> PutBackN - where I: IntoIterator +where + I: IntoIterator, { PutBackN { top: Vec::new(), @@ -26,7 +28,8 @@ pub fn put_back_n(iterable: I) -> PutBackN } impl PutBackN { - /// Puts x in front of the iterator. + /// Puts `x` in front of the iterator. + /// /// The values are yielded in order of the most recently put back /// values first. /// @@ -57,5 +60,12 @@ impl Iterator for PutBackN { fn size_hint(&self) -> (usize, Option) { size_hint::add_scalar(self.iter.size_hint(), self.top.len()) } -} + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + init = self.top.into_iter().rfold(init, &mut f); + self.iter.fold(init, f) + } +} diff --git a/third_party/rust/itertools/src/rciter_impl.rs b/third_party/rust/itertools/src/rciter_impl.rs index 7298350a881..96a0fd69c5b 100644 --- a/third_party/rust/itertools/src/rciter_impl.rs +++ b/third_party/rust/itertools/src/rciter_impl.rs @@ -1,10 +1,10 @@ - -use std::iter::{FusedIterator, IntoIterator}; use alloc::rc::Rc; use std::cell::RefCell; +use std::iter::{FusedIterator, IntoIterator}; /// A wrapper for `Rc>`, that implements the `Iterator` trait. #[derive(Debug)] +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct RcIter { /// The boxed iterator. pub rciter: Rc>, @@ -45,9 +45,12 @@ pub struct RcIter { /// `.next()`, i.e. if it somehow participates in an “iterator knot” /// where it is an adaptor of itself. pub fn rciter(iterable: I) -> RcIter - where I: IntoIterator +where + I: IntoIterator, { - RcIter { rciter: Rc::new(RefCell::new(iterable.into_iter())) } + RcIter { + rciter: Rc::new(RefCell::new(iterable.into_iter())), + } } impl Clone for RcIter { @@ -55,7 +58,8 @@ impl Clone for RcIter { } impl Iterator for RcIter - where I: Iterator +where + I: Iterator, { type Item = A; #[inline] @@ -73,7 +77,8 @@ impl Iterator for RcIter } impl DoubleEndedIterator for RcIter - where I: DoubleEndedIterator +where + I: DoubleEndedIterator, { #[inline] fn next_back(&mut self) -> Option { @@ -82,8 +87,9 @@ impl DoubleEndedIterator for RcIter } /// Return an iterator from `&RcIter` (by simply cloning it). -impl<'a, I> IntoIterator for &'a RcIter - where I: Iterator +impl IntoIterator for &RcIter +where + I: Iterator, { type Item = I::Item; type IntoIter = RcIter; @@ -93,7 +99,4 @@ impl<'a, I> IntoIterator for &'a RcIter } } - -impl FusedIterator for RcIter - where I: FusedIterator -{} +impl FusedIterator for RcIter where I: FusedIterator {} diff --git a/third_party/rust/itertools/src/repeatn.rs b/third_party/rust/itertools/src/repeatn.rs index e025f6f6a58..d86ad9facd3 100644 --- a/third_party/rust/itertools/src/repeatn.rs +++ b/third_party/rust/itertools/src/repeatn.rs @@ -6,23 +6,28 @@ use std::iter::FusedIterator; #[must_use = "iterators are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct RepeatN { - elt: Option, + pub(crate) elt: Option, n: usize, } /// Create an iterator that produces `n` repetitions of `element`. pub fn repeat_n(element: A, n: usize) -> RepeatN - where A: Clone, +where + A: Clone, { if n == 0 { - RepeatN { elt: None, n, } + RepeatN { elt: None, n } } else { - RepeatN { elt: Some(element), n, } + RepeatN { + elt: Some(element), + n, + } } } impl Iterator for RepeatN - where A: Clone +where + A: Clone, { type Item = A; @@ -39,21 +44,40 @@ impl Iterator for RepeatN fn size_hint(&self) -> (usize, Option) { (self.n, Some(self.n)) } + + fn fold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + match self { + Self { elt: Some(elt), n } => { + debug_assert!(n > 0); + init = (1..n).map(|_| elt.clone()).fold(init, &mut f); + f(init, elt) + } + _ => init, + } + } } impl DoubleEndedIterator for RepeatN - where A: Clone +where + A: Clone, { #[inline] fn next_back(&mut self) -> Option { self.next() } + + #[inline] + fn rfold(self, init: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + self.fold(init, f) + } } -impl ExactSizeIterator for RepeatN - where A: Clone -{} +impl ExactSizeIterator for RepeatN where A: Clone {} -impl FusedIterator for RepeatN - where A: Clone -{} +impl FusedIterator for RepeatN where A: Clone {} diff --git a/third_party/rust/itertools/src/size_hint.rs b/third_party/rust/itertools/src/size_hint.rs index 71ea1412b53..6cfead7f2b4 100644 --- a/third_party/rust/itertools/src/size_hint.rs +++ b/third_party/rust/itertools/src/size_hint.rs @@ -1,9 +1,7 @@ //! Arithmetic on `Iterator.size_hint()` values. //! -use std::usize; use std::cmp; -use std::u32; /// `SizeHint` is the return type of `Iterator::size_hint()`. pub type SizeHint = (usize, Option); @@ -31,7 +29,6 @@ pub fn add_scalar(sh: SizeHint, x: usize) -> SizeHint { /// Subtract `x` correctly from a `SizeHint`. #[inline] -#[allow(dead_code)] pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint { let (mut low, mut hi) = sh; low = low.saturating_sub(x); @@ -39,22 +36,7 @@ pub fn sub_scalar(sh: SizeHint, x: usize) -> SizeHint { (low, hi) } - /// Multiply `SizeHint` correctly -/// -/// ```ignore -/// use std::usize; -/// use itertools::size_hint; -/// -/// assert_eq!(size_hint::mul((3, Some(4)), (3, Some(4))), -/// (9, Some(16))); -/// -/// assert_eq!(size_hint::mul((3, Some(4)), (usize::MAX, None)), -/// (usize::MAX, None)); -/// -/// assert_eq!(size_hint::mul((3, None), (0, Some(0))), -/// (0, Some(0))); -/// ``` #[inline] pub fn mul(a: SizeHint, b: SizeHint) -> SizeHint { let low = a.0.saturating_mul(b.0); @@ -75,20 +57,6 @@ pub fn mul_scalar(sh: SizeHint, x: usize) -> SizeHint { (low, hi) } -/// Raise `base` correctly by a `SizeHint` exponent. -#[inline] -pub fn pow_scalar_base(base: usize, exp: SizeHint) -> SizeHint { - let exp_low = cmp::min(exp.0, u32::MAX as usize) as u32; - let low = base.saturating_pow(exp_low); - - let hi = exp.1.and_then(|exp| { - let exp_hi = cmp::min(exp, u32::MAX as usize) as u32; - base.checked_pow(exp_hi) - }); - - (low, hi) -} - /// Return the maximum #[inline] pub fn max(a: SizeHint, b: SizeHint) -> SizeHint { @@ -117,3 +85,10 @@ pub fn min(a: SizeHint, b: SizeHint) -> SizeHint { }; (lower, upper) } + +#[test] +fn mul_size_hints() { + assert_eq!(mul((3, Some(4)), (3, Some(4))), (9, Some(16))); + assert_eq!(mul((3, Some(4)), (usize::MAX, None)), (usize::MAX, None)); + assert_eq!(mul((3, None), (0, Some(0))), (0, Some(0))); +} diff --git a/third_party/rust/itertools/src/sources.rs b/third_party/rust/itertools/src/sources.rs index 3877ce3c8b3..c405ffdc719 100644 --- a/third_party/rust/itertools/src/sources.rs +++ b/third_party/rust/itertools/src/sources.rs @@ -5,62 +5,6 @@ use std::fmt; use std::mem; -/// See [`repeat_call`](crate::repeat_call) for more information. -#[derive(Clone)] -#[deprecated(note="Use std repeat_with() instead", since="0.8.0")] -pub struct RepeatCall { - f: F, -} - -impl fmt::Debug for RepeatCall -{ - debug_fmt_fields!(RepeatCall, ); -} - -/// An iterator source that produces elements indefinitely by calling -/// a given closure. -/// -/// Iterator element type is the return type of the closure. -/// -/// ``` -/// use itertools::repeat_call; -/// use itertools::Itertools; -/// use std::collections::BinaryHeap; -/// -/// let mut heap = BinaryHeap::from(vec![2, 5, 3, 7, 8]); -/// -/// // extract each element in sorted order -/// for element in repeat_call(|| heap.pop()).while_some() { -/// print!("{}", element); -/// } -/// -/// itertools::assert_equal( -/// repeat_call(|| 1).take(5), -/// vec![1, 1, 1, 1, 1] -/// ); -/// ``` -#[deprecated(note="Use std repeat_with() instead", since="0.8.0")] -pub fn repeat_call(function: F) -> RepeatCall - where F: FnMut() -> A -{ - RepeatCall { f: function } -} - -impl Iterator for RepeatCall - where F: FnMut() -> A -{ - type Item = A; - - #[inline] - fn next(&mut self) -> Option { - Some((self.f)()) - } - - fn size_hint(&self) -> (usize, Option) { - (usize::max_value(), None) - } -} - /// Creates a new unfold source with the specified closure as the "iterator /// function" and an initial state to eventually pass to the closure /// @@ -97,8 +41,13 @@ impl Iterator for RepeatCall /// vec![1, 1, 2, 3, 5, 8, 13, 21]); /// assert_eq!(fibonacci.last(), Some(2_971_215_073)) /// ``` +#[deprecated( + note = "Use [std::iter::from_fn](https://doc.rust-lang.org/std/iter/fn.from_fn.html) instead", + since = "0.13.0" +)] pub fn unfold(initial_state: St, f: F) -> Unfold - where F: FnMut(&mut St) -> Option +where + F: FnMut(&mut St) -> Option, { Unfold { f, @@ -107,7 +56,8 @@ pub fn unfold(initial_state: St, f: F) -> Unfold } impl fmt::Debug for Unfold - where St: fmt::Debug, +where + St: fmt::Debug, { debug_fmt_fields!(Unfold, state); } @@ -115,6 +65,10 @@ impl fmt::Debug for Unfold /// See [`unfold`](crate::unfold) for more information. #[derive(Clone)] #[must_use = "iterators are lazy and do nothing unless consumed"] +#[deprecated( + note = "Use [std::iter::FromFn](https://doc.rust-lang.org/std/iter/struct.FromFn.html) instead", + since = "0.13.0" +)] pub struct Unfold { f: F, /// Internal state that will be passed to the closure on the next iteration @@ -122,7 +76,8 @@ pub struct Unfold { } impl Iterator for Unfold - where F: FnMut(&mut St) -> Option +where + F: FnMut(&mut St) -> Option, { type Item = A; @@ -144,13 +99,15 @@ pub struct Iterate { } impl fmt::Debug for Iterate - where St: fmt::Debug, +where + St: fmt::Debug, { debug_fmt_fields!(Iterate, state); } impl Iterator for Iterate - where F: FnMut(&St) -> St +where + F: FnMut(&St) -> St, { type Item = St; @@ -162,7 +119,7 @@ impl Iterator for Iterate #[inline] fn size_hint(&self) -> (usize, Option) { - (usize::max_value(), None) + (usize::MAX, None) } } @@ -171,10 +128,23 @@ impl Iterator for Iterate /// ``` /// use itertools::iterate; /// -/// itertools::assert_equal(iterate(1, |&i| i * 3).take(5), vec![1, 3, 9, 27, 81]); +/// itertools::assert_equal(iterate(1, |i| i % 3 + 1).take(5), vec![1, 2, 3, 1, 2]); /// ``` +/// +/// **Panics** if compute the next value does. +/// +/// ```should_panic +/// # use itertools::iterate; +/// let mut it = iterate(25u32, |x| x - 10).take_while(|&x| x > 10); +/// assert_eq!(it.next(), Some(25)); // `Iterate` holds 15. +/// assert_eq!(it.next(), Some(15)); // `Iterate` holds 5. +/// it.next(); // `5 - 10` overflows. +/// ``` +/// +/// You can alternatively use [`core::iter::successors`] as it better describes a finite iterator. pub fn iterate(initial_value: St, f: F) -> Iterate - where F: FnMut(&St) -> St +where + F: FnMut(&St) -> St, { Iterate { state: initial_value, diff --git a/third_party/rust/itertools/src/take_while_inclusive.rs b/third_party/rust/itertools/src/take_while_inclusive.rs new file mode 100644 index 00000000000..420da9847af --- /dev/null +++ b/third_party/rust/itertools/src/take_while_inclusive.rs @@ -0,0 +1,96 @@ +use core::iter::FusedIterator; +use std::fmt; + +/// An iterator adaptor that consumes elements while the given predicate is +/// `true`, including the element for which the predicate first returned +/// `false`. +/// +/// See [`.take_while_inclusive()`](crate::Itertools::take_while_inclusive) +/// for more information. +#[must_use = "iterator adaptors are lazy and do nothing unless consumed"] +#[derive(Clone)] +pub struct TakeWhileInclusive { + iter: I, + predicate: F, + done: bool, +} + +impl TakeWhileInclusive +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ + /// Create a new [`TakeWhileInclusive`] from an iterator and a predicate. + pub(crate) fn new(iter: I, predicate: F) -> Self { + Self { + iter, + predicate, + done: false, + } + } +} + +impl fmt::Debug for TakeWhileInclusive +where + I: Iterator + fmt::Debug, +{ + debug_fmt_fields!(TakeWhileInclusive, iter, done); +} + +impl Iterator for TakeWhileInclusive +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ + type Item = I::Item; + + fn next(&mut self) -> Option { + if self.done { + None + } else { + self.iter.next().map(|item| { + if !(self.predicate)(&item) { + self.done = true; + } + item + }) + } + } + + fn size_hint(&self) -> (usize, Option) { + if self.done { + (0, Some(0)) + } else { + (0, self.iter.size_hint().1) + } + } + + fn fold(mut self, init: B, mut f: Fold) -> B + where + Fold: FnMut(B, Self::Item) -> B, + { + if self.done { + init + } else { + let predicate = &mut self.predicate; + self.iter + .try_fold(init, |mut acc, item| { + let is_ok = predicate(&item); + acc = f(acc, item); + if is_ok { + Ok(acc) + } else { + Err(acc) + } + }) + .unwrap_or_else(|err| err) + } + } +} + +impl FusedIterator for TakeWhileInclusive +where + I: Iterator, + F: FnMut(&I::Item) -> bool, +{ +} diff --git a/third_party/rust/itertools/src/tee.rs b/third_party/rust/itertools/src/tee.rs index ea4752906f0..0984c5de963 100644 --- a/third_party/rust/itertools/src/tee.rs +++ b/third_party/rust/itertools/src/tee.rs @@ -1,8 +1,8 @@ use super::size_hint; -use std::cell::RefCell; use alloc::collections::VecDeque; use alloc::rc::Rc; +use std::cell::RefCell; /// Common buffer object for the two tee halves #[derive(Debug)] @@ -19,24 +19,37 @@ struct TeeBuffer { #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Debug)] pub struct Tee - where I: Iterator +where + I: Iterator, { rcbuffer: Rc>>, id: bool, } pub fn new(iter: I) -> (Tee, Tee) - where I: Iterator +where + I: Iterator, { - let buffer = TeeBuffer{backlog: VecDeque::new(), iter, owner: false}; - let t1 = Tee{rcbuffer: Rc::new(RefCell::new(buffer)), id: true}; - let t2 = Tee{rcbuffer: t1.rcbuffer.clone(), id: false}; + let buffer = TeeBuffer { + backlog: VecDeque::new(), + iter, + owner: false, + }; + let t1 = Tee { + rcbuffer: Rc::new(RefCell::new(buffer)), + id: true, + }; + let t2 = Tee { + rcbuffer: t1.rcbuffer.clone(), + id: false, + }; (t1, t2) } impl Iterator for Tee - where I: Iterator, - I::Item: Clone +where + I: Iterator, + I::Item: Clone, { type Item = I::Item; fn next(&mut self) -> Option { @@ -73,6 +86,8 @@ impl Iterator for Tee } impl ExactSizeIterator for Tee - where I: ExactSizeIterator, - I::Item: Clone -{} +where + I: ExactSizeIterator, + I::Item: Clone, +{ +} diff --git a/third_party/rust/itertools/src/tuple_impl.rs b/third_party/rust/itertools/src/tuple_impl.rs index 06b5c13cb34..c0d556fc95b 100644 --- a/third_party/rust/itertools/src/tuple_impl.rs +++ b/third_party/rust/itertools/src/tuple_impl.rs @@ -1,10 +1,10 @@ //! Some iterator that produces tuples +use std::iter::Cycle; use std::iter::Fuse; use std::iter::FusedIterator; -use std::iter::Take; -use std::iter::Cycle; -use std::marker::PhantomData; + +use crate::size_hint; // `HomogeneousTuple` is a public facade for `TupleCollect`, allowing // tuple-related methods to be used by clients in generic contexts, while @@ -12,9 +12,7 @@ use std::marker::PhantomData; // See https://github.com/rust-itertools/itertools/issues/387 /// Implemented for homogeneous tuples of size up to 12. -pub trait HomogeneousTuple - : TupleCollect -{} +pub trait HomogeneousTuple: TupleCollect {} impl HomogeneousTuple for T {} @@ -24,25 +22,25 @@ impl HomogeneousTuple for T {} /// [`Tuples::into_buffer()`]. #[derive(Clone, Debug)] pub struct TupleBuffer - where T: HomogeneousTuple +where + T: HomogeneousTuple, { cur: usize, buf: T::Buffer, } impl TupleBuffer - where T: HomogeneousTuple +where + T: HomogeneousTuple, { fn new(buf: T::Buffer) -> Self { - TupleBuffer { - cur: 0, - buf, - } + Self { cur: 0, buf } } } impl Iterator for TupleBuffer - where T: HomogeneousTuple +where + T: HomogeneousTuple, { type Item = T::Item; @@ -61,18 +59,16 @@ impl Iterator for TupleBuffer let len = if buffer.is_empty() { 0 } else { - buffer.iter() - .position(|x| x.is_none()) - .unwrap_or_else(|| buffer.len()) + buffer + .iter() + .position(|x| x.is_none()) + .unwrap_or(buffer.len()) }; (len, Some(len)) } } -impl ExactSizeIterator for TupleBuffer - where T: HomogeneousTuple -{ -} +impl ExactSizeIterator for TupleBuffer where T: HomogeneousTuple {} /// An iterator that groups the items in tuples of a specific size. /// @@ -80,8 +76,9 @@ impl ExactSizeIterator for TupleBuffer #[derive(Clone, Debug)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { iter: Fuse, buf: T::Buffer, @@ -89,8 +86,9 @@ pub struct Tuples /// Create a new tuples iterator. pub fn tuples(iter: I) -> Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { Tuples { iter: iter.fuse(), @@ -99,19 +97,50 @@ pub fn tuples(iter: I) -> Tuples } impl Iterator for Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { type Item = T; fn next(&mut self) -> Option { T::collect_from_iter(&mut self.iter, &mut self.buf) } + + fn size_hint(&self) -> (usize, Option) { + // The number of elts we've drawn from the underlying iterator, but have + // not yet produced as a tuple. + let buffered = T::buffer_len(&self.buf); + // To that, we must add the size estimates of the underlying iterator. + let (unbuffered_lo, unbuffered_hi) = self.iter.size_hint(); + // The total low estimate is the sum of the already-buffered elements, + // plus the low estimate of remaining unbuffered elements, divided by + // the tuple size. + let total_lo = add_then_div(unbuffered_lo, buffered, T::num_items()).unwrap_or(usize::MAX); + // And likewise for the total high estimate, but using the high estimate + // of the remaining unbuffered elements. + let total_hi = unbuffered_hi.and_then(|hi| add_then_div(hi, buffered, T::num_items())); + (total_lo, total_hi) + } +} + +/// `(n + a) / d` avoiding overflow when possible, returns `None` if it overflows. +fn add_then_div(n: usize, a: usize, d: usize) -> Option { + debug_assert_ne!(d, 0); + (n / d).checked_add(a / d)?.checked_add((n % d + a % d) / d) +} + +impl ExactSizeIterator for Tuples +where + I: ExactSizeIterator, + T: HomogeneousTuple, +{ } impl Tuples - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { /// Return a buffer with the produced items that was not enough to be grouped in a tuple. /// @@ -128,7 +157,6 @@ impl Tuples } } - /// An iterator over all contiguous windows that produces tuples of a specific size. /// /// See [`.tuple_windows()`](crate::Itertools::tuple_windows) for more @@ -136,125 +164,167 @@ impl Tuples #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] #[derive(Clone, Debug)] pub struct TupleWindows - where I: Iterator, - T: HomogeneousTuple +where + I: Iterator, + T: HomogeneousTuple, { iter: I, last: Option, } /// Create a new tuple windows iterator. -pub fn tuple_windows(mut iter: I) -> TupleWindows - where I: Iterator, - T: HomogeneousTuple, - T::Item: Clone +pub fn tuple_windows(iter: I) -> TupleWindows +where + I: Iterator, + T: HomogeneousTuple, + T::Item: Clone, { - use std::iter::once; - - let mut last = None; - if T::num_items() != 1 { - // put in a duplicate item in front of the tuple; this simplifies - // .next() function. - if let Some(item) = iter.next() { - let iter = once(item.clone()).chain(once(item)).chain(&mut iter); - last = T::collect_from_iter_no_buf(iter); - } - } - - TupleWindows { - iter, - last, - } + TupleWindows { last: None, iter } } impl Iterator for TupleWindows - where I: Iterator, - T: HomogeneousTuple + Clone, - T::Item: Clone +where + I: Iterator, + T: HomogeneousTuple + Clone, + T::Item: Clone, { type Item = T; fn next(&mut self) -> Option { if T::num_items() == 1 { - return T::collect_from_iter_no_buf(&mut self.iter) + return T::collect_from_iter_no_buf(&mut self.iter); } - if let Some(ref mut last) = self.last { - if let Some(new) = self.iter.next() { + if let Some(new) = self.iter.next() { + if let Some(ref mut last) = self.last { last.left_shift_push(new); - return Some(last.clone()); + Some(last.clone()) + } else { + use std::iter::once; + let iter = once(new).chain(&mut self.iter); + self.last = T::collect_from_iter_no_buf(iter); + self.last.clone() } + } else { + None } - None + } + + fn size_hint(&self) -> (usize, Option) { + let mut sh = self.iter.size_hint(); + // Adjust the size hint at the beginning + // OR when `num_items == 1` (but it does not change the size hint). + if self.last.is_none() { + sh = size_hint::sub_scalar(sh, T::num_items() - 1); + } + sh } } -impl FusedIterator for TupleWindows - where I: FusedIterator, - T: HomogeneousTuple + Clone, - T::Item: Clone -{} +impl ExactSizeIterator for TupleWindows +where + I: ExactSizeIterator, + T: HomogeneousTuple + Clone, + T::Item: Clone, +{ +} -/// An iterator over all windows,wrapping back to the first elements when the +impl FusedIterator for TupleWindows +where + I: FusedIterator, + T: HomogeneousTuple + Clone, + T::Item: Clone, +{ +} + +/// An iterator over all windows, wrapping back to the first elements when the /// window would otherwise exceed the length of the iterator, producing tuples /// of a specific size. /// /// See [`.circular_tuple_windows()`](crate::Itertools::circular_tuple_windows) for more /// information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -#[derive(Debug)] -pub struct CircularTupleWindows - where I: Iterator + Clone, - T: TupleCollect + Clone +#[derive(Debug, Clone)] +pub struct CircularTupleWindows +where + I: Iterator + Clone, + T: TupleCollect + Clone, { - iter: Take, T>>, - phantom_data: PhantomData + iter: TupleWindows, T>, + len: usize, } pub fn circular_tuple_windows(iter: I) -> CircularTupleWindows - where I: Iterator + Clone + ExactSizeIterator, - T: TupleCollect + Clone, - T::Item: Clone +where + I: Iterator + Clone + ExactSizeIterator, + T: TupleCollect + Clone, + T::Item: Clone, { let len = iter.len(); - let iter = tuple_windows(iter.cycle()).take(len); + let iter = tuple_windows(iter.cycle()); - CircularTupleWindows { - iter, - phantom_data: PhantomData{} - } + CircularTupleWindows { iter, len } } impl Iterator for CircularTupleWindows - where I: Iterator + Clone, - T: TupleCollect + Clone, - T::Item: Clone +where + I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone, { type Item = T; fn next(&mut self) -> Option { - self.iter.next() + if self.len != 0 { + self.len -= 1; + self.iter.next() + } else { + None + } } + + fn size_hint(&self) -> (usize, Option) { + (self.len, Some(self.len)) + } +} + +impl ExactSizeIterator for CircularTupleWindows +where + I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone, +{ +} + +impl FusedIterator for CircularTupleWindows +where + I: Iterator + Clone, + T: TupleCollect + Clone, + T::Item: Clone, +{ } pub trait TupleCollect: Sized { type Item; type Buffer: Default + AsRef<[Option]> + AsMut<[Option]>; + fn buffer_len(buf: &Self::Buffer) -> usize { + let s = buf.as_ref(); + s.iter().position(Option::is_none).unwrap_or(s.len()) + } + fn collect_from_iter(iter: I, buf: &mut Self::Buffer) -> Option - where I: IntoIterator; + where + I: IntoIterator; fn collect_from_iter_no_buf(iter: I) -> Option - where I: IntoIterator; + where + I: IntoIterator; fn num_items() -> usize; fn left_shift_push(&mut self, item: Self::Item); } -macro_rules! count_ident{ - () => {0}; - ($i0:ident, $($i:ident,)*) => {1 + count_ident!($($i,)*)}; -} macro_rules! rev_for_each_ident{ ($m:ident, ) => {}; ($m:ident, $i0:ident, $($i:ident,)*) => { @@ -269,7 +339,7 @@ macro_rules! impl_tuple_collect { impl_tuple_collect!($($Y,)*); impl TupleCollect for ($(ignore_ident!($Y, A),)*) { type Item = A; - type Buffer = [Option; count_ident!($($Y,)*) - 1]; + type Buffer = [Option; count_ident!($($Y)*) - 1]; #[allow(unused_assignments, unused_mut)] fn collect_from_iter(iter: I, buf: &mut Self::Buffer) -> Option @@ -312,7 +382,7 @@ macro_rules! impl_tuple_collect { } fn num_items() -> usize { - count_ident!($($Y,)*) + count_ident!($($Y)*) } fn left_shift_push(&mut self, mut item: A) { diff --git a/third_party/rust/itertools/src/unique_impl.rs b/third_party/rust/itertools/src/unique_impl.rs index 4e81e78ec03..0f6397e48fb 100644 --- a/third_party/rust/itertools/src/unique_impl.rs +++ b/third_party/rust/itertools/src/unique_impl.rs @@ -1,7 +1,7 @@ -use std::collections::HashMap; use std::collections::hash_map::Entry; -use std::hash::Hash; +use std::collections::HashMap; use std::fmt; +use std::hash::Hash; use std::iter::FusedIterator; /// An iterator adapter to filter out duplicate elements. @@ -19,17 +19,19 @@ pub struct UniqueBy { } impl fmt::Debug for UniqueBy - where I: Iterator + fmt::Debug, - V: fmt::Debug + Hash + Eq, +where + I: Iterator + fmt::Debug, + V: fmt::Debug + Hash + Eq, { debug_fmt_fields!(UniqueBy, iter, used); } /// Create a new `UniqueBy` iterator. pub fn unique_by(iter: I, f: F) -> UniqueBy - where V: Eq + Hash, - F: FnMut(&I::Item) -> V, - I: Iterator, +where + V: Eq + Hash, + F: FnMut(&I::Item) -> V, + I: Iterator, { UniqueBy { iter, @@ -40,8 +42,9 @@ pub fn unique_by(iter: I, f: F) -> UniqueBy // count the number of new unique keys in iterable (`used` is the set already seen) fn count_new_keys(mut used: HashMap, iterable: I) -> usize - where I: IntoIterator, - K: Hash + Eq, +where + I: IntoIterator, + K: Hash + Eq, { let iter = iterable.into_iter(); let current_used = used.len(); @@ -50,20 +53,16 @@ fn count_new_keys(mut used: HashMap, iterable: I) -> usize } impl Iterator for UniqueBy - where I: Iterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V +where + I: Iterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V, { type Item = I::Item; fn next(&mut self) -> Option { - while let Some(v) = self.iter.next() { - let key = (self.f)(&v); - if self.used.insert(key, ()).is_none() { - return Some(v); - } - } - None + let Self { iter, used, f } = self; + iter.find(|v| used.insert(f(v), ()).is_none()) } #[inline] @@ -79,42 +78,42 @@ impl Iterator for UniqueBy } impl DoubleEndedIterator for UniqueBy - where I: DoubleEndedIterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V +where + I: DoubleEndedIterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V, { fn next_back(&mut self) -> Option { - while let Some(v) = self.iter.next_back() { - let key = (self.f)(&v); - if self.used.insert(key, ()).is_none() { - return Some(v); - } - } - None + let Self { iter, used, f } = self; + iter.rfind(|v| used.insert(f(v), ()).is_none()) } } impl FusedIterator for UniqueBy - where I: FusedIterator, - V: Eq + Hash, - F: FnMut(&I::Item) -> V -{} +where + I: FusedIterator, + V: Eq + Hash, + F: FnMut(&I::Item) -> V, +{ +} impl Iterator for Unique - where I: Iterator, - I::Item: Eq + Hash + Clone +where + I: Iterator, + I::Item: Eq + Hash + Clone, { type Item = I::Item; fn next(&mut self) -> Option { - while let Some(v) = self.iter.iter.next() { - if let Entry::Vacant(entry) = self.iter.used.entry(v) { + let UniqueBy { iter, used, .. } = &mut self.iter; + iter.find_map(|v| { + if let Entry::Vacant(entry) = used.entry(v) { let elt = entry.key().clone(); entry.insert(()); return Some(elt); } - } - None + None + }) } #[inline] @@ -129,51 +128,61 @@ impl Iterator for Unique } impl DoubleEndedIterator for Unique - where I: DoubleEndedIterator, - I::Item: Eq + Hash + Clone +where + I: DoubleEndedIterator, + I::Item: Eq + Hash + Clone, { fn next_back(&mut self) -> Option { - while let Some(v) = self.iter.iter.next_back() { - if let Entry::Vacant(entry) = self.iter.used.entry(v) { + let UniqueBy { iter, used, .. } = &mut self.iter; + iter.rev().find_map(|v| { + if let Entry::Vacant(entry) = used.entry(v) { let elt = entry.key().clone(); entry.insert(()); return Some(elt); } - } - None + None + }) } } impl FusedIterator for Unique - where I: FusedIterator, - I::Item: Eq + Hash + Clone -{} +where + I: FusedIterator, + I::Item: Eq + Hash + Clone, +{ +} /// An iterator adapter to filter out duplicate elements. /// /// See [`.unique()`](crate::Itertools::unique) for more information. #[derive(Clone)] #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] -pub struct Unique { +pub struct Unique +where + I: Iterator, + I::Item: Eq + Hash + Clone, +{ iter: UniqueBy, } impl fmt::Debug for Unique - where I: Iterator + fmt::Debug, - I::Item: Hash + Eq + fmt::Debug, +where + I: Iterator + fmt::Debug, + I::Item: Hash + Eq + fmt::Debug + Clone, { debug_fmt_fields!(Unique, iter); } pub fn unique(iter: I) -> Unique - where I: Iterator, - I::Item: Eq + Hash, +where + I: Iterator, + I::Item: Eq + Hash + Clone, { Unique { iter: UniqueBy { iter, used: HashMap::new(), f: (), - } + }, } } diff --git a/third_party/rust/itertools/src/unziptuple.rs b/third_party/rust/itertools/src/unziptuple.rs index 7af29ec4abd..2c79c2d842c 100644 --- a/third_party/rust/itertools/src/unziptuple.rs +++ b/third_party/rust/itertools/src/unziptuple.rs @@ -1,6 +1,6 @@ /// Converts an iterator of tuples into a tuple of containers. /// -/// `unzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each +/// `multiunzip()` consumes an entire iterator of n-ary tuples, producing `n` collections, one for each /// column. /// /// This function is, in some sense, the opposite of [`multizip`]. diff --git a/third_party/rust/itertools/src/with_position.rs b/third_party/rust/itertools/src/with_position.rs index 1388503d1cd..2d56bb9b224 100644 --- a/third_party/rust/itertools/src/with_position.rs +++ b/third_party/rust/itertools/src/with_position.rs @@ -1,28 +1,40 @@ -use std::iter::{Fuse,Peekable, FusedIterator}; +use std::fmt; +use std::iter::{Fuse, FusedIterator, Peekable}; /// An iterator adaptor that wraps each element in an [`Position`]. /// -/// Iterator element type is `Position`. +/// Iterator element type is `(Position, I::Item)`. /// /// See [`.with_position()`](crate::Itertools::with_position) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct WithPosition - where I: Iterator, +where + I: Iterator, { handled_first: bool, peekable: Peekable>, } +impl fmt::Debug for WithPosition +where + I: Iterator, + Peekable>: fmt::Debug, +{ + debug_fmt_fields!(WithPosition, handled_first, peekable); +} + impl Clone for WithPosition - where I: Clone + Iterator, - I::Item: Clone, +where + I: Clone + Iterator, + I::Item: Clone, { clone_fields!(handled_first, peekable); } /// Create a new `WithPosition` iterator. pub fn with_position(iter: I) -> WithPosition - where I: Iterator, +where + I: Iterator, { WithPosition { handled_first: false, @@ -30,36 +42,24 @@ pub fn with_position(iter: I) -> WithPosition } } -/// A value yielded by `WithPosition`. +/// The first component of the value yielded by `WithPosition`. /// Indicates the position of this element in the iterator results. /// /// See [`.with_position()`](crate::Itertools::with_position) for more information. -#[derive(Copy, Clone, Debug, PartialEq)] -pub enum Position { +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Position { /// This is the first element. - First(T), + First, /// This is neither the first nor the last element. - Middle(T), + Middle, /// This is the last element. - Last(T), + Last, /// This is the only element. - Only(T), -} - -impl Position { - /// Return the inner value. - pub fn into_inner(self) -> T { - match self { - Position::First(x) | - Position::Middle(x) | - Position::Last(x) | - Position::Only(x) => x, - } - } + Only, } impl Iterator for WithPosition { - type Item = Position; + type Item = (Position, I::Item); fn next(&mut self) -> Option { match self.peekable.next() { @@ -70,15 +70,15 @@ impl Iterator for WithPosition { // Peek to see if this is also the last item, // in which case tag it as `Only`. match self.peekable.peek() { - Some(_) => Some(Position::First(item)), - None => Some(Position::Only(item)), + Some(_) => Some((Position::First, item)), + None => Some((Position::Only, item)), } } else { // Have seen the first item, and there's something left. // Peek to see if this is the last item. match self.peekable.peek() { - Some(_) => Some(Position::Middle(item)), - None => Some(Position::Last(item)), + Some(_) => Some((Position::Middle, item)), + None => Some((Position::Last, item)), } } } @@ -90,11 +90,35 @@ impl Iterator for WithPosition { fn size_hint(&self) -> (usize, Option) { self.peekable.size_hint() } + + fn fold(mut self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + if let Some(mut head) = self.peekable.next() { + if !self.handled_first { + // The current head is `First` or `Only`, + // it depends if there is another item or not. + match self.peekable.next() { + Some(second) => { + let first = std::mem::replace(&mut head, second); + init = f(init, (Position::First, first)); + } + None => return f(init, (Position::Only, head)), + } + } + // Have seen the first item, and there's something left. + init = self.peekable.fold(init, |acc, mut item| { + std::mem::swap(&mut head, &mut item); + f(acc, (Position::Middle, item)) + }); + // The "head" is now the last item. + init = f(init, (Position::Last, head)); + } + init + } } -impl ExactSizeIterator for WithPosition - where I: ExactSizeIterator, -{ } +impl ExactSizeIterator for WithPosition where I: ExactSizeIterator {} -impl FusedIterator for WithPosition -{} +impl FusedIterator for WithPosition {} diff --git a/third_party/rust/itertools/src/zip_eq_impl.rs b/third_party/rust/itertools/src/zip_eq_impl.rs index a079b326a4c..3240a40eb3c 100644 --- a/third_party/rust/itertools/src/zip_eq_impl.rs +++ b/third_party/rust/itertools/src/zip_eq_impl.rs @@ -1,6 +1,7 @@ use super::size_hint; /// An iterator which iterates two other iterators simultaneously +/// and panic if they have different lengths. /// /// See [`.zip_eq()`](crate::Itertools::zip_eq) for more information. #[derive(Clone, Debug)] @@ -10,9 +11,7 @@ pub struct ZipEq { b: J, } -/// Iterate `i` and `j` in lock step. -/// -/// **Panics** if the iterators are not of the same length. +/// Zips two iterators but **panics** if they are not of the same length. /// /// [`IntoIterator`] enabled version of [`Itertools::zip_eq`](crate::Itertools::zip_eq). /// @@ -22,11 +21,13 @@ pub struct ZipEq { /// let data = [1, 2, 3, 4, 5]; /// for (a, b) in zip_eq(&data[..data.len() - 1], &data[1..]) { /// /* loop body */ +/// # let _ = (a, b); /// } /// ``` pub fn zip_eq(i: I, j: J) -> ZipEq - where I: IntoIterator, - J: IntoIterator +where + I: IntoIterator, + J: IntoIterator, { ZipEq { a: i.into_iter(), @@ -35,8 +36,9 @@ pub fn zip_eq(i: I, j: J) -> ZipEq } impl Iterator for ZipEq - where I: Iterator, - J: Iterator +where + I: Iterator, + J: Iterator, { type Item = (I::Item, J::Item); @@ -44,8 +46,9 @@ impl Iterator for ZipEq match (self.a.next(), self.b.next()) { (None, None) => None, (Some(a), Some(b)) => Some((a, b)), - (None, Some(_)) | (Some(_), None) => - panic!("itertools: .zip_eq() reached end of one iterator before the other") + (None, Some(_)) | (Some(_), None) => { + panic!("itertools: .zip_eq() reached end of one iterator before the other") + } } } @@ -55,6 +58,8 @@ impl Iterator for ZipEq } impl ExactSizeIterator for ZipEq - where I: ExactSizeIterator, - J: ExactSizeIterator -{} +where + I: ExactSizeIterator, + J: ExactSizeIterator, +{ +} diff --git a/third_party/rust/itertools/src/zip_longest.rs b/third_party/rust/itertools/src/zip_longest.rs index cb9a7bacb25..d4eb9a882e3 100644 --- a/third_party/rust/itertools/src/zip_longest.rs +++ b/third_party/rust/itertools/src/zip_longest.rs @@ -1,5 +1,5 @@ -use std::cmp::Ordering::{Equal, Greater, Less}; use super::size_hint; +use std::cmp::Ordering::{Equal, Greater, Less}; use std::iter::{Fuse, FusedIterator}; use crate::either_or_both::EitherOrBoth; @@ -8,6 +8,7 @@ use crate::either_or_both::EitherOrBoth; // and dedicated to itertools https://github.com/rust-lang/rust/pull/19283 /// An iterator which iterates two other iterators simultaneously +/// and wraps the elements in [`EitherOrBoth`]. /// /// This iterator is *fused*. /// @@ -21,8 +22,9 @@ pub struct ZipLongest { /// Create a new `ZipLongest` iterator. pub fn zip_longest(a: T, b: U) -> ZipLongest - where T: Iterator, - U: Iterator +where + T: Iterator, + U: Iterator, { ZipLongest { a: a.fuse(), @@ -31,8 +33,9 @@ pub fn zip_longest(a: T, b: U) -> ZipLongest } impl Iterator for ZipLongest - where T: Iterator, - U: Iterator +where + T: Iterator, + U: Iterator, { type Item = EitherOrBoth; @@ -50,11 +53,29 @@ impl Iterator for ZipLongest fn size_hint(&self) -> (usize, Option) { size_hint::max(self.a.size_hint(), self.b.size_hint()) } + + #[inline] + fn fold(self, init: B, mut f: F) -> B + where + Self: Sized, + F: FnMut(B, Self::Item) -> B, + { + let Self { mut a, mut b } = self; + let res = a.try_fold(init, |init, a| match b.next() { + Some(b) => Ok(f(init, EitherOrBoth::Both(a, b))), + None => Err(f(init, EitherOrBoth::Left(a))), + }); + match res { + Ok(acc) => b.map(EitherOrBoth::Right).fold(acc, f), + Err(acc) => a.map(EitherOrBoth::Left).fold(acc, f), + } + } } impl DoubleEndedIterator for ZipLongest - where T: DoubleEndedIterator + ExactSizeIterator, - U: DoubleEndedIterator + ExactSizeIterator +where + T: DoubleEndedIterator + ExactSizeIterator, + U: DoubleEndedIterator + ExactSizeIterator, { #[inline] fn next_back(&mut self) -> Option { @@ -70,14 +91,49 @@ impl DoubleEndedIterator for ZipLongest Less => self.b.next_back().map(EitherOrBoth::Right), } } + + fn rfold(self, mut init: B, mut f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { + let Self { mut a, mut b } = self; + let a_len = a.len(); + let b_len = b.len(); + match a_len.cmp(&b_len) { + Equal => {} + Greater => { + init = a + .by_ref() + .rev() + .take(a_len - b_len) + .map(EitherOrBoth::Left) + .fold(init, &mut f) + } + Less => { + init = b + .by_ref() + .rev() + .take(b_len - a_len) + .map(EitherOrBoth::Right) + .fold(init, &mut f) + } + } + a.rfold(init, |acc, item_a| { + f(acc, EitherOrBoth::Both(item_a, b.next_back().unwrap())) + }) + } } impl ExactSizeIterator for ZipLongest - where T: ExactSizeIterator, - U: ExactSizeIterator -{} +where + T: ExactSizeIterator, + U: ExactSizeIterator, +{ +} impl FusedIterator for ZipLongest - where T: Iterator, - U: Iterator -{} +where + T: Iterator, + U: Iterator, +{ +} diff --git a/third_party/rust/itertools/src/ziptuple.rs b/third_party/rust/itertools/src/ziptuple.rs index 6d3a584c49c..3ada0296caa 100644 --- a/third_party/rust/itertools/src/ziptuple.rs +++ b/third_party/rust/itertools/src/ziptuple.rs @@ -7,7 +7,7 @@ pub struct Zip { t: T, } -/// An iterator that generalizes *.zip()* and allows running multiple iterators in lockstep. +/// An iterator that generalizes `.zip()` and allows running multiple iterators in lockstep. /// /// The iterator `Zip<(I, J, ..., M)>` is formed from a tuple of iterators (or values that /// implement [`IntoIterator`]) and yields elements @@ -16,11 +16,11 @@ pub struct Zip { /// The iterator element type is a tuple like like `(A, B, ..., E)` where `A` to `E` are the /// element types of the subiterator. /// -/// **Note:** The result of this macro is a value of a named type (`Zip<(I, J, +/// **Note:** The result of this function is a value of a named type (`Zip<(I, J, /// ..)>` of each component iterator `I, J, ...`) if each component iterator is /// nameable. /// -/// Prefer [`izip!()`] over `multizip` for the performance benefits of using the +/// Prefer [`izip!()`](crate::izip) over `multizip` for the performance benefits of using the /// standard library `.zip()`. Prefer `multizip` if a nameable type is needed. /// /// ``` @@ -36,10 +36,9 @@ pub struct Zip { /// /// assert_eq!(results, [0 + 3, 10 + 7, 29, 36]); /// ``` -/// [`izip!()`]: crate::izip pub fn multizip(t: U) -> Zip - where Zip: From, - Zip: Iterator, +where + Zip: From + Iterator, { Zip::from(t) } @@ -82,7 +81,7 @@ macro_rules! impl_zip_iter { fn size_hint(&self) -> (usize, Option) { - let sh = (::std::usize::MAX, None); + let sh = (usize::MAX, None); let ($(ref $B,)*) = self.t; $( let sh = size_hint::min($B.size_hint(), sh); diff --git a/third_party/rust/itertools/tests/adaptors_no_collect.rs b/third_party/rust/itertools/tests/adaptors_no_collect.rs index 103db23f1eb..977224af29f 100644 --- a/third_party/rust/itertools/tests/adaptors_no_collect.rs +++ b/third_party/rust/itertools/tests/adaptors_no_collect.rs @@ -22,9 +22,14 @@ impl Iterator for PanickingCounter { } fn no_collect_test(to_adaptor: T) - where A: Iterator, T: Fn(PanickingCounter) -> A +where + A: Iterator, + T: Fn(PanickingCounter) -> A, { - let counter = PanickingCounter { curr: 0, max: 10_000 }; + let counter = PanickingCounter { + curr: 0, + max: 10_000, + }; let adaptor = to_adaptor(counter); for _ in adaptor.take(5) {} @@ -43,4 +48,4 @@ fn combinations_no_collect() { #[test] fn combinations_with_replacement_no_collect() { no_collect_test(|iter| iter.combinations_with_replacement(5)) -} \ No newline at end of file +} diff --git a/third_party/rust/itertools/tests/laziness.rs b/third_party/rust/itertools/tests/laziness.rs new file mode 100644 index 00000000000..c559d33adc5 --- /dev/null +++ b/third_party/rust/itertools/tests/laziness.rs @@ -0,0 +1,283 @@ +#![allow(unstable_name_collisions)] + +use itertools::Itertools; + +#[derive(Debug, Clone)] +#[must_use = "iterators are lazy and do nothing unless consumed"] +struct Panicking; + +impl Iterator for Panicking { + type Item = u8; + + fn next(&mut self) -> Option { + panic!("iterator adaptor is not lazy") + } + + fn size_hint(&self) -> (usize, Option) { + (0, Some(0)) + } +} + +impl ExactSizeIterator for Panicking {} + +/// ## Usage example +/// ```compile_fail +/// must_use_tests! { +/// name { +/// Panicking.name(); // Add `let _ =` only if required (encountered error). +/// } +/// // ... +/// } +/// ``` +/// +/// **TODO:** test missing `must_use` attributes better, maybe with a new lint. +macro_rules! must_use_tests { + ($($(#[$attr:meta])* $name:ident $body:block)*) => { + $( + /// `#[deny(unused_must_use)]` should force us to ignore the resulting iterators + /// by adding `let _ = ...;` on every iterator. + /// If it does not, then a `must_use` attribute is missing on the associated struct. + /// + /// However, it's only helpful if we don't add `let _ =` before seeing if there is an error or not. + /// And it does not protect us against removed `must_use` attributes. + /// There is no simple way to test this yet. + #[deny(unused_must_use)] + #[test] + $(#[$attr])* + fn $name() $body + )* + }; +} + +must_use_tests! { + // Itertools trait: + interleave { + let _ = Panicking.interleave(Panicking); + } + interleave_shortest { + let _ = Panicking.interleave_shortest(Panicking); + } + intersperse { + let _ = Panicking.intersperse(0); + } + intersperse_with { + let _ = Panicking.intersperse_with(|| 0); + } + get { + let _ = Panicking.get(1..4); + let _ = Panicking.get(1..=4); + let _ = Panicking.get(1..); + let _ = Panicking.get(..4); + let _ = Panicking.get(..=4); + let _ = Panicking.get(..); + } + zip_longest { + let _ = Panicking.zip_longest(Panicking); + } + zip_eq { + let _ = Panicking.zip_eq(Panicking); + } + batching { + let _ = Panicking.batching(Iterator::next); + } + chunk_by { + // ChunkBy + let _ = Panicking.chunk_by(|x| *x); + // Groups + let _ = Panicking.chunk_by(|x| *x).into_iter(); + } + chunks { + // IntoChunks + let _ = Panicking.chunks(1); + let _ = Panicking.chunks(2); + // Chunks + let _ = Panicking.chunks(1).into_iter(); + let _ = Panicking.chunks(2).into_iter(); + } + tuple_windows { + let _ = Panicking.tuple_windows::<(_,)>(); + let _ = Panicking.tuple_windows::<(_, _)>(); + let _ = Panicking.tuple_windows::<(_, _, _)>(); + } + circular_tuple_windows { + let _ = Panicking.circular_tuple_windows::<(_,)>(); + let _ = Panicking.circular_tuple_windows::<(_, _)>(); + let _ = Panicking.circular_tuple_windows::<(_, _, _)>(); + } + tuples { + let _ = Panicking.tuples::<(_,)>(); + let _ = Panicking.tuples::<(_, _)>(); + let _ = Panicking.tuples::<(_, _, _)>(); + } + tee { + let _ = Panicking.tee(); + } + map_into { + let _ = Panicking.map_into::(); + } + map_ok { + let _ = Panicking.map(Ok::).map_ok(|x| x + 1); + } + filter_ok { + let _ = Panicking.map(Ok::).filter_ok(|x| x % 2 == 0); + } + filter_map_ok { + let _ = Panicking.map(Ok::).filter_map_ok(|x| { + if x % 2 == 0 { + Some(x + 1) + } else { + None + } + }); + } + flatten_ok { + let _ = Panicking.map(|x| Ok::<_, ()>([x])).flatten_ok(); + } + merge { + let _ = Panicking.merge(Panicking); + } + merge_by { + let _ = Panicking.merge_by(Panicking, |_, _| true); + } + merge_join_by { + let _ = Panicking.merge_join_by(Panicking, |_, _| true); + let _ = Panicking.merge_join_by(Panicking, Ord::cmp); + } + #[should_panic] + kmerge { + let _ = Panicking.map(|_| Panicking).kmerge(); + } + #[should_panic] + kmerge_by { + let _ = Panicking.map(|_| Panicking).kmerge_by(|_, _| true); + } + cartesian_product { + let _ = Panicking.cartesian_product(Panicking); + } + multi_cartesian_product { + let _ = vec![Panicking, Panicking, Panicking].into_iter().multi_cartesian_product(); + } + coalesce { + let _ = Panicking.coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) }); + } + dedup { + let _ = Panicking.dedup(); + } + dedup_by { + let _ = Panicking.dedup_by(|_, _| true); + } + dedup_with_count { + let _ = Panicking.dedup_with_count(); + } + dedup_by_with_count { + let _ = Panicking.dedup_by_with_count(|_, _| true); + } + duplicates { + let _ = Panicking.duplicates(); + } + duplicates_by { + let _ = Panicking.duplicates_by(|x| *x); + } + unique { + let _ = Panicking.unique(); + } + unique_by { + let _ = Panicking.unique_by(|x| *x); + } + peeking_take_while { + let _ = Panicking.peekable().peeking_take_while(|x| x % 2 == 0); + } + take_while_ref { + let _ = Panicking.take_while_ref(|x| x % 2 == 0); + } + take_while_inclusive { + let _ = Panicking.take_while_inclusive(|x| x % 2 == 0); + } + while_some { + let _ = Panicking.map(Some).while_some(); + } + tuple_combinations1 { + let _ = Panicking.tuple_combinations::<(_,)>(); + } + #[should_panic] + tuple_combinations2 { + let _ = Panicking.tuple_combinations::<(_, _)>(); + } + #[should_panic] + tuple_combinations3 { + let _ = Panicking.tuple_combinations::<(_, _, _)>(); + } + combinations { + let _ = Panicking.combinations(0); + let _ = Panicking.combinations(1); + let _ = Panicking.combinations(2); + } + combinations_with_replacement { + let _ = Panicking.combinations_with_replacement(0); + let _ = Panicking.combinations_with_replacement(1); + let _ = Panicking.combinations_with_replacement(2); + } + permutations { + let _ = Panicking.permutations(0); + let _ = Panicking.permutations(1); + let _ = Panicking.permutations(2); + } + powerset { + let _ = Panicking.powerset(); + } + pad_using { + let _ = Panicking.pad_using(25, |_| 10); + } + with_position { + let _ = Panicking.with_position(); + } + positions { + let _ = Panicking.positions(|v| v % 2 == 0); + } + update { + let _ = Panicking.update(|n| *n += 1); + } + multipeek { + let _ = Panicking.multipeek(); + } + // Not iterator themselves but still lazy. + into_grouping_map { + let _ = Panicking.map(|x| (x, x + 1)).into_grouping_map(); + } + into_grouping_map_by { + let _ = Panicking.into_grouping_map_by(|x| *x); + } + // Macros: + iproduct { + let _ = itertools::iproduct!(Panicking); + let _ = itertools::iproduct!(Panicking, Panicking); + let _ = itertools::iproduct!(Panicking, Panicking, Panicking); + } + izip { + let _ = itertools::izip!(Panicking); + let _ = itertools::izip!(Panicking, Panicking); + let _ = itertools::izip!(Panicking, Panicking, Panicking); + } + chain { + let _ = itertools::chain!(Panicking); + let _ = itertools::chain!(Panicking, Panicking); + let _ = itertools::chain!(Panicking, Panicking, Panicking); + } + // Free functions: + multizip { + let _ = itertools::multizip((Panicking, Panicking)); + } + put_back { + let _ = itertools::put_back(Panicking); + let _ = itertools::put_back(Panicking).with_value(15); + } + peek_nth { + let _ = itertools::peek_nth(Panicking); + } + put_back_n { + let _ = itertools::put_back_n(Panicking); + } + rciter { + let _ = itertools::rciter(Panicking); + } +} diff --git a/third_party/rust/itertools/tests/macros_hygiene.rs b/third_party/rust/itertools/tests/macros_hygiene.rs index d1111245d69..e6e89555562 100644 --- a/third_party/rust/itertools/tests/macros_hygiene.rs +++ b/third_party/rust/itertools/tests/macros_hygiene.rs @@ -1,5 +1,11 @@ +mod alloc {} +mod core {} +mod either {} +mod std {} + #[test] fn iproduct_hygiene() { + let _ = itertools::iproduct!(); let _ = itertools::iproduct!(0..6); let _ = itertools::iproduct!(0..6, 0..9); let _ = itertools::iproduct!(0..6, 0..9, 0..12); @@ -11,3 +17,11 @@ fn izip_hygiene() { let _ = itertools::izip!(0..6, 0..9); let _ = itertools::izip!(0..6, 0..9, 0..12); } + +#[test] +fn chain_hygiene() { + let _: ::std::iter::Empty = itertools::chain!(); + let _ = itertools::chain!(0..6); + let _ = itertools::chain!(0..6, 0..9); + let _ = itertools::chain!(0..6, 0..9, 0..12); +} diff --git a/third_party/rust/itertools/tests/merge_join.rs b/third_party/rust/itertools/tests/merge_join.rs index 3280b7d4ecb..776252fc58d 100644 --- a/third_party/rust/itertools/tests/merge_join.rs +++ b/third_party/rust/itertools/tests/merge_join.rs @@ -1,108 +1,101 @@ -use itertools::EitherOrBoth; use itertools::free::merge_join_by; +use itertools::EitherOrBoth; #[test] fn empty() { let left: Vec = vec![]; let right: Vec = vec![]; - let expected_result: Vec> = vec![]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let expected_result: Vec> = vec![]; + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn left_only() { - let left: Vec = vec![1,2,3]; + let left: Vec = vec![1, 2, 3]; let right: Vec = vec![]; - let expected_result: Vec> = vec![ + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Left(2), - EitherOrBoth::Left(3) + EitherOrBoth::Left(3), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn right_only() { let left: Vec = vec![]; - let right: Vec = vec![1,2,3]; - let expected_result: Vec> = vec![ + let right: Vec = vec![1, 2, 3]; + let expected_result: Vec> = vec![ EitherOrBoth::Right(1), EitherOrBoth::Right(2), - EitherOrBoth::Right(3) + EitherOrBoth::Right(3), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn first_left_then_right() { - let left: Vec = vec![1,2,3]; - let right: Vec = vec![4,5,6]; - let expected_result: Vec> = vec![ + let left: Vec = vec![1, 2, 3]; + let right: Vec = vec![4, 5, 6]; + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Left(2), EitherOrBoth::Left(3), EitherOrBoth::Right(4), EitherOrBoth::Right(5), - EitherOrBoth::Right(6) + EitherOrBoth::Right(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn first_right_then_left() { - let left: Vec = vec![4,5,6]; - let right: Vec = vec![1,2,3]; - let expected_result: Vec> = vec![ + let left: Vec = vec![4, 5, 6]; + let right: Vec = vec![1, 2, 3]; + let expected_result: Vec> = vec![ EitherOrBoth::Right(1), EitherOrBoth::Right(2), EitherOrBoth::Right(3), EitherOrBoth::Left(4), EitherOrBoth::Left(5), - EitherOrBoth::Left(6) + EitherOrBoth::Left(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn interspersed_left_and_right() { - let left: Vec = vec![1,3,5]; - let right: Vec = vec![2,4,6]; - let expected_result: Vec> = vec![ + let left: Vec = vec![1, 3, 5]; + let right: Vec = vec![2, 4, 6]; + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Right(2), EitherOrBoth::Left(3), EitherOrBoth::Right(4), EitherOrBoth::Left(5), - EitherOrBoth::Right(6) + EitherOrBoth::Right(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } #[test] fn overlapping_left_and_right() { - let left: Vec = vec![1,3,4,6]; - let right: Vec = vec![2,3,4,5]; - let expected_result: Vec> = vec![ + let left: Vec = vec![1, 3, 4, 6]; + let right: Vec = vec![2, 3, 4, 5]; + let expected_result: Vec> = vec![ EitherOrBoth::Left(1), EitherOrBoth::Right(2), EitherOrBoth::Both(3, 3), EitherOrBoth::Both(4, 4), EitherOrBoth::Right(5), - EitherOrBoth::Left(6) + EitherOrBoth::Left(6), ]; - let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)) - .collect::>(); + let actual_result = merge_join_by(left, right, |l, r| l.cmp(r)).collect::>(); assert_eq!(expected_result, actual_result); } diff --git a/third_party/rust/itertools/tests/peeking_take_while.rs b/third_party/rust/itertools/tests/peeking_take_while.rs index a1147027e82..5be97271dd8 100644 --- a/third_party/rust/itertools/tests/peeking_take_while.rs +++ b/third_party/rust/itertools/tests/peeking_take_while.rs @@ -48,3 +48,22 @@ fn peeking_take_while_slice_iter_rev() { r.peeking_take_while(|_| true).count(); assert_eq!(r.next(), None); } + +#[test] +fn peeking_take_while_nested() { + let mut xs = (0..10).peekable(); + let ys: Vec<_> = xs + .peeking_take_while(|x| *x < 6) + .peeking_take_while(|x| *x != 3) + .collect(); + assert_eq!(ys, vec![0, 1, 2]); + assert_eq!(xs.next(), Some(3)); + + let mut xs = (4..10).peekable(); + let ys: Vec<_> = xs + .peeking_take_while(|x| *x != 3) + .peeking_take_while(|x| *x < 6) + .collect(); + assert_eq!(ys, vec![4, 5]); + assert_eq!(xs.next(), Some(6)); +} diff --git a/third_party/rust/itertools/tests/quick.rs b/third_party/rust/itertools/tests/quick.rs index 0adcf1ad72c..672901e7c70 100644 --- a/third_party/rust/itertools/tests/quick.rs +++ b/third_party/rust/itertools/tests/quick.rs @@ -2,35 +2,28 @@ //! and adaptors. //! //! In particular we test the tedious size_hint and exact size correctness. +//! +//! **NOTE:** Due to performance limitations, these tests are not run with miri! +//! They cannot be relied upon to discover soundness issues. +#![cfg(not(miri))] +#![allow(deprecated, unstable_name_collisions)] + +use itertools::free::{ + cloned, enumerate, multipeek, peek_nth, put_back, put_back_n, rciter, zip, zip_eq, +}; +use itertools::Itertools; +use itertools::{iproduct, izip, multizip, EitherOrBoth}; use quickcheck as qc; +use std::cmp::{max, min, Ordering}; +use std::collections::{HashMap, HashSet}; use std::default::Default; use std::num::Wrapping; use std::ops::Range; -use std::cmp::{max, min, Ordering}; -use std::collections::{HashMap, HashSet}; -use itertools::Itertools; -use itertools::{ - multizip, - EitherOrBoth, - iproduct, - izip, -}; -use itertools::free::{ - cloned, - enumerate, - multipeek, - peek_nth, - put_back, - put_back_n, - rciter, - zip, - zip_eq, -}; -use rand::Rng; -use rand::seq::SliceRandom; use quickcheck::TestResult; +use rand::seq::SliceRandom; +use rand::Rng; /// Trait for size hint modifier types trait HintKind: Copy + Send + qc::Arbitrary { @@ -49,7 +42,7 @@ impl HintKind for Exact { impl qc::Arbitrary for Exact { fn arbitrary(_: &mut G) -> Self { - Exact {} + Self {} } } @@ -66,8 +59,10 @@ struct Inexact { impl HintKind for Inexact { fn loosen_bounds(&self, org_hint: (usize, Option)) -> (usize, Option) { let (org_lower, org_upper) = org_hint; - (org_lower.saturating_sub(self.underestimate), - org_upper.and_then(move |x| x.checked_add(self.overestimate))) + ( + org_lower.saturating_sub(self.underestimate), + org_upper.and_then(move |x| x.checked_add(self.overestimate)), + ) } } @@ -76,27 +71,23 @@ impl qc::Arbitrary for Inexact { let ue_value = usize::arbitrary(g); let oe_value = usize::arbitrary(g); // Compensate for quickcheck using extreme values too rarely - let ue_choices = &[0, ue_value, usize::max_value()]; - let oe_choices = &[0, oe_value, usize::max_value()]; - Inexact { + let ue_choices = &[0, ue_value, usize::MAX]; + let oe_choices = &[0, oe_value, usize::MAX]; + Self { underestimate: *ue_choices.choose(g).unwrap(), overestimate: *oe_choices.choose(g).unwrap(), } } - fn shrink(&self) -> Box> { + fn shrink(&self) -> Box> { let underestimate_value = self.underestimate; let overestimate_value = self.overestimate; - Box::new( - underestimate_value.shrink().flat_map(move |ue_value| - overestimate_value.shrink().map(move |oe_value| - Inexact { - underestimate: ue_value, - overestimate: oe_value, - } - ) - ) - ) + Box::new(underestimate_value.shrink().flat_map(move |ue_value| { + overestimate_value.shrink().map(move |oe_value| Self { + underestimate: ue_value, + overestimate: oe_value, + }) + })) } } @@ -116,10 +107,12 @@ struct Iter { hint_kind: SK, } -impl Iter where HK: HintKind +impl Iter +where + HK: HintKind, { fn new(it: Range, hint_kind: HK) -> Self { - Iter { + Self { iterator: it, fuse_flag: 0, hint_kind, @@ -128,64 +121,66 @@ impl Iter where HK: HintKind } impl Iterator for Iter - where Range: Iterator, - as Iterator>::Item: Default, - HK: HintKind, +where + Range: Iterator, + as Iterator>::Item: Default, + HK: HintKind, { type Item = as Iterator>::Item; - fn next(&mut self) -> Option - { + fn next(&mut self) -> Option { let elt = self.iterator.next(); if elt.is_none() { self.fuse_flag += 1; // check fuse flag if self.fuse_flag == 2 { - return Some(Default::default()) + return Some(Default::default()); } } elt } - fn size_hint(&self) -> (usize, Option) - { + fn size_hint(&self) -> (usize, Option) { let org_hint = self.iterator.size_hint(); self.hint_kind.loosen_bounds(org_hint) } } impl DoubleEndedIterator for Iter - where Range: DoubleEndedIterator, - as Iterator>::Item: Default, - HK: HintKind +where + Range: DoubleEndedIterator, + as Iterator>::Item: Default, + HK: HintKind, { - fn next_back(&mut self) -> Option { self.iterator.next_back() } + fn next_back(&mut self) -> Option { + self.iterator.next_back() + } } -impl ExactSizeIterator for Iter where Range: ExactSizeIterator, +impl ExactSizeIterator for Iter +where + Range: ExactSizeIterator, as Iterator>::Item: Default, -{ } +{ +} impl qc::Arbitrary for Iter - where T: qc::Arbitrary, - HK: HintKind, +where + T: qc::Arbitrary, + HK: HintKind, { - fn arbitrary(g: &mut G) -> Self - { - Iter::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g)) + fn arbitrary(g: &mut G) -> Self { + Self::new(T::arbitrary(g)..T::arbitrary(g), HK::arbitrary(g)) } - fn shrink(&self) -> Box>> - { + fn shrink(&self) -> Box> { let r = self.iterator.clone(); let hint_kind = self.hint_kind; - Box::new( - r.start.shrink().flat_map(move |a| - r.end.shrink().map(move |b| - Iter::new(a.clone()..b, hint_kind) - ) - ) - ) + Box::new(r.start.shrink().flat_map(move |a| { + r.end + .shrink() + .map(move |b| Self::new(a.clone()..b, hint_kind)) + })) } } @@ -201,7 +196,10 @@ struct ShiftRange { hint_kind: HK, } -impl Iterator for ShiftRange where HK: HintKind { +impl Iterator for ShiftRange +where + HK: HintKind, +{ type Item = Iter; fn next(&mut self) -> Option { @@ -219,10 +217,11 @@ impl Iterator for ShiftRange where HK: HintKind { } } -impl ExactSizeIterator for ShiftRange { } +impl ExactSizeIterator for ShiftRange {} impl qc::Arbitrary for ShiftRange - where HK: HintKind +where + HK: HintKind, { fn arbitrary(g: &mut G) -> Self { const MAX_STARTING_RANGE_DIFF: i32 = 32; @@ -236,7 +235,7 @@ impl qc::Arbitrary for ShiftRange let iter_count = g.gen_range(0, MAX_ITER_COUNT + 1); let hint_kind = qc::Arbitrary::arbitrary(g); - ShiftRange { + Self { range_start, range_end, start_step, @@ -250,7 +249,7 @@ impl qc::Arbitrary for ShiftRange fn correct_count(get_it: F) -> bool where I: Iterator, - F: Fn() -> I + F: Fn() -> I, { let mut counts = vec![get_it().count()]; @@ -258,7 +257,6 @@ where let mut it = get_it(); for _ in 0..(counts.len() - 1) { - #[allow(clippy::manual_assert)] if it.next().is_none() { panic!("Iterator shouldn't be finished, may not be deterministic"); } @@ -276,7 +274,10 @@ where for (i, returned_count) in counts.into_iter().enumerate() { let actual_count = total_actual_count - i; if actual_count != returned_count { - println!("Total iterations: {} True count: {} returned count: {}", i, actual_count, returned_count); + println!( + "Total iterations: {} True count: {} returned count: {}", + i, actual_count, returned_count + ); return false; } @@ -299,12 +300,10 @@ fn correct_size_hint(mut it: I) -> bool { // check all the size hints for &(low, hi) in &hints { true_count -= 1; - if low > true_count || - (hi.is_some() && hi.unwrap() < true_count) - { + if low > true_count || (hi.is_some() && hi.unwrap() < true_count) { println!("True size: {:?}, size hint: {:?}", true_count, (low, hi)); //println!("All hints: {:?}", hints); - return false + return false; } } true @@ -313,13 +312,19 @@ fn correct_size_hint(mut it: I) -> bool { fn exact_size(mut it: I) -> bool { // check every iteration let (mut low, mut hi) = it.size_hint(); - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } while let Some(_) = it.next() { let (xlow, xhi) = it.size_hint(); - if low != xlow + 1 { return false; } + if low != xlow + 1 { + return false; + } low = xlow; hi = xhi; - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } } let (low, hi) = it.size_hint(); low == 0 && hi == Some(0) @@ -329,13 +334,19 @@ fn exact_size(mut it: I) -> bool { fn exact_size_for_this(mut it: I) -> bool { // check every iteration let (mut low, mut hi) = it.size_hint(); - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } while let Some(_) = it.next() { let (xlow, xhi) = it.size_hint(); - if low != xlow + 1 { return false; } + if low != xlow + 1 { + return false; + } low = xlow; hi = xhi; - if Some(low) != hi { return false; } + if Some(low) != hi { + return false; + } } let (low, hi) = it.size_hint(); low == 0 && hi == Some(0) @@ -442,43 +453,10 @@ quickcheck! { assert_eq!(answer.into_iter().last(), a.multi_cartesian_product().last()); } - #[allow(deprecated)] - fn size_step(a: Iter, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let filt = a.clone().dedup(); - correct_size_hint(filt.step(s)) && - exact_size(a.step(s)) - } - - #[allow(deprecated)] - fn equal_step(a: Iter, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let mut i = 0; - itertools::equal(a.clone().step(s), a.filter(|_| { - let keep = i % s == 0; - i += 1; - keep - })) - } - - #[allow(deprecated)] - fn equal_step_vec(a: Vec, s: usize) -> bool { - let mut s = s; - if s == 0 { - s += 1; // never zero - } - let mut i = 0; - itertools::equal(a.iter().step(s), a.iter().filter(|_| { - let keep = i % s == 0; - i += 1; - keep - })) + fn correct_empty_multi_product() -> () { + let empty = Vec::>::new().into_iter().multi_cartesian_product(); + assert!(correct_size_hint(empty.clone())); + itertools::assert_equal(empty, std::iter::once(Vec::new())) } fn size_multipeek(a: Iter, s: u8) -> bool { @@ -596,6 +574,20 @@ quickcheck! { let b = &b[..len]; itertools::equal(zip_eq(a, b), zip(a, b)) } + + #[should_panic] + fn zip_eq_panics(a: Vec, b: Vec) -> TestResult { + if a.len() == b.len() { return TestResult::discard(); } + zip_eq(a.iter(), b.iter()).for_each(|_| {}); + TestResult::passed() // won't come here + } + + fn equal_positions(a: Vec) -> bool { + let with_pos = a.iter().positions(|v| v % 2 == 0); + let without = a.iter().enumerate().filter(|(_, v)| *v % 2 == 0).map(|(i, _)| i); + itertools::equal(with_pos.clone(), without.clone()) + && itertools::equal(with_pos.rev(), without.rev()) + } fn size_zip_longest(a: Iter, b: Iter) -> bool { let filt = a.clone().dedup(); let filt2 = b.clone().dedup(); @@ -750,6 +742,56 @@ quickcheck! { } } +quickcheck! { + fn correct_peek_nth(mut a: Vec) -> () { + let mut it = peek_nth(a.clone()); + for start_pos in 0..a.len() + 2 { + for real_idx in start_pos..a.len() + 2 { + let peek_idx = real_idx - start_pos; + assert_eq!(it.peek_nth(peek_idx), a.get(real_idx)); + assert_eq!(it.peek_nth_mut(peek_idx), a.get_mut(real_idx)); + } + assert_eq!(it.next(), a.get(start_pos).copied()); + } + } + + fn peek_nth_mut_replace(a: Vec, b: Vec) -> () { + let mut it = peek_nth(a.iter()); + for (i, m) in b.iter().enumerate().take(a.len().min(b.len())) { + *it.peek_nth_mut(i).unwrap() = m; + } + for (i, m) in a.iter().enumerate() { + assert_eq!(it.next().unwrap(), b.get(i).unwrap_or(m)); + } + assert_eq!(it.next(), None); + assert_eq!(it.next(), None); + } + + fn peek_nth_next_if(a: Vec) -> () { + let mut it = peek_nth(a.clone()); + for (idx, mut value) in a.iter().copied().enumerate() { + let should_be_none = it.next_if(|x| x != &value); + assert_eq!(should_be_none, None); + if value % 5 == 0 { + // Sometimes, peek up to 3 further. + let n = value as usize % 3; + let nth = it.peek_nth(n); + assert_eq!(nth, a.get(idx + n)); + } else if value % 5 == 1 { + // Sometimes, peek next element mutably. + if let Some(v) = it.peek_mut() { + *v = v.wrapping_sub(1); + let should_be_none = it.next_if_eq(&value); + assert_eq!(should_be_none, None); + value = value.wrapping_sub(1); + } + } + let eq = it.next_if_eq(&value); + assert_eq!(eq, Some(value)); + } + } +} + quickcheck! { fn dedup_via_coalesce(a: Vec) -> bool { let mut b = a.clone(); @@ -811,9 +853,8 @@ quickcheck! { quickcheck! { fn size_put_back(a: Vec, x: Option) -> bool { let mut it = put_back(a.into_iter()); - match x { - Some(t) => it.put_back(t), - None => {} + if let Some(t) = x { + it.put_back(t); } correct_size_hint(it) } @@ -829,6 +870,31 @@ quickcheck! { } } +quickcheck! { + fn merge_join_by_ordering_vs_bool(a: Vec, b: Vec) -> bool { + use either::Either; + use itertools::free::merge_join_by; + let mut has_equal = false; + let it_ord = merge_join_by(a.clone(), b.clone(), Ord::cmp).flat_map(|v| match v { + EitherOrBoth::Both(l, r) => { + has_equal = true; + vec![Either::Left(l), Either::Right(r)] + } + EitherOrBoth::Left(l) => vec![Either::Left(l)], + EitherOrBoth::Right(r) => vec![Either::Right(r)], + }); + let it_bool = merge_join_by(a, b, PartialOrd::le); + itertools::equal(it_ord, it_bool) || has_equal + } + fn merge_join_by_bool_unwrapped_is_merge_by(a: Vec, b: Vec) -> bool { + use either::Either; + use itertools::free::merge_join_by; + let it = a.clone().into_iter().merge_by(b.clone(), PartialOrd::ge); + let it_join = merge_join_by(a, b, PartialOrd::ge).map(Either::into_inner); + itertools::equal(it, it_join) + } +} + quickcheck! { fn size_tee(a: Vec) -> bool { let (mut t1, mut t2) = a.iter().tee(); @@ -870,8 +936,31 @@ quickcheck! { } quickcheck! { - fn size_combinations(it: Iter) -> bool { - correct_size_hint(it.tuple_combinations::<(_, _)>()) + fn size_combinations(a: Iter) -> bool { + let it = a.clone().tuple_combinations::<(_, _)>(); + correct_size_hint(it.clone()) && it.count() == binomial(a.count(), 2) + } + + fn exact_size_combinations_1(a: Vec) -> bool { + let it = a.iter().tuple_combinations::<(_,)>(); + exact_size_for_this(it.clone()) && it.count() == binomial(a.len(), 1) + } + fn exact_size_combinations_2(a: Vec) -> bool { + let it = a.iter().tuple_combinations::<(_, _)>(); + exact_size_for_this(it.clone()) && it.count() == binomial(a.len(), 2) + } + fn exact_size_combinations_3(mut a: Vec) -> bool { + a.truncate(15); + let it = a.iter().tuple_combinations::<(_, _, _)>(); + exact_size_for_this(it.clone()) && it.count() == binomial(a.len(), 3) + } +} + +fn binomial(n: usize, k: usize) -> usize { + if k > n { + 0 + } else { + (n - k + 1..=n).product::() / (1..=k).product::() } } @@ -887,7 +976,7 @@ quickcheck! { } } } - cmb.next() == None + cmb.next().is_none() } } @@ -936,63 +1025,74 @@ quickcheck! { } quickcheck! { - fn fuzz_group_by_lazy_1(it: Iter) -> bool { + fn fuzz_chunk_by_lazy_1(it: Iter) -> bool { let jt = it.clone(); - let groups = it.group_by(|k| *k); - itertools::equal(jt, groups.into_iter().flat_map(|(_, x)| x)) + let chunks = it.chunk_by(|k| *k); + itertools::equal(jt, chunks.into_iter().flat_map(|(_, x)| x)) } } quickcheck! { - fn fuzz_group_by_lazy_2(data: Vec) -> bool { - let groups = data.iter().group_by(|k| *k / 10); - let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); + fn fuzz_chunk_by_lazy_2(data: Vec) -> bool { + let chunks = data.iter().chunk_by(|k| *k / 10); + let res = itertools::equal(data.iter(), chunks.into_iter().flat_map(|(_, x)| x)); res } } quickcheck! { - fn fuzz_group_by_lazy_3(data: Vec) -> bool { - let grouper = data.iter().group_by(|k| *k / 10); - let groups = grouper.into_iter().collect_vec(); - let res = itertools::equal(data.iter(), groups.into_iter().flat_map(|(_, x)| x)); + fn fuzz_chunk_by_lazy_3(data: Vec) -> bool { + let grouper = data.iter().chunk_by(|k| *k / 10); + let chunks = grouper.into_iter().collect_vec(); + let res = itertools::equal(data.iter(), chunks.into_iter().flat_map(|(_, x)| x)); res } } quickcheck! { - fn fuzz_group_by_lazy_duo(data: Vec, order: Vec<(bool, bool)>) -> bool { - let grouper = data.iter().group_by(|k| *k / 3); - let mut groups1 = grouper.into_iter(); - let mut groups2 = grouper.into_iter(); + fn fuzz_chunk_by_lazy_duo(data: Vec, order: Vec<(bool, bool)>) -> bool { + let grouper = data.iter().chunk_by(|k| *k / 3); + let mut chunks1 = grouper.into_iter(); + let mut chunks2 = grouper.into_iter(); let mut elts = Vec::<&u8>::new(); - let mut old_groups = Vec::new(); + let mut old_chunks = Vec::new(); let tup1 = |(_, b)| b; for &(ord, consume_now) in &order { - let iter = &mut [&mut groups1, &mut groups2][ord as usize]; + let iter = &mut [&mut chunks1, &mut chunks2][ord as usize]; match iter.next() { Some((_, gr)) => if consume_now { - for og in old_groups.drain(..) { + for og in old_chunks.drain(..) { elts.extend(og); } elts.extend(gr); } else { - old_groups.push(gr); + old_chunks.push(gr); }, None => break, } } - for og in old_groups.drain(..) { + for og in old_chunks.drain(..) { elts.extend(og); } - for gr in groups1.map(&tup1) { elts.extend(gr); } - for gr in groups2.map(&tup1) { elts.extend(gr); } + for gr in chunks1.map(&tup1) { elts.extend(gr); } + for gr in chunks2.map(&tup1) { elts.extend(gr); } itertools::assert_equal(&data, elts); true } } +quickcheck! { + fn chunk_clone_equal(a: Vec, size: u8) -> () { + let mut size = size; + if size == 0 { + size += 1; + } + let it = a.chunks(size as usize); + itertools::assert_equal(it.clone(), it); + } +} + quickcheck! { fn equal_chunks_lazy(a: Vec, size: u8) -> bool { let mut size = size; @@ -1010,7 +1110,75 @@ quickcheck! { } } +// tuple iterators quickcheck! { + fn equal_circular_tuple_windows_1(a: Vec) -> bool { + let x = a.iter().map(|e| (e,) ); + let y = a.iter().circular_tuple_windows::<(_,)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_2(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_3(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + &a[(start_idx + 2) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_circular_tuple_windows_4(a: Vec) -> bool { + let x = (0..a.len()).map(|start_idx| ( + &a[start_idx], + &a[(start_idx + 1) % a.len()], + &a[(start_idx + 2) % a.len()], + &a[(start_idx + 3) % a.len()], + )); + let y = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows(a: Vec) -> bool { + let x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows_noninitial(a: Vec) -> bool { + let mut x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + let _ = x.next(); + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn equal_cloned_circular_tuple_windows_complete(a: Vec) -> bool { + let mut x = a.iter().circular_tuple_windows::<(_, _, _, _)>(); + for _ in x.by_ref() {} + let y = x.clone(); + itertools::assert_equal(x,y); + true + } + + fn circular_tuple_windows_exact_size(a: Vec) -> bool { + exact_size(a.iter().circular_tuple_windows::<(_, _, _, _)>()) + } + fn equal_tuple_windows_1(a: Vec) -> bool { let x = a.windows(1).map(|s| (&s[0], )); let y = a.iter().tuple_windows::<(_,)>(); @@ -1035,6 +1203,14 @@ quickcheck! { itertools::equal(x, y) } + fn tuple_windows_exact_size_1(a: Vec) -> bool { + exact_size(a.iter().tuple_windows::<(_,)>()) + } + + fn tuple_windows_exact_size_4(a: Vec) -> bool { + exact_size(a.iter().tuple_windows::<(_, _, _, _)>()) + } + fn equal_tuples_1(a: Vec) -> bool { let x = a.chunks(1).map(|s| (&s[0], )); let y = a.iter().tuples::<(_,)>(); @@ -1066,6 +1242,18 @@ quickcheck! { assert_eq!(buffer.len(), a.len() % 4); exact_size(buffer) } + + fn tuples_size_hint_inexact(a: Iter) -> bool { + correct_size_hint(a.clone().tuples::<(_,)>()) + && correct_size_hint(a.clone().tuples::<(_, _)>()) + && correct_size_hint(a.tuples::<(_, _, _, _)>()) + } + + fn tuples_size_hint_exact(a: Iter) -> bool { + exact_size(a.clone().tuples::<(_,)>()) + && exact_size(a.clone().tuples::<(_, _)>()) + && exact_size(a.tuples::<(_, _, _, _)>()) + } } // with_position @@ -1097,14 +1285,14 @@ quickcheck! { #[derive(Clone, Debug, PartialEq, Eq)] struct Val(u32, u32); -impl PartialOrd for Val { - fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) +impl PartialOrd for Val { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) } } impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } @@ -1112,10 +1300,10 @@ impl Ord for Val { impl qc::Arbitrary for Val { fn arbitrary(g: &mut G) -> Self { let (x, y) = <(u32, u32)>::arbitrary(g); - Val(x, y) + Self(x, y) } fn shrink(&self) -> Box> { - Box::new((self.0, self.1).shrink().map(|(x, y)| Val(x, y))) + Box::new((self.0, self.1).shrink().map(|(x, y)| Self(x, y))) } } @@ -1157,13 +1345,12 @@ quickcheck! { } quickcheck! { - #[allow(deprecated)] - fn tree_fold1_f64(mut a: Vec) -> TestResult { + fn tree_reduce_f64(mut a: Vec) -> TestResult { fn collapse_adjacent(x: Vec, mut f: F) -> Vec where F: FnMut(f64, f64) -> f64 { let mut out = Vec::new(); - for i in (0..x.len()).step(2) { + for i in (0..x.len()).step_by(2) { if i == x.len()-1 { out.push(x[i]) } else { @@ -1177,7 +1364,7 @@ quickcheck! { return TestResult::discard(); } - let actual = a.iter().cloned().tree_fold1(f64::atan2); + let actual = a.iter().cloned().tree_reduce(f64::atan2); while a.len() > 1 { a = collapse_adjacent(a, f64::atan2); @@ -1202,7 +1389,7 @@ quickcheck! { fn at_most_one_i32(a: Vec) -> TestResult { let ret = a.iter().cloned().at_most_one(); match a.len() { - 0 => TestResult::from_bool(ret.unwrap() == None), + 0 => TestResult::from_bool(ret.unwrap().is_none()), 1 => TestResult::from_bool(ret.unwrap() == Some(a[0])), _ => TestResult::from_bool(ret.unwrap_err().eq(a.iter().cloned())), } @@ -1232,7 +1419,7 @@ quickcheck! { Some(acc.unwrap_or(0) + val) } }); - + let group_map_lookup = a.iter() .map(|&b| b as u64) .map(|i| (i % modulo, i)) @@ -1252,7 +1439,7 @@ quickcheck! { for m in 0..modulo { assert_eq!( - lookup.get(&m).copied(), + lookup.get(&m).copied(), a.iter() .map(|&b| b as u64) .filter(|&val| val % modulo == m) @@ -1267,6 +1454,35 @@ quickcheck! { } } + fn correct_grouping_map_by_fold_with_modulo_key(a: Vec, modulo: u8) -> () { + #[derive(Debug, Default, PartialEq)] + struct Accumulator { + acc: u64, + } + + let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` + let lookup = a.iter().map(|&b| b as u64) // Avoid overflows + .into_grouping_map_by(|i| i % modulo) + .fold_with(|_key, _val| Default::default(), |Accumulator { acc }, &key, val| { + assert!(val % modulo == key); + let acc = acc + val; + Accumulator { acc } + }); + + let group_map_lookup = a.iter() + .map(|&b| b as u64) + .map(|i| (i % modulo, i)) + .into_group_map() + .into_iter() + .map(|(key, vals)| (key, vals.into_iter().sum())).map(|(key, acc)| (key,Accumulator { acc })) + .collect::>(); + assert_eq!(lookup, group_map_lookup); + + for (&key, &Accumulator { acc: sum }) in lookup.iter() { + assert_eq!(sum, a.iter().map(|&b| b as u64).filter(|&val| val % modulo == key).sum::()); + } + } + fn correct_grouping_map_by_fold_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` let lookup = a.iter().map(|&b| b as u64) // Avoid overflows @@ -1290,22 +1506,21 @@ quickcheck! { } } - fn correct_grouping_map_by_fold_first_modulo_key(a: Vec, modulo: u8) -> () { + fn correct_grouping_map_by_reduce_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo } as u64; // Avoid `% 0` let lookup = a.iter().map(|&b| b as u64) // Avoid overflows .into_grouping_map_by(|i| i % modulo) - .fold_first(|acc, &key, val| { + .reduce(|acc, &key, val| { assert!(val % modulo == key); acc + val }); - // TODO: Swap `fold1` with stdlib's `fold_first` when it's stabilized let group_map_lookup = a.iter() .map(|&b| b as u64) .map(|i| (i % modulo, i)) .into_group_map() .into_iter() - .map(|(key, vals)| (key, vals.into_iter().fold1(|acc, val| acc + val).unwrap())) + .map(|(key, vals)| (key, vals.into_iter().reduce(|acc, val| acc + val).unwrap())) .collect::>(); assert_eq!(lookup, group_map_lookup); @@ -1372,7 +1587,7 @@ quickcheck! { assert_eq!(Some(max), a.iter().copied().filter(|&val| val % modulo == key).max_by_key(|&val| val)); } } - + fn correct_grouping_map_by_min_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).min(); @@ -1423,7 +1638,7 @@ quickcheck! { assert_eq!(Some(min), a.iter().copied().filter(|&val| val % modulo == key).min_by_key(|&val| val)); } } - + fn correct_grouping_map_by_minmax_modulo_key(a: Vec, modulo: u8) -> () { let modulo = if modulo == 0 { 1 } else { modulo }; // Avoid `% 0` let lookup = a.iter().copied().into_grouping_map_by(|i| i % modulo).minmax(); @@ -1536,7 +1751,7 @@ quickcheck! { .min_by(|_, _, _| Ordering::Equal); assert_eq!(lookup[&0], 0); - + let lookup = (0..=10) .into_grouping_map_by(|_| 0) .minmax_by(|_, _, _| Ordering::Equal); @@ -1594,12 +1809,10 @@ quickcheck! { } } - -fn is_fused(mut it: I) -> bool -{ +fn is_fused(mut it: I) -> bool { for _ in it.by_ref() {} - for _ in 0..10{ - if it.next().is_some(){ + for _ in 0..10 { + if it.next().is_some() { return false; } } @@ -1640,7 +1853,7 @@ quickcheck! { !is_fused(a.clone().interleave_shortest(b.clone())) && is_fused(a.fuse().interleave_shortest(b.fuse())) } - + fn fused_product(a: Iter, b: Iter) -> bool { is_fused(a.fuse().cartesian_product(b.fuse())) @@ -1746,4 +1959,11 @@ quickcheck! { result_set.is_empty() } } + + fn tail(v: Vec, n: u8) -> bool { + let n = n as usize; + let result = &v[v.len().saturating_sub(n)..]; + itertools::equal(v.iter().tail(n), result) + && itertools::equal(v.iter().filter(|_| true).tail(n), result) + } } diff --git a/third_party/rust/itertools/tests/specializations.rs b/third_party/rust/itertools/tests/specializations.rs index 057e11c9f67..e6694c8e7a3 100644 --- a/third_party/rust/itertools/tests/specializations.rs +++ b/third_party/rust/itertools/tests/specializations.rs @@ -1,8 +1,20 @@ +//! Test specializations of methods with default impls match the behavior of the +//! default impls. +//! +//! **NOTE:** Due to performance limitations, these tests are not run with miri! +//! They cannot be relied upon to discover soundness issues. + +#![cfg(not(miri))] +#![allow(unstable_name_collisions)] + use itertools::Itertools; +use quickcheck::Arbitrary; +use quickcheck::{quickcheck, TestResult}; +use rand::Rng; use std::fmt::Debug; -use quickcheck::quickcheck; struct Unspecialized(I); + impl Iterator for Unspecialized where I: Iterator, @@ -15,30 +27,41 @@ where } } -macro_rules! check_specialized { - ($src:expr, |$it:pat| $closure:expr) => { - let $it = $src.clone(); - let v1 = $closure; - - let $it = Unspecialized($src.clone()); - let v2 = $closure; - - assert_eq!(v1, v2); +impl DoubleEndedIterator for Unspecialized +where + I: DoubleEndedIterator, +{ + #[inline(always)] + fn next_back(&mut self) -> Option { + self.0.next_back() } } -fn test_specializations( - it: &Iter, -) where - IterItem: Eq + Debug + Clone, - Iter: Iterator + Clone, +fn test_specializations(it: &I) +where + I::Item: Eq + Debug + Clone, + I: Iterator + Clone, { + macro_rules! check_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + // Many iterators special-case the first elements, so we test specializations for iterators that have already been advanced. + let mut src = $src.clone(); + for _ in 0..5 { + let $it = src.clone(); + let v1 = $closure; + let $it = Unspecialized(src.clone()); + let v2 = $closure; + assert_eq!(v1, v2); + src.next(); + } + } + } check_specialized!(it, |i| i.count()); check_specialized!(it, |i| i.last()); check_specialized!(it, |i| i.collect::>()); check_specialized!(it, |i| { let mut parameters_from_fold = vec![]; - let fold_result = i.fold(vec![], |mut acc, v: IterItem| { + let fold_result = i.fold(vec![], |mut acc, v: I::Item| { parameters_from_fold.push((acc.clone(), v.clone())); acc.push(v); acc @@ -50,7 +73,7 @@ fn test_specializations( let first = i.next(); let all_result = i.all(|x| { parameters_from_all.push(x.clone()); - Some(x)==first + Some(x) == first }); (parameters_from_all, all_result) }); @@ -72,10 +95,270 @@ fn test_specializations( } } +fn test_double_ended_specializations(it: &I) +where + I::Item: Eq + Debug + Clone, + I: DoubleEndedIterator + Clone, +{ + macro_rules! check_specialized { + ($src:expr, |$it:pat| $closure:expr) => { + // Many iterators special-case the first elements, so we test specializations for iterators that have already been advanced. + let mut src = $src.clone(); + for step in 0..8 { + let $it = src.clone(); + let v1 = $closure; + let $it = Unspecialized(src.clone()); + let v2 = $closure; + assert_eq!(v1, v2); + if step % 2 == 0 { + src.next(); + } else { + src.next_back(); + } + } + } + } + check_specialized!(it, |i| { + let mut parameters_from_rfold = vec![]; + let rfold_result = i.rfold(vec![], |mut acc, v: I::Item| { + parameters_from_rfold.push((acc.clone(), v.clone())); + acc.push(v); + acc + }); + (parameters_from_rfold, rfold_result) + }); + let size = it.clone().count(); + for n in 0..size + 2 { + check_specialized!(it, |mut i| i.nth_back(n)); + } +} + quickcheck! { + fn interleave(v: Vec, w: Vec) -> () { + test_specializations(&v.iter().interleave(w.iter())); + } + + fn interleave_shortest(v: Vec, w: Vec) -> () { + test_specializations(&v.iter().interleave_shortest(w.iter())); + } + + fn batching(v: Vec) -> () { + test_specializations(&v.iter().batching(Iterator::next)); + } + + fn tuple_windows(v: Vec) -> () { + test_specializations(&v.iter().tuple_windows::<(_,)>()); + test_specializations(&v.iter().tuple_windows::<(_, _)>()); + test_specializations(&v.iter().tuple_windows::<(_, _, _)>()); + } + + fn circular_tuple_windows(v: Vec) -> () { + test_specializations(&v.iter().circular_tuple_windows::<(_,)>()); + test_specializations(&v.iter().circular_tuple_windows::<(_, _)>()); + test_specializations(&v.iter().circular_tuple_windows::<(_, _, _)>()); + } + + fn tuples(v: Vec) -> () { + test_specializations(&v.iter().tuples::<(_,)>()); + test_specializations(&v.iter().tuples::<(_, _)>()); + test_specializations(&v.iter().tuples::<(_, _, _)>()); + } + + fn cartesian_product(a: Vec, b: Vec) -> TestResult { + if a.len() * b.len() > 100 { + return TestResult::discard(); + } + test_specializations(&a.iter().cartesian_product(&b)); + TestResult::passed() + } + + fn multi_cartesian_product(a: Vec, b: Vec, c: Vec) -> TestResult { + if a.len() * b.len() * c.len() > 100 { + return TestResult::discard(); + } + test_specializations(&vec![a, b, c].into_iter().multi_cartesian_product()); + TestResult::passed() + } + + fn coalesce(v: Vec) -> () { + test_specializations(&v.iter().coalesce(|x, y| if x == y { Ok(x) } else { Err((x, y)) })) + } + + fn dedup(v: Vec) -> () { + test_specializations(&v.iter().dedup()) + } + + fn dedup_by(v: Vec) -> () { + test_specializations(&v.iter().dedup_by(PartialOrd::ge)) + } + + fn dedup_with_count(v: Vec) -> () { + test_specializations(&v.iter().dedup_with_count()) + } + + fn dedup_by_with_count(v: Vec) -> () { + test_specializations(&v.iter().dedup_by_with_count(PartialOrd::ge)) + } + + fn duplicates(v: Vec) -> () { + let it = v.iter().duplicates(); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn duplicates_by(v: Vec) -> () { + let it = v.iter().duplicates_by(|x| *x % 10); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn unique(v: Vec) -> () { + let it = v.iter().unique(); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn unique_by(v: Vec) -> () { + let it = v.iter().unique_by(|x| *x % 50); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn take_while_inclusive(v: Vec) -> () { + test_specializations(&v.iter().copied().take_while_inclusive(|&x| x < 100)); + } + + fn while_some(v: Vec) -> () { + test_specializations(&v.iter().map(|&x| if x < 100 { Some(2 * x) } else { None }).while_some()); + } + + fn pad_using(v: Vec) -> () { + use std::convert::TryFrom; + let it = v.iter().copied().pad_using(10, |i| u8::try_from(5 * i).unwrap_or(u8::MAX)); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn with_position(v: Vec) -> () { + test_specializations(&v.iter().with_position()); + } + + fn positions(v: Vec) -> () { + let it = v.iter().positions(|x| x % 5 == 0); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn update(v: Vec) -> () { + let it = v.iter().copied().update(|x| *x = x.wrapping_mul(7)); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn tuple_combinations(v: Vec) -> TestResult { + if v.len() > 10 { + return TestResult::discard(); + } + test_specializations(&v.iter().tuple_combinations::<(_,)>()); + test_specializations(&v.iter().tuple_combinations::<(_, _)>()); + test_specializations(&v.iter().tuple_combinations::<(_, _, _)>()); + TestResult::passed() + } + fn intersperse(v: Vec) -> () { test_specializations(&v.into_iter().intersperse(0)); } + + fn intersperse_with(v: Vec) -> () { + test_specializations(&v.into_iter().intersperse_with(|| 0)); + } + + fn array_combinations(v: Vec) -> TestResult { + if v.len() > 10 { + return TestResult::discard(); + } + test_specializations(&v.iter().array_combinations::<1>()); + test_specializations(&v.iter().array_combinations::<2>()); + test_specializations(&v.iter().array_combinations::<3>()); + TestResult::passed() + } + + fn combinations(a: Vec, n: u8) -> TestResult { + if n > 3 || a.len() > 8 { + return TestResult::discard(); + } + test_specializations(&a.iter().combinations(n as usize)); + TestResult::passed() + } + + fn combinations_with_replacement(a: Vec, n: u8) -> TestResult { + if n > 3 || a.len() > 7 { + return TestResult::discard(); + } + test_specializations(&a.iter().combinations_with_replacement(n as usize)); + TestResult::passed() + } + + fn permutations(a: Vec, n: u8) -> TestResult { + if n > 3 || a.len() > 8 { + return TestResult::discard(); + } + test_specializations(&a.iter().permutations(n as usize)); + TestResult::passed() + } + + fn powerset(a: Vec) -> TestResult { + if a.len() > 6 { + return TestResult::discard(); + } + test_specializations(&a.iter().powerset()); + TestResult::passed() + } + + fn zip_longest(a: Vec, b: Vec) -> () { + let it = a.into_iter().zip_longest(b); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn zip_eq(a: Vec) -> () { + test_specializations(&a.iter().zip_eq(a.iter().rev())) + } + + fn multizip(a: Vec) -> () { + let it = itertools::multizip((a.iter(), a.iter().rev(), a.iter().take(50))); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn izip(a: Vec, b: Vec) -> () { + test_specializations(&itertools::izip!(b.iter(), a, b.iter().rev())); + } + + fn iproduct(a: Vec, b: Vec, c: Vec) -> TestResult { + if a.len() * b.len() * c.len() > 200 { + return TestResult::discard(); + } + test_specializations(&itertools::iproduct!(a, b.iter(), c)); + TestResult::passed() + } + + fn repeat_n(element: i8, n: u8) -> () { + let it = itertools::repeat_n(element, n as usize); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn exactly_one_error(v: Vec) -> TestResult { + // Use `at_most_one` would be similar. + match v.iter().exactly_one() { + Ok(_) => TestResult::discard(), + Err(it) => { + test_specializations(&it); + TestResult::passed() + } + } + } } quickcheck! { @@ -85,32 +368,128 @@ quickcheck! { pb.put_back(1); test_specializations(&pb); } + + fn put_back_n(v: Vec, n: u8) -> () { + let mut it = itertools::put_back_n(v); + for k in 0..n { + it.put_back(k); + } + test_specializations(&it); + } + + fn multipeek(v: Vec, n: u8) -> () { + let mut it = v.into_iter().multipeek(); + for _ in 0..n { + it.peek(); + } + test_specializations(&it); + } + + fn peek_nth_with_peek(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + for _ in 0..n { + it.peek(); + } + test_specializations(&it); + } + + fn peek_nth_with_peek_nth(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + it.peek_nth(n as usize); + test_specializations(&it); + } + + fn peek_nth_with_peek_mut(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + for _ in 0..n { + if let Some(x) = it.peek_mut() { + *x = x.wrapping_add(50); + } + } + test_specializations(&it); + } + + fn peek_nth_with_peek_nth_mut(v: Vec, n: u8) -> () { + let mut it = itertools::peek_nth(v); + if let Some(x) = it.peek_nth_mut(n as usize) { + *x = x.wrapping_add(50); + } + test_specializations(&it); + } } quickcheck! { - fn merge_join_by_qc(i1: Vec, i2: Vec) -> () { - test_specializations(&i1.into_iter().merge_join_by(i2.into_iter(), std::cmp::Ord::cmp)); + fn merge(a: Vec, b: Vec) -> () { + test_specializations(&a.into_iter().merge(b)) + } + + fn merge_by(a: Vec, b: Vec) -> () { + test_specializations(&a.into_iter().merge_by(b, PartialOrd::ge)) + } + + fn merge_join_by_ordering(i1: Vec, i2: Vec) -> () { + test_specializations(&i1.into_iter().merge_join_by(i2, Ord::cmp)); + } + + fn merge_join_by_bool(i1: Vec, i2: Vec) -> () { + test_specializations(&i1.into_iter().merge_join_by(i2, PartialOrd::ge)); + } + + fn kmerge(a: Vec, b: Vec, c: Vec) -> () { + test_specializations(&vec![a, b, c] + .into_iter() + .map(|v| v.into_iter().sorted()) + .kmerge()); + } + + fn kmerge_by(a: Vec, b: Vec, c: Vec) -> () { + test_specializations(&vec![a, b, c] + .into_iter() + .map(|v| v.into_iter().sorted_by_key(|a| a.abs())) + .kmerge_by(|a, b| a.abs() < b.abs())); } } quickcheck! { fn map_into(v: Vec) -> () { - test_specializations(&v.into_iter().map_into::()); + let it = v.into_iter().map_into::(); + test_specializations(&it); + test_double_ended_specializations(&it); } -} -quickcheck! { fn map_ok(v: Vec>) -> () { - test_specializations(&v.into_iter().map_ok(|u| u.checked_add(1))); + let it = v.into_iter().map_ok(|u| u.checked_add(1)); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn filter_ok(v: Vec>) -> () { + let it = v.into_iter().filter_ok(|&i| i < 20); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + fn filter_map_ok(v: Vec>) -> () { + let it = v.into_iter().filter_map_ok(|i| if i < 20 { Some(i * 2) } else { None }); + test_specializations(&it); + test_double_ended_specializations(&it); + } + + // `SmallIter2` because `Vec` is too slow and we get bad coverage from a singleton like Option + fn flatten_ok(v: Vec, char>>) -> () { + let it = v.into_iter().flatten_ok(); + test_specializations(&it); + test_double_ended_specializations(&it); } } quickcheck! { + // TODO Replace this function by a normal call to test_specializations fn process_results(v: Vec>) -> () { helper(v.iter().copied()); helper(v.iter().copied().filter(Result::is_ok)); - fn helper(it: impl Iterator> + Clone) { + fn helper(it: impl DoubleEndedIterator> + Clone) { macro_rules! check_results_specialized { ($src:expr, |$it:pat| $closure:expr) => { assert_eq!( @@ -126,6 +505,7 @@ quickcheck! { check_results_specialized!(it, |i| i.count()); check_results_specialized!(it, |i| i.last()); check_results_specialized!(it, |i| i.collect::>()); + check_results_specialized!(it, |i| i.rev().collect::>()); check_results_specialized!(it, |i| { let mut parameters_from_fold = vec![]; let fold_result = i.fold(vec![], |mut acc, v| { @@ -135,6 +515,15 @@ quickcheck! { }); (parameters_from_fold, fold_result) }); + check_results_specialized!(it, |i| { + let mut parameters_from_rfold = vec![]; + let rfold_result = i.rfold(vec![], |mut acc, v| { + parameters_from_rfold.push((acc.clone(), v)); + acc.push(v); + acc + }); + (parameters_from_rfold, rfold_result) + }); check_results_specialized!(it, |mut i| { let mut parameters_from_all = vec![]; let first = i.next(); @@ -148,6 +537,67 @@ quickcheck! { for n in 0..size + 2 { check_results_specialized!(it, |mut i| i.nth(n)); } + for n in 0..size + 2 { + check_results_specialized!(it, |mut i| i.nth_back(n)); + } + } + } +} + +/// Like `VecIntoIter` with maximum 2 elements. +#[derive(Debug, Clone, Default)] +enum SmallIter2 { + #[default] + Zero, + One(T), + Two(T, T), +} + +impl Arbitrary for SmallIter2 { + fn arbitrary(g: &mut G) -> Self { + match g.gen_range(0u8, 3) { + 0 => Self::Zero, + 1 => Self::One(T::arbitrary(g)), + 2 => Self::Two(T::arbitrary(g), T::arbitrary(g)), + _ => unreachable!(), + } + } + // maybe implement shrink too, maybe not +} + +impl Iterator for SmallIter2 { + type Item = T; + + fn next(&mut self) -> Option { + match std::mem::take(self) { + Self::Zero => None, + Self::One(val) => Some(val), + Self::Two(val, second) => { + *self = Self::One(second); + Some(val) + } + } + } + + fn size_hint(&self) -> (usize, Option) { + let len = match self { + Self::Zero => 0, + Self::One(_) => 1, + Self::Two(_, _) => 2, + }; + (len, Some(len)) + } +} + +impl DoubleEndedIterator for SmallIter2 { + fn next_back(&mut self) -> Option { + match std::mem::take(self) { + Self::Zero => None, + Self::One(val) => Some(val), + Self::Two(first, val) => { + *self = Self::One(first); + Some(val) + } } } } diff --git a/third_party/rust/itertools/tests/test_core.rs b/third_party/rust/itertools/tests/test_core.rs index df94eb665fe..4936160850d 100644 --- a/third_party/rust/itertools/tests/test_core.rs +++ b/third_party/rust/itertools/tests/test_core.rs @@ -4,18 +4,71 @@ //! option. This file may not be copied, modified, or distributed //! except according to those terms. #![no_std] +#![allow(deprecated)] -use core::iter; -use itertools as it; -use crate::it::Itertools; +use crate::it::chain; +use crate::it::free::put_back; use crate::it::interleave; use crate::it::intersperse; use crate::it::intersperse_with; -use crate::it::multizip; -use crate::it::free::put_back; use crate::it::iproduct; use crate::it::izip; -use crate::it::chain; +use crate::it::multizip; +use crate::it::Itertools; +use core::iter; +use itertools as it; + +#[allow(dead_code)] +fn get_esi_then_esi(it: I) { + fn is_esi(_: impl ExactSizeIterator) {} + is_esi(it.clone().get(1..4)); + is_esi(it.clone().get(1..=4)); + is_esi(it.clone().get(1..)); + is_esi(it.clone().get(..4)); + is_esi(it.clone().get(..=4)); + is_esi(it.get(..)); +} + +#[allow(dead_code)] +fn get_dei_esi_then_dei_esi(it: I) { + fn is_dei_esi(_: impl DoubleEndedIterator + ExactSizeIterator) {} + is_dei_esi(it.clone().get(1..4)); + is_dei_esi(it.clone().get(1..=4)); + is_dei_esi(it.clone().get(1..)); + is_dei_esi(it.clone().get(..4)); + is_dei_esi(it.clone().get(..=4)); + is_dei_esi(it.get(..)); +} + +#[test] +fn get_1_max() { + let mut it = (0..5).get(1..=usize::MAX); + assert_eq!(it.next(), Some(1)); + assert_eq!(it.next_back(), Some(4)); +} + +#[test] +#[should_panic] +fn get_full_range_inclusive() { + let _it = (0..5).get(0..=usize::MAX); +} + +#[test] +fn product0() { + let mut prod = iproduct!(); + assert_eq!(prod.next(), Some(())); + assert!(prod.next().is_none()); +} + +#[test] +fn iproduct1() { + let s = "αβ"; + + let mut prod = iproduct!(s.chars()); + assert_eq!(prod.next(), Some(('α',))); + assert_eq!(prod.next(), Some(('β',))); + assert!(prod.next().is_none()); +} #[test] fn product2() { @@ -26,7 +79,7 @@ fn product2() { assert!(prod.next() == Some(('α', 1))); assert!(prod.next() == Some(('β', 0))); assert!(prod.next() == Some(('β', 1))); - assert!(prod.next() == None); + assert!(prod.next().is_none()); } #[test] @@ -34,13 +87,12 @@ fn product_temporary() { for (_x, _y, _z) in iproduct!( [0, 1, 2].iter().cloned(), [0, 1, 2].iter().cloned(), - [0, 1, 2].iter().cloned()) - { + [0, 1, 2].iter().cloned() + ) { // ok } } - #[test] fn izip_macro() { let mut zip = izip!(2..3); @@ -61,7 +113,7 @@ fn izip_macro() { #[test] fn izip2() { let _zip1: iter::Zip<_, _> = izip!(1.., 2..); - let _zip2: iter::Zip<_, _> = izip!(1.., 2.., ); + let _zip2: iter::Zip<_, _> = izip!(1.., 2..,); } #[test] @@ -109,7 +161,7 @@ fn chain_macro() { #[test] fn chain2() { let _ = chain!(1.., 2..); - let _ = chain!(1.., 2.., ); + let _ = chain!(1.., 2..,); } #[test] @@ -127,7 +179,7 @@ fn write_to() { #[test] fn test_interleave() { - let xs: [u8; 0] = []; + let xs: [u8; 0] = []; let ys = [7u8, 9, 8, 10]; let zs = [2u8, 77]; let it = interleave(xs.iter(), ys.iter()); @@ -155,15 +207,6 @@ fn test_intersperse_with() { it::assert_equal(it, ys.iter()); } -#[allow(deprecated)] -#[test] -fn foreach() { - let xs = [1i32, 2, 3]; - let mut sum = 0; - xs.iter().foreach(|elt| sum += *elt); - assert!(sum == 6); -} - #[test] fn dropping() { let xs = [1, 2, 3]; @@ -197,21 +240,11 @@ fn test_put_back() { it::assert_equal(pb, xs.iter().cloned()); } -#[allow(deprecated)] -#[test] -fn step() { - it::assert_equal((0..10).step(1), 0..10); - it::assert_equal((0..10).step(2), (0..10).filter(|x: &i32| *x % 2 == 0)); - it::assert_equal((0..10).step(10), 0..1); -} - -#[allow(deprecated)] #[test] fn merge() { - it::assert_equal((0..10).step(2).merge((1..10).step(2)), 0..10); + it::assert_equal((0..10).step_by(2).merge((1..10).step_by(2)), 0..10); } - #[test] fn repeatn() { let s = "α"; @@ -231,29 +264,33 @@ fn count_clones() { use core::cell::Cell; #[derive(PartialEq, Debug)] struct Foo { - n: Cell + n: Cell, } - impl Clone for Foo - { - fn clone(&self) -> Self - { + impl Clone for Foo { + fn clone(&self) -> Self { let n = self.n.get(); self.n.set(n + 1); - Foo { n: Cell::new(n + 1) } + Self { + n: Cell::new(n + 1), + } } } - for n in 0..10 { - let f = Foo{n: Cell::new(0)}; + let f = Foo { n: Cell::new(0) }; let it = it::repeat_n(f, n); // drain it let last = it.last(); if n == 0 { assert_eq!(last, None); } else { - assert_eq!(last, Some(Foo{n: Cell::new(n - 1)})); + assert_eq!( + last, + Some(Foo { + n: Cell::new(n - 1) + }) + ); } } } @@ -276,25 +313,45 @@ fn part() { } #[test] -fn tree_fold1() { +fn tree_reduce() { for i in 0..100 { - assert_eq!((0..i).tree_fold1(|x, y| x + y), (0..i).fold1(|x, y| x + y)); + assert_eq!((0..i).tree_reduce(|x, y| x + y), (0..i).fold1(|x, y| x + y)); } } #[test] fn exactly_one() { assert_eq!((0..10).filter(|&x| x == 2).exactly_one().unwrap(), 2); - assert!((0..10).filter(|&x| x > 1 && x < 4).exactly_one().unwrap_err().eq(2..4)); - assert!((0..10).filter(|&x| x > 1 && x < 5).exactly_one().unwrap_err().eq(2..5)); - assert!((0..10).filter(|&_| false).exactly_one().unwrap_err().eq(0..0)); + assert!((0..10) + .filter(|&x| x > 1 && x < 4) + .exactly_one() + .unwrap_err() + .eq(2..4)); + assert!((0..10) + .filter(|&x| x > 1 && x < 5) + .exactly_one() + .unwrap_err() + .eq(2..5)); + assert!((0..10) + .filter(|&_| false) + .exactly_one() + .unwrap_err() + .eq(0..0)); } #[test] fn at_most_one() { assert_eq!((0..10).filter(|&x| x == 2).at_most_one().unwrap(), Some(2)); - assert!((0..10).filter(|&x| x > 1 && x < 4).at_most_one().unwrap_err().eq(2..4)); - assert!((0..10).filter(|&x| x > 1 && x < 5).at_most_one().unwrap_err().eq(2..5)); + assert!((0..10) + .filter(|&x| x > 1 && x < 4) + .at_most_one() + .unwrap_err() + .eq(2..4)); + assert!((0..10) + .filter(|&x| x > 1 && x < 5) + .at_most_one() + .unwrap_err() + .eq(2..5)); assert_eq!((0..10).filter(|&_| false).at_most_one().unwrap(), None); } @@ -315,3 +372,28 @@ fn product1() { assert_eq!(v[1..3].iter().cloned().product1::(), Some(2)); assert_eq!(v[1..5].iter().cloned().product1::(), Some(24)); } + +#[test] +fn next_array() { + let v = [1, 2, 3, 4, 5]; + let mut iter = v.iter(); + assert_eq!(iter.next_array(), Some([])); + assert_eq!(iter.next_array().map(|[&x, &y]| [x, y]), Some([1, 2])); + assert_eq!(iter.next_array().map(|[&x, &y]| [x, y]), Some([3, 4])); + assert_eq!(iter.next_array::<2>(), None); +} + +#[test] +fn collect_array() { + let v = [1, 2]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_array(), Some([1, 2])); + + let v = [1]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_array::<2>(), None); + + let v = [1, 2, 3]; + let iter = v.iter().cloned(); + assert_eq!(iter.collect_array::<2>(), None); +} diff --git a/third_party/rust/itertools/tests/test_std.rs b/third_party/rust/itertools/tests/test_std.rs index f590342349d..ad391faad64 100644 --- a/third_party/rust/itertools/tests/test_std.rs +++ b/third_party/rust/itertools/tests/test_std.rs @@ -1,19 +1,26 @@ -use quickcheck as qc; -use rand::{distributions::{Distribution, Standard}, Rng, SeedableRng, rngs::StdRng}; -use rand::{seq::SliceRandom, thread_rng}; -use std::{cmp::min, fmt::Debug, marker::PhantomData}; -use itertools as it; -use crate::it::Itertools; -use crate::it::ExactlyOneError; -use crate::it::multizip; -use crate::it::multipeek; -use crate::it::peek_nth; -use crate::it::free::rciter; -use crate::it::free::put_back_n; -use crate::it::FoldWhile; +#![allow(unstable_name_collisions)] + use crate::it::cloned; +use crate::it::free::put_back_n; +use crate::it::free::rciter; use crate::it::iproduct; use crate::it::izip; +use crate::it::multipeek; +use crate::it::multizip; +use crate::it::peek_nth; +use crate::it::repeat_n; +use crate::it::ExactlyOneError; +use crate::it::FoldWhile; +use crate::it::Itertools; +use itertools as it; +use quickcheck as qc; +use rand::{ + distributions::{Distribution, Standard}, + rngs::StdRng, + Rng, SeedableRng, +}; +use rand::{seq::SliceRandom, thread_rng}; +use std::{cmp::min, fmt::Debug, marker::PhantomData}; #[test] fn product3() { @@ -27,28 +34,26 @@ fn product3() { } } } - for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) { - /* test compiles */ - } + for (_, _, _, _) in iproduct!(0..3, 0..2, 0..2, 0..3) { /* test compiles */ } } #[test] fn interleave_shortest() { let v0: Vec = vec![0, 2, 4]; let v1: Vec = vec![1, 3, 5, 7]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); + let it = v0.into_iter().interleave_shortest(v1); assert_eq!(it.size_hint(), (6, Some(6))); assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5]); let v0: Vec = vec![0, 2, 4, 6, 8]; let v1: Vec = vec![1, 3, 5]; - let it = v0.into_iter().interleave_shortest(v1.into_iter()); + let it = v0.into_iter().interleave_shortest(v1); assert_eq!(it.size_hint(), (7, Some(7))); assert_eq!(it.collect_vec(), vec![0, 1, 2, 3, 4, 5, 6]); let i0 = ::std::iter::repeat(0); let v1: Vec<_> = vec![1, 3, 5]; - let it = i0.interleave_shortest(v1.into_iter()); + let it = i0.interleave_shortest(v1); assert_eq!(it.size_hint(), (7, Some(7))); let v0: Vec<_> = vec![0, 2, 4]; @@ -62,9 +67,15 @@ fn duplicates_by() { let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; let ys = ["aa", "bbbb", "cccc"]; it::assert_equal(ys.iter(), xs.iter().duplicates_by(|x| x[..2].to_string())); - it::assert_equal(ys.iter(), xs.iter().rev().duplicates_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys.iter(), + xs.iter().rev().duplicates_by(|x| x[..2].to_string()).rev(), + ); let ys_rev = ["ccc", "aa", "bbbbb"]; - it::assert_equal(ys_rev.iter(), xs.iter().duplicates_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys_rev.iter(), + xs.iter().duplicates_by(|x| x[..2].to_string()).rev(), + ); } #[test] @@ -83,10 +94,13 @@ fn duplicates() { let ys_rev = [1, 0]; it::assert_equal(ys_rev.iter(), xs.iter().duplicates().rev()); - let xs = vec![0, 1, 2, 1, 2]; + let xs = [0, 1, 2, 1, 2]; let ys = vec![1, 2]; assert_eq!(ys, xs.iter().duplicates().cloned().collect_vec()); - assert_eq!(ys, xs.iter().rev().duplicates().rev().cloned().collect_vec()); + assert_eq!( + ys, + xs.iter().rev().duplicates().rev().cloned().collect_vec() + ); let ys_rev = vec![2, 1]; assert_eq!(ys_rev, xs.iter().duplicates().rev().cloned().collect_vec()); } @@ -96,9 +110,15 @@ fn unique_by() { let xs = ["aaa", "bbbbb", "aa", "ccc", "bbbb", "aaaaa", "cccc"]; let ys = ["aaa", "bbbbb", "ccc"]; it::assert_equal(ys.iter(), xs.iter().unique_by(|x| x[..2].to_string())); - it::assert_equal(ys.iter(), xs.iter().rev().unique_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys.iter(), + xs.iter().rev().unique_by(|x| x[..2].to_string()).rev(), + ); let ys_rev = ["cccc", "aaaaa", "bbbb"]; - it::assert_equal(ys_rev.iter(), xs.iter().unique_by(|x| x[..2].to_string()).rev()); + it::assert_equal( + ys_rev.iter(), + xs.iter().unique_by(|x| x[..2].to_string()).rev(), + ); } #[test] @@ -127,7 +147,7 @@ fn intersperse() { let ys = [0, 1, 2, 3]; let mut it = ys[..0].iter().copied().intersperse(1); - assert!(it.next() == None); + assert!(it.next().is_none()); } #[test] @@ -148,14 +168,14 @@ fn dedup() { #[test] fn coalesce() { - let data = vec![-1., -2., -3., 3., 1., 0., -1.]; - let it = data.iter().cloned().coalesce(|x, y| + let data = [-1., -2., -3., 3., 1., 0., -1.]; + let it = data.iter().cloned().coalesce(|x, y| { if (x >= 0.) == (y >= 0.) { Ok(x + y) } else { Err((x, y)) } - ); + }); itertools::assert_equal(it.clone(), vec![-6., 4., -1.]); assert_eq!( it.fold(vec![], |mut v, n| { @@ -168,17 +188,37 @@ fn coalesce() { #[test] fn dedup_by() { - let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let xs = [ + (0, 0), + (0, 1), + (1, 1), + (2, 1), + (0, 2), + (3, 1), + (0, 3), + (1, 3), + ]; let ys = [(0, 0), (0, 1), (0, 2), (3, 1), (0, 3)]; - it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.1==y.1)); + it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.1 == y.1)); let xs = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]; let ys = [(0, 1)]; - it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.0==y.0)); + it::assert_equal(ys.iter(), xs.iter().dedup_by(|x, y| x.0 == y.0)); - let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; + let xs = [ + (0, 0), + (0, 1), + (1, 1), + (2, 1), + (0, 2), + (3, 1), + (0, 3), + (1, 3), + ]; let ys = [(0, 0), (0, 1), (0, 2), (3, 1), (0, 3)]; let mut xs_d = Vec::new(); - xs.iter().dedup_by(|x, y| x.1==y.1).fold((), |(), &elt| xs_d.push(elt)); + xs.iter() + .dedup_by(|x, y| x.1 == y.1) + .fold((), |(), &elt| xs_d.push(elt)); assert_eq!(&xs_d, &ys); } @@ -195,18 +235,38 @@ fn dedup_with_count() { it::assert_equal(ys.iter().cloned(), xs.iter().dedup_with_count()); } - #[test] fn dedup_by_with_count() { - let xs = [(0, 0), (0, 1), (1, 1), (2, 1), (0, 2), (3, 1), (0, 3), (1, 3)]; - let ys = [(1, &(0, 0)), (3, &(0, 1)), (1, &(0, 2)), (1, &(3, 1)), (2, &(0, 3))]; + let xs = [ + (0, 0), + (0, 1), + (1, 1), + (2, 1), + (0, 2), + (3, 1), + (0, 3), + (1, 3), + ]; + let ys = [ + (1, &(0, 0)), + (3, &(0, 1)), + (1, &(0, 2)), + (1, &(3, 1)), + (2, &(0, 3)), + ]; - it::assert_equal(ys.iter().cloned(), xs.iter().dedup_by_with_count(|x, y| x.1==y.1)); + it::assert_equal( + ys.iter().cloned(), + xs.iter().dedup_by_with_count(|x, y| x.1 == y.1), + ); let xs = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]; - let ys = [( 5, &(0, 1))]; + let ys = [(5, &(0, 1))]; - it::assert_equal(ys.iter().cloned(), xs.iter().dedup_by_with_count(|x, y| x.0==y.0)); + it::assert_equal( + ys.iter().cloned(), + xs.iter().dedup_by_with_count(|x, y| x.0 == y.0), + ); } #[test] @@ -215,11 +275,27 @@ fn all_equal() { assert!("A".chars().all_equal()); assert!(!"AABBCCC".chars().all_equal()); assert!("AAAAAAA".chars().all_equal()); - for (_key, mut sub) in &"AABBCCC".chars().group_by(|&x| x) { + for (_key, mut sub) in &"AABBCCC".chars().chunk_by(|&x| x) { assert!(sub.all_equal()); } } +#[test] +fn all_equal_value() { + assert_eq!("".chars().all_equal_value(), Err(None)); + assert_eq!("A".chars().all_equal_value(), Ok('A')); + assert_eq!("AABBCCC".chars().all_equal_value(), Err(Some(('A', 'B')))); + assert_eq!("AAAAAAA".chars().all_equal_value(), Ok('A')); + { + let mut it = [1, 2, 3].iter().copied(); + let result = it.all_equal_value(); + assert_eq!(result, Err(Some((1, 2)))); + let remaining = it.next(); + assert_eq!(remaining, Some(3)); + assert!(it.next().is_none()); + } +} + #[test] fn all_unique() { assert!("ABCDEFGH".chars().all_unique()); @@ -240,7 +316,7 @@ fn test_put_back_n() { #[test] fn tee() { - let xs = [0, 1, 2, 3]; + let xs = [0, 1, 2, 3]; let (mut t1, mut t2) = xs.iter().cloned().tee(); assert_eq!(t1.next(), Some(0)); assert_eq!(t2.next(), Some(0)); @@ -264,7 +340,6 @@ fn tee() { it::assert_equal(t1.zip(t2), xs.iter().cloned().zip(xs.iter().cloned())); } - #[test] fn test_rciter() { let xs = [0, 1, 1, 1, 2, 1, 3, 5, 6]; @@ -285,26 +360,24 @@ fn test_rciter() { assert_eq!(z.next(), Some((0, 1))); } -#[allow(deprecated)] #[test] fn trait_pointers() { - struct ByRef<'r, I: ?Sized>(&'r mut I) ; + struct ByRef<'r, I: ?Sized>(&'r mut I); - impl<'r, X, I: ?Sized> Iterator for ByRef<'r, I> where - I: 'r + Iterator + impl<'r, X, I> Iterator for ByRef<'r, I> + where + I: ?Sized + 'r + Iterator, { type Item = X; - fn next(&mut self) -> Option - { + fn next(&mut self) -> Option { self.0.next() } } - let mut it = Box::new(0..10) as Box>; + let mut it = Box::new(0..10) as Box>; assert_eq!(it.next(), Some(0)); { - /* make sure foreach works on non-Sized */ let jt: &mut dyn Iterator = &mut *it; assert_eq!(jt.next(), Some(1)); @@ -314,15 +387,22 @@ fn trait_pointers() { } assert_eq!(jt.find_position(|x| *x == 4), Some((1, 4))); - jt.foreach(|_| ()); + jt.for_each(|_| ()); } } #[test] fn merge_by() { - let odd : Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; - let even = vec![(2, "foo"), (4, "bar"), (6, "baz")]; - let expected = vec![(1, "hello"), (2, "foo"), (3, "world"), (4, "bar"), (5, "!"), (6, "baz")]; + let odd: Vec<(u32, &str)> = vec![(1, "hello"), (3, "world"), (5, "!")]; + let even = [(2, "foo"), (4, "bar"), (6, "baz")]; + let expected = [ + (1, "hello"), + (2, "foo"), + (3, "world"), + (4, "bar"), + (5, "!"), + (6, "baz"), + ]; let results = odd.iter().merge_by(even.iter(), |a, b| a.0 <= b.0); it::assert_equal(results, expected.iter()); } @@ -336,23 +416,21 @@ fn merge_by_btree() { let mut bt2 = BTreeMap::new(); bt2.insert("foo", 2); bt2.insert("bar", 4); - let results = bt1.into_iter().merge_by(bt2.into_iter(), |a, b| a.0 <= b.0 ); + let results = bt1.into_iter().merge_by(bt2, |a, b| a.0 <= b.0); let expected = vec![("bar", 4), ("foo", 2), ("hello", 1), ("world", 3)]; - it::assert_equal(results, expected.into_iter()); + it::assert_equal(results, expected); } -#[allow(deprecated)] #[test] fn kmerge() { - let its = (0..4).map(|s| (s..10).step(4)); + let its = (0..4).map(|s| (s..10).step_by(4)); it::assert_equal(its.kmerge(), 0..10); } -#[allow(deprecated)] #[test] fn kmerge_2() { - let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step(4)); + let its = vec![3, 2, 1, 0].into_iter().map(|s| (s..10).step_by(4)); it::assert_equal(its.kmerge(), 0..10); } @@ -378,19 +456,17 @@ fn kmerge_empty_size_hint() { #[test] fn join() { let many = [1, 2, 3]; - let one = [1]; + let one = [1]; let none: Vec = vec![]; assert_eq!(many.iter().join(", "), "1, 2, 3"); - assert_eq!( one.iter().join(", "), "1"); + assert_eq!(one.iter().join(", "), "1"); assert_eq!(none.iter().join(", "), ""); } #[test] fn sorted_unstable_by() { - let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { - a.cmp(&b) - }); + let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| a.cmp(&b)); it::assert_equal(sc, vec![1, 2, 3, 4]); let v = (0..5).sorted_unstable_by(|&a, &b| a.cmp(&b).reverse()); @@ -408,33 +484,85 @@ fn sorted_unstable_by_key() { #[test] fn sorted_by() { - let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| { - a.cmp(&b) - }); + let sc = [3, 4, 1, 2].iter().cloned().sorted_by(|&a, &b| a.cmp(&b)); it::assert_equal(sc, vec![1, 2, 3, 4]); let v = (0..5).sorted_by(|&a, &b| a.cmp(&b).reverse()); it::assert_equal(v, vec![4, 3, 2, 1, 0]); } +#[cfg(not(miri))] qc::quickcheck! { - fn k_smallest_range(n: u64, m: u16, k: u16) -> () { + fn k_smallest_range(n: i64, m: u16, k: u16) -> () { // u16 is used to constrain k and m to 0..2¹⁶, // otherwise the test could use too much memory. - let (k, m) = (k as u64, m as u64); + let (k, m) = (k as usize, m as u64); + let mut v: Vec<_> = (n..n.saturating_add(m as _)).collect(); // Generate a random permutation of n..n+m - let i = { - let mut v: Vec = (n..n.saturating_add(m)).collect(); - v.shuffle(&mut thread_rng()); - v.into_iter() - }; + v.shuffle(&mut thread_rng()); - // Check that taking the k smallest elements yields n..n+min(k, m) - it::assert_equal( - i.k_smallest(k as usize), - n..n.saturating_add(min(k, m)) - ); + // Construct the right answers for the top and bottom elements + let mut sorted = v.clone(); + sorted.sort(); + // how many elements are we checking + let num_elements = min(k, m as _); + + // Compute the top and bottom k in various combinations + let sorted_smallest = sorted[..num_elements].iter().cloned(); + let smallest = v.iter().cloned().k_smallest(k); + let smallest_by = v.iter().cloned().k_smallest_by(k, Ord::cmp); + let smallest_by_key = v.iter().cloned().k_smallest_by_key(k, |&x| x); + + let sorted_largest = sorted[sorted.len() - num_elements..].iter().rev().cloned(); + let largest = v.iter().cloned().k_largest(k); + let largest_by = v.iter().cloned().k_largest_by(k, Ord::cmp); + let largest_by_key = v.iter().cloned().k_largest_by_key(k, |&x| x); + + // Check the variations produce the same answers and that they're right + it::assert_equal(smallest, sorted_smallest.clone()); + it::assert_equal(smallest_by, sorted_smallest.clone()); + it::assert_equal(smallest_by_key, sorted_smallest); + + it::assert_equal(largest, sorted_largest.clone()); + it::assert_equal(largest_by, sorted_largest.clone()); + it::assert_equal(largest_by_key, sorted_largest); + } + + fn k_smallest_relaxed_range(n: i64, m: u16, k: u16) -> () { + // u16 is used to constrain k and m to 0..2¹⁶, + // otherwise the test could use too much memory. + let (k, m) = (k as usize, m as u64); + + let mut v: Vec<_> = (n..n.saturating_add(m as _)).collect(); + // Generate a random permutation of n..n+m + v.shuffle(&mut thread_rng()); + + // Construct the right answers for the top and bottom elements + let mut sorted = v.clone(); + sorted.sort(); + // how many elements are we checking + let num_elements = min(k, m as _); + + // Compute the top and bottom k in various combinations + let sorted_smallest = sorted[..num_elements].iter().cloned(); + let smallest = v.iter().cloned().k_smallest_relaxed(k); + let smallest_by = v.iter().cloned().k_smallest_relaxed_by(k, Ord::cmp); + let smallest_by_key = v.iter().cloned().k_smallest_relaxed_by_key(k, |&x| x); + + let sorted_largest = sorted[sorted.len() - num_elements..].iter().rev().cloned(); + let largest = v.iter().cloned().k_largest_relaxed(k); + let largest_by = v.iter().cloned().k_largest_relaxed_by(k, Ord::cmp); + let largest_by_key = v.iter().cloned().k_largest_relaxed_by_key(k, |&x| x); + + // Check the variations produce the same answers and that they're right + it::assert_equal(smallest, sorted_smallest.clone()); + it::assert_equal(smallest_by, sorted_smallest.clone()); + it::assert_equal(smallest_by_key, sorted_smallest); + + it::assert_equal(largest, sorted_largest.clone()); + it::assert_equal(largest_by, sorted_largest.clone()); + it::assert_equal(largest_by_key, sorted_largest); } } @@ -443,11 +571,13 @@ struct RandIter + _t: PhantomData, } impl Iterator for RandIter -where Standard: Distribution { +where + Standard: Distribution, +{ type Item = T; fn next(&mut self) -> Option { if self.idx == self.len { @@ -461,11 +591,11 @@ where Standard: Distribution { impl qc::Arbitrary for RandIter { fn arbitrary(g: &mut G) -> Self { - RandIter { + Self { idx: 0, len: g.size(), rng: R::seed_from_u64(g.next_u64()), - _t : PhantomData{}, + _t: PhantomData {}, } } } @@ -478,11 +608,25 @@ where I::Item: Ord + Debug, { let j = i.clone(); + let i1 = i.clone(); + let j1 = i.clone(); let k = k as usize; - it::assert_equal( - i.k_smallest(k), - j.sorted().take(k) - ) + it::assert_equal(i.k_smallest(k), j.sorted().take(k)); + it::assert_equal(i1.k_smallest_relaxed(k), j1.sorted().take(k)); +} + +// Similar to `k_smallest_sort` but for our custom heap implementation. +fn k_smallest_by_sort(i: I, k: u16) +where + I: Iterator + Clone, + I::Item: Ord + Debug, +{ + let j = i.clone(); + let i1 = i.clone(); + let j1 = i.clone(); + let k = k as usize; + it::assert_equal(i.k_smallest_by(k, Ord::cmp), j.sorted().take(k)); + it::assert_equal(i1.k_smallest_relaxed_by(k, Ord::cmp), j1.sorted().take(k)); } macro_rules! generic_test { @@ -497,7 +641,10 @@ macro_rules! generic_test { }; } +#[cfg(not(miri))] generic_test!(k_smallest_sort, u8, u16, u32, u64, i8, i16, i32, i64); +#[cfg(not(miri))] +generic_test!(k_smallest_by_sort, u8, u16, u32, u64, i8, i16, i32, i64); #[test] fn sorted_by_key() { @@ -534,7 +681,7 @@ fn sorted_by_cached_key() { #[test] fn test_multipeek() { - let nums = vec![1u8,2,3,4,5]; + let nums = vec![1u8, 2, 3, 4, 5]; let mp = multipeek(nums.iter().copied()); assert_eq!(nums, mp.collect::>()); @@ -575,7 +722,7 @@ fn test_multipeek_reset() { #[test] fn test_multipeek_peeking_next() { use crate::it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; + let nums = [1u8, 2, 3, 4, 5, 6, 7]; let mut mp = multipeek(nums.iter().copied()); assert_eq!(mp.peeking_next(|&x| x != 0), Some(1)); @@ -598,9 +745,24 @@ fn test_multipeek_peeking_next() { assert_eq!(mp.peek(), None); } +#[test] +fn test_repeat_n_peeking_next() { + use crate::it::PeekingNext; + let mut rn = repeat_n(0, 5); + assert_eq!(rn.peeking_next(|&x| x != 0), None); + assert_eq!(rn.peeking_next(|&x| x <= 0), Some(0)); + assert_eq!(rn.next(), Some(0)); + assert_eq!(rn.peeking_next(|&x| x <= 0), Some(0)); + assert_eq!(rn.peeking_next(|&x| x != 0), None); + assert_eq!(rn.peeking_next(|&x| x >= 0), Some(0)); + assert_eq!(rn.next(), Some(0)); + assert_eq!(rn.peeking_next(|&x| x <= 0), None); + assert_eq!(rn.next(), None); +} + #[test] fn test_peek_nth() { - let nums = vec![1u8,2,3,4,5]; + let nums = vec![1u8, 2, 3, 4, 5]; let iter = peek_nth(nums.iter().copied()); assert_eq!(nums, iter.collect::>()); @@ -635,7 +797,7 @@ fn test_peek_nth() { #[test] fn test_peek_nth_peeking_next() { use it::PeekingNext; - let nums = vec![1u8,2,3,4,5,6,7]; + let nums = [1u8, 2, 3, 4, 5, 6, 7]; let mut iter = peek_nth(nums.iter().copied()); assert_eq!(iter.peeking_next(|&x| x != 0), Some(1)); @@ -662,6 +824,35 @@ fn test_peek_nth_peeking_next() { assert_eq!(iter.peek(), None); } +#[test] +fn test_peek_nth_next_if() { + let nums = [1u8, 2, 3, 4, 5, 6, 7]; + let mut iter = peek_nth(nums.iter().copied()); + + assert_eq!(iter.next_if(|&x| x != 0), Some(1)); + assert_eq!(iter.next(), Some(2)); + + assert_eq!(iter.peek_nth(0), Some(&3)); + assert_eq!(iter.peek_nth(1), Some(&4)); + assert_eq!(iter.next_if_eq(&3), Some(3)); + assert_eq!(iter.peek(), Some(&4)); + + assert_eq!(iter.next_if(|&x| x != 4), None); + assert_eq!(iter.next_if_eq(&4), Some(4)); + assert_eq!(iter.peek_nth(0), Some(&5)); + assert_eq!(iter.peek_nth(1), Some(&6)); + + assert_eq!(iter.next_if(|&x| x != 5), None); + assert_eq!(iter.peek(), Some(&5)); + + assert_eq!(iter.next_if(|&x| x % 2 == 1), Some(5)); + assert_eq!(iter.next_if_eq(&6), Some(6)); + assert_eq!(iter.peek_nth(0), Some(&7)); + assert_eq!(iter.peek_nth(1), None); + assert_eq!(iter.next(), Some(7)); + assert_eq!(iter.peek(), None); +} + #[test] fn pad_using() { it::assert_equal((0..0).pad_using(1, |_| 1), 1..2); @@ -676,14 +867,14 @@ fn pad_using() { } #[test] -fn group_by() { - for (ch1, sub) in &"AABBCCC".chars().group_by(|&x| x) { +fn chunk_by() { + for (ch1, sub) in &"AABBCCC".chars().chunk_by(|&x| x) { for ch2 in sub { assert_eq!(ch1, ch2); } } - for (ch1, sub) in &"AAABBBCCCCDDDD".chars().group_by(|&x| x) { + for (ch1, sub) in &"AAABBBCCCCDDDD".chars().chunk_by(|&x| x) { for ch2 in sub { assert_eq!(ch1, ch2); if ch1 == 'C' { @@ -696,24 +887,24 @@ fn group_by() { // try all possible orderings for indices in permutohedron::Heap::new(&mut [0, 1, 2, 3]) { - let groups = "AaaBbbccCcDDDD".chars().group_by(&toupper); - let mut subs = groups.into_iter().collect_vec(); + let chunks = "AaaBbbccCcDDDD".chars().chunk_by(&toupper); + let mut subs = chunks.into_iter().collect_vec(); for &idx in &indices[..] { let (key, text) = match idx { - 0 => ('A', "Aaa".chars()), - 1 => ('B', "Bbb".chars()), - 2 => ('C', "ccCc".chars()), - 3 => ('D', "DDDD".chars()), - _ => unreachable!(), + 0 => ('A', "Aaa".chars()), + 1 => ('B', "Bbb".chars()), + 2 => ('C', "ccCc".chars()), + 3 => ('D', "DDDD".chars()), + _ => unreachable!(), }; assert_eq!(key, subs[idx].0); it::assert_equal(&mut subs[idx].1, text); } } - let groups = "AAABBBCCCCDDDD".chars().group_by(|&x| x); - let mut subs = groups.into_iter().map(|(_, g)| g).collect_vec(); + let chunks = "AAABBBCCCCDDDD".chars().chunk_by(|&x| x); + let mut subs = chunks.into_iter().map(|(_, g)| g).collect_vec(); let sd = subs.pop().unwrap(); let sc = subs.pop().unwrap(); @@ -730,9 +921,11 @@ fn group_by() { { let mut ntimes = 0; let text = "AABCCC"; - for (_, sub) in &text.chars().group_by(|&x| { ntimes += 1; x}) { - for _ in sub { - } + for (_, sub) in &text.chars().chunk_by(|&x| { + ntimes += 1; + x + }) { + for _ in sub {} } assert_eq!(ntimes, text.len()); } @@ -740,91 +933,95 @@ fn group_by() { { let mut ntimes = 0; let text = "AABCCC"; - for _ in &text.chars().group_by(|&x| { ntimes += 1; x}) { - } + for _ in &text.chars().chunk_by(|&x| { + ntimes += 1; + x + }) {} assert_eq!(ntimes, text.len()); } { let text = "ABCCCDEEFGHIJJKK"; - let gr = text.chars().group_by(|&x| x); + let gr = text.chars().chunk_by(|&x| x); it::assert_equal(gr.into_iter().flat_map(|(_, sub)| sub), text.chars()); } } #[test] -fn group_by_lazy_2() { - let data = vec![0, 1]; - let groups = data.iter().group_by(|k| *k); - let gs = groups.into_iter().collect_vec(); +fn chunk_by_lazy_2() { + let data = [0, 1]; + let chunks = data.iter().chunk_by(|k| *k); + let gs = chunks.into_iter().collect_vec(); it::assert_equal(data.iter(), gs.into_iter().flat_map(|(_k, g)| g)); - let data = vec![0, 1, 1, 0, 0]; - let groups = data.iter().group_by(|k| *k); - let mut gs = groups.into_iter().collect_vec(); + let data = [0, 1, 1, 0, 0]; + let chunks = data.iter().chunk_by(|k| *k); + let mut gs = chunks.into_iter().collect_vec(); gs[1..].reverse(); it::assert_equal(&[0, 0, 0, 1, 1], gs.into_iter().flat_map(|(_, g)| g)); - let grouper = data.iter().group_by(|k| *k); - let mut groups = Vec::new(); - for (k, group) in &grouper { + let grouper = data.iter().chunk_by(|k| *k); + let mut chunks = Vec::new(); + for (k, chunk) in &grouper { if *k == 1 { - groups.push(group); + chunks.push(chunk); } } - it::assert_equal(&mut groups[0], &[1, 1]); + it::assert_equal(&mut chunks[0], &[1, 1]); - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; - let grouper = data.iter().group_by(|k| *k); - let mut groups = Vec::new(); - for (i, (_, group)) in grouper.into_iter().enumerate() { + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let grouper = data.iter().chunk_by(|k| *k); + let mut chunks = Vec::new(); + for (i, (_, chunk)) in grouper.into_iter().enumerate() { if i < 2 { - groups.push(group); + chunks.push(chunk); } else if i < 4 { - for _ in group { - } + for _ in chunk {} } else { - groups.push(group); + chunks.push(chunk); } } - it::assert_equal(&mut groups[0], &[0, 0, 0]); - it::assert_equal(&mut groups[1], &[1, 1]); - it::assert_equal(&mut groups[2], &[3, 3]); + it::assert_equal(&mut chunks[0], &[0, 0, 0]); + it::assert_equal(&mut chunks[1], &[1, 1]); + it::assert_equal(&mut chunks[2], &[3, 3]); - // use groups as chunks - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let mut i = 0; - let grouper = data.iter().group_by(move |_| { let k = i / 3; i += 1; k }); - for (i, group) in &grouper { + let grouper = data.iter().chunk_by(move |_| { + let k = i / 3; + i += 1; + k + }); + for (i, chunk) in &grouper { match i { - 0 => it::assert_equal(group, &[0, 0, 0]), - 1 => it::assert_equal(group, &[1, 1, 0]), - 2 => it::assert_equal(group, &[0, 2, 2]), - 3 => it::assert_equal(group, &[3, 3]), + 0 => it::assert_equal(chunk, &[0, 0, 0]), + 1 => it::assert_equal(chunk, &[1, 1, 0]), + 2 => it::assert_equal(chunk, &[0, 2, 2]), + 3 => it::assert_equal(chunk, &[3, 3]), _ => unreachable!(), } } } #[test] -fn group_by_lazy_3() { - // test consuming each group on the lap after it was produced - let data = vec![0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; - let grouper = data.iter().group_by(|elt| *elt); +fn chunk_by_lazy_3() { + // test consuming each chunk on the lap after it was produced + let data = [0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2]; + let grouper = data.iter().chunk_by(|elt| *elt); let mut last = None; - for (key, group) in &grouper { + for (key, chunk) in &grouper { if let Some(gr) = last.take() { for elt in gr { assert!(elt != key && i32::abs(elt - key) == 1); } } - last = Some(group); + last = Some(chunk); } } #[test] fn chunks() { - let data = vec![0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; + let data = [0, 0, 0, 1, 1, 0, 0, 2, 2, 3, 3]; let grouper = data.iter().chunks(3); for (i, chunk) in grouper.into_iter().enumerate() { match i { @@ -845,8 +1042,8 @@ fn concat_empty() { #[test] fn concat_non_empty() { - let data = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]]; - assert_eq!(data.into_iter().concat(), vec![1,2,3,4,5,6,7,8,9]) + let data = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; + assert_eq!(data.into_iter().concat(), vec![1, 2, 3, 4, 5, 6, 7, 8, 9]) } #[test] @@ -854,19 +1051,20 @@ fn combinations() { assert!((1..3).combinations(5).next().is_none()); let it = (1..3).combinations(2); - it::assert_equal(it, vec![ - vec![1, 2], - ]); + it::assert_equal(it, vec![vec![1, 2]]); let it = (1..5).combinations(2); - it::assert_equal(it, vec![ - vec![1, 2], - vec![1, 3], - vec![1, 4], - vec![2, 3], - vec![2, 4], - vec![3, 4], - ]); + it::assert_equal( + it, + vec![ + vec![1, 2], + vec![1, 3], + vec![1, 4], + vec![2, 3], + vec![2, 4], + vec![3, 4], + ], + ); it::assert_equal((0..0).tuple_combinations::<(_, _)>(), >::new()); it::assert_equal((0..1).tuple_combinations::<(_, _)>(), >::new()); @@ -886,13 +1084,88 @@ fn combinations_of_too_short() { } } - #[test] fn combinations_zero() { it::assert_equal((1..3).combinations(0), vec![vec![]]); it::assert_equal((0..0).combinations(0), vec![vec![]]); } +fn binomial(n: usize, k: usize) -> usize { + if k > n { + 0 + } else { + (n - k + 1..=n).product::() / (1..=k).product::() + } +} + +#[test] +fn combinations_range_count() { + for n in 0..=7 { + for k in 0..=7 { + let len = binomial(n, k); + let mut it = (0..n).combinations(k); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } + } +} + +#[test] +fn combinations_inexact_size_hints() { + for k in 0..=7 { + let mut numbers = (0..18).filter(|i| i % 2 == 0); // 9 elements + let mut it = numbers.clone().combinations(k); + let real_n = numbers.clone().count(); + let len = binomial(real_n, k); + assert_eq!(len, it.clone().count()); + + let mut nb_loaded = 0; + let sh = numbers.size_hint(); + assert_eq!(binomial(sh.0 + nb_loaded, k), it.size_hint().0); + assert_eq!(sh.1.map(|n| binomial(n + nb_loaded, k)), it.size_hint().1); + + for next_count in 1..=len { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(len - next_count, it.clone().count()); + if next_count == 1 { + // The very first time, the lazy buffer is prefilled. + nb_loaded = numbers.by_ref().take(k).count(); + } else { + // Then it loads one item each time until exhausted. + let nb = numbers.next(); + if nb.is_some() { + nb_loaded += 1; + } + } + let sh = numbers.size_hint(); + if next_count > real_n - k + 1 { + assert_eq!(0, sh.0); + assert_eq!(Some(0), sh.1); + assert_eq!(real_n, nb_loaded); + // Once it's fully loaded, size hints of `it` are exacts. + } + assert_eq!(binomial(sh.0 + nb_loaded, k) - next_count, it.size_hint().0); + assert_eq!( + sh.1.map(|n| binomial(n + nb_loaded, k) - next_count), + it.size_hint().1 + ); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } +} + #[test] fn permutations_zero() { it::assert_equal((1..3).permutations(0), vec![vec![]]); @@ -900,6 +1173,41 @@ fn permutations_zero() { } #[test] +fn permutations_range_count() { + for n in 0..=4 { + for k in 0..=4 { + let len = if k <= n { (n - k + 1..=n).product() } else { 0 }; + let mut it = (0..n).permutations(k); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } + } +} + +#[test] +fn permutations_overflowed_size_hints() { + let mut it = std::iter::repeat(()).permutations(2); + assert_eq!(it.size_hint().0, usize::MAX); + assert_eq!(it.size_hint().1, None); + for nb_generated in 1..=1000 { + it.next(); + assert!(it.size_hint().0 >= usize::MAX - nb_generated); + assert_eq!(it.size_hint().1, None); + } +} + +#[test] +#[cfg(not(miri))] fn combinations_with_replacement() { // Pool smaller than n it::assert_equal((0..1).combinations_with_replacement(2), vec![vec![0, 0]]); @@ -916,15 +1224,9 @@ fn combinations_with_replacement() { ], ); // Zero size - it::assert_equal( - (0..3).combinations_with_replacement(0), - vec![vec![]], - ); + it::assert_equal((0..3).combinations_with_replacement(0), vec![vec![]]); // Zero size on empty pool - it::assert_equal( - (0..0).combinations_with_replacement(0), - vec![vec![]], - ); + it::assert_equal((0..0).combinations_with_replacement(0), vec![vec![]]); // Empty pool it::assert_equal( (0..0).combinations_with_replacement(2), @@ -932,26 +1234,75 @@ fn combinations_with_replacement() { ); } +#[test] +fn combinations_with_replacement_range_count() { + for n in 0..=4 { + for k in 0..=4 { + let len = binomial(usize::saturating_sub(n + k, 1), k); + let mut it = (0..n).combinations_with_replacement(k); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } + } +} + #[test] fn powerset() { it::assert_equal((0..0).powerset(), vec![vec![]]); it::assert_equal((0..1).powerset(), vec![vec![], vec![0]]); - it::assert_equal((0..2).powerset(), vec![vec![], vec![0], vec![1], vec![0, 1]]); - it::assert_equal((0..3).powerset(), vec![ - vec![], - vec![0], vec![1], vec![2], - vec![0, 1], vec![0, 2], vec![1, 2], - vec![0, 1, 2] - ]); + it::assert_equal( + (0..2).powerset(), + vec![vec![], vec![0], vec![1], vec![0, 1]], + ); + it::assert_equal( + (0..3).powerset(), + vec![ + vec![], + vec![0], + vec![1], + vec![2], + vec![0, 1], + vec![0, 2], + vec![1, 2], + vec![0, 1, 2], + ], + ); assert_eq!((0..4).powerset().count(), 1 << 4); assert_eq!((0..8).powerset().count(), 1 << 8); assert_eq!((0..16).powerset().count(), 1 << 16); + + for n in 0..=4 { + let mut it = (0..n).powerset(); + let len = 2_usize.pow(n); + assert_eq!(len, it.clone().count()); + assert_eq!(len, it.size_hint().0); + assert_eq!(Some(len), it.size_hint().1); + for count in (0..len).rev() { + let elem = it.next(); + assert!(elem.is_some()); + assert_eq!(count, it.clone().count()); + assert_eq!(count, it.size_hint().0); + assert_eq!(Some(count), it.size_hint().1); + } + let should_be_none = it.next(); + assert!(should_be_none.is_none()); + } } #[test] fn diff_mismatch() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 5.0, 3.0, 4.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -965,21 +1316,20 @@ fn diff_mismatch() { #[test] fn diff_longer() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); assert!(match diff { - Some(it::Diff::Longer(_, remaining)) => - remaining.collect::>() == vec![5, 6], + Some(it::Diff::Longer(_, remaining)) => remaining.collect::>() == vec![5, 6], _ => false, }); } #[test] fn diff_shorter() { - let a = vec![1, 2, 3, 4]; + let a = [1, 2, 3, 4]; let b = vec![1.0, 2.0]; let b_map = b.into_iter().map(|f| f as i32); let diff = it::diff_with(a.iter(), b_map, |a, b| *a == b); @@ -999,14 +1349,14 @@ fn extrema_set() { #[derive(Clone, Debug, PartialEq, Eq)] struct Val(u32, u32); - impl PartialOrd for Val { - fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + impl PartialOrd for Val { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) } } impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } @@ -1017,7 +1367,7 @@ fn extrema_set() { assert_eq!(Some(1u32).iter().min_set(), vec![&1]); assert_eq!(Some(1u32).iter().max_set(), vec![&1]); - let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; + let data = [Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; let min_set = data.iter().min_set(); assert_eq!(min_set, vec![&Val(0, 1), &Val(0, 2)]); @@ -1040,31 +1390,34 @@ fn extrema_set() { #[test] fn minmax() { - use std::cmp::Ordering; use crate::it::MinMaxResult; + use std::cmp::Ordering; // A peculiar type: Equality compares both tuple items, but ordering only the // first item. This is so we can check the stability property easily. #[derive(Clone, Debug, PartialEq, Eq)] struct Val(u32, u32); - impl PartialOrd for Val { - fn partial_cmp(&self, other: &Val) -> Option { - self.0.partial_cmp(&other.0) + impl PartialOrd for Val { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) } } impl Ord for Val { - fn cmp(&self, other: &Val) -> Ordering { + fn cmp(&self, other: &Self) -> Ordering { self.0.cmp(&other.0) } } - assert_eq!(None::>.iter().minmax(), MinMaxResult::NoElements); + assert_eq!( + None::>.iter().minmax(), + MinMaxResult::NoElements + ); assert_eq!(Some(1u32).iter().minmax(), MinMaxResult::OneElement(&1)); - let data = vec![Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; + let data = [Val(0, 1), Val(2, 0), Val(0, 2), Val(1, 0), Val(2, 1)]; let minmax = data.iter().minmax(); assert_eq!(minmax, MinMaxResult::MinMax(&Val(0, 1), &Val(2, 1))); @@ -1073,7 +1426,11 @@ fn minmax() { assert_eq!(min, &Val(2, 0)); assert_eq!(max, &Val(0, 2)); - let (min, max) = data.iter().minmax_by(|x, y| x.1.cmp(&y.1)).into_option().unwrap(); + let (min, max) = data + .iter() + .minmax_by(|x, y| x.1.cmp(&y.1)) + .into_option() + .unwrap(); assert_eq!(min, &Val(2, 0)); assert_eq!(max, &Val(0, 2)); } @@ -1096,31 +1453,34 @@ fn format() { #[test] fn while_some() { - let ns = (1..10).map(|x| if x % 5 != 0 { Some(x) } else { None }) - .while_some(); + let ns = (1..10) + .map(|x| if x % 5 != 0 { Some(x) } else { None }) + .while_some(); it::assert_equal(ns, vec![1, 2, 3, 4]); } -#[allow(deprecated)] #[test] fn fold_while() { let mut iterations = 0; let vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; - let sum = vec.into_iter().fold_while(0, |acc, item| { - iterations += 1; - let new_sum = acc + item; - if new_sum <= 20 { - FoldWhile::Continue(new_sum) - } else { - FoldWhile::Done(acc) - } - }).into_inner(); + let sum = vec + .into_iter() + .fold_while(0, |acc, item| { + iterations += 1; + let new_sum = acc + item; + if new_sum <= 20 { + FoldWhile::Continue(new_sum) + } else { + FoldWhile::Done(acc) + } + }) + .into_inner(); assert_eq!(iterations, 6); assert_eq!(sum, 15); } #[test] -fn tree_fold1() { +fn tree_reduce() { let x = [ "", "0", @@ -1141,9 +1501,13 @@ fn tree_fold1() { "0 1 x 2 3 x x 4 5 x 6 7 x x x 8 9 x 10 11 x x 12 13 x 14 15 x x x x", ]; for (i, &s) in x.iter().enumerate() { - let expected = if s.is_empty() { None } else { Some(s.to_string()) }; + let expected = if s.is_empty() { + None + } else { + Some(s.to_string()) + }; let num_strings = (0..i).map(|x| x.to_string()); - let actual = num_strings.tree_fold1(|a, b| format!("{} {} x", a, b)); + let actual = num_strings.tree_reduce(|a, b| format!("{} {} x", a, b)); assert_eq!(actual, expected); } } @@ -1153,16 +1517,53 @@ fn exactly_one_question_mark_syntax_works() { exactly_one_question_mark_return().unwrap_err(); } -fn exactly_one_question_mark_return() -> Result<(), ExactlyOneError>> { +fn exactly_one_question_mark_return() -> Result<(), ExactlyOneError>> +{ [].iter().exactly_one()?; Ok(()) } #[test] fn multiunzip() { - let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)].iter().cloned().multiunzip(); + let (a, b, c): (Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2), (3, 4, 5), (6, 7, 8)] + .iter() + .cloned() + .multiunzip(); assert_eq!((a, b, c), (vec![0, 3, 6], vec![1, 4, 7], vec![2, 5, 8])); let (): () = [(), (), ()].iter().cloned().multiunzip(); - let t: (Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>, Vec<_>) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)].iter().cloned().multiunzip(); - assert_eq!(t, (vec![0], vec![1], vec![2], vec![3], vec![4], vec![5], vec![6], vec![7], vec![8], vec![9], vec![10], vec![11])); + #[allow(clippy::type_complexity)] + let t: ( + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + ) = [(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)] + .iter() + .cloned() + .multiunzip(); + assert_eq!( + t, + ( + vec![0], + vec![1], + vec![2], + vec![3], + vec![4], + vec![5], + vec![6], + vec![7], + vec![8], + vec![9], + vec![10], + vec![11] + ) + ); } diff --git a/third_party/rust/itertools/tests/zip.rs b/third_party/rust/itertools/tests/zip.rs index 75157d34f3a..daed31e32da 100644 --- a/third_party/rust/itertools/tests/zip.rs +++ b/third_party/rust/itertools/tests/zip.rs @@ -1,17 +1,17 @@ -use itertools::Itertools; -use itertools::EitherOrBoth::{Both, Left, Right}; -use itertools::free::zip_eq; use itertools::multizip; +use itertools::EitherOrBoth::{Both, Left, Right}; +use itertools::Itertools; #[test] fn zip_longest_fused() { let a = [Some(1), None, Some(3), Some(4)]; let b = [1, 2, 3]; - let unfused = a.iter().batching(|it| *it.next().unwrap()) + let unfused = a + .iter() + .batching(|it| *it.next().unwrap()) .zip_longest(b.iter().cloned()); - itertools::assert_equal(unfused, - vec![Both(1, 1), Right(2), Right(3)]); + itertools::assert_equal(unfused, vec![Both(1, 1), Right(2), Right(3)]); } #[test] @@ -20,7 +20,7 @@ fn test_zip_longest_size_hint() { let v: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; let v2 = &[10, 11, 12]; - assert_eq!(c.zip_longest(v.iter()).size_hint(), (std::usize::MAX, None)); + assert_eq!(c.zip_longest(v.iter()).size_hint(), (usize::MAX, None)); assert_eq!(v.iter().zip_longest(v2.iter()).size_hint(), (10, Some(10))); } @@ -54,24 +54,3 @@ fn test_double_ended_zip() { assert_eq!(it.next_back(), Some((1, 1))); assert_eq!(it.next_back(), None); } - - -#[should_panic] -#[test] -fn zip_eq_panic1() -{ - let a = [1, 2]; - let b = [1, 2, 3]; - - zip_eq(&a, &b).count(); -} - -#[should_panic] -#[test] -fn zip_eq_panic2() -{ - let a: [i32; 0] = []; - let b = [1, 2, 3]; - - zip_eq(&a, &b).count(); -} diff --git a/third_party/rust/suggest/.cargo-checksum.json b/third_party/rust/suggest/.cargo-checksum.json index 138fca2f603..256ca90ccf5 100644 --- a/third_party/rust/suggest/.cargo-checksum.json +++ b/third_party/rust/suggest/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"922b2e4d85f325dbef99d5e439558a75dbfda82e1d263c2dd3bfadac9879df18","README.md":"5e28baf874b643d756228bdab345e287bf107d3182dfe6a18aafadcc4b9a3fc9","benches/benchmark_all.rs":"5909dfb1e62793afb1f2bc15b75914527a4d14fce6796307c04a309e45c0598c","metrics.yaml":"0540ab2271aeab7f07335c7ceec12acde942995f9dcb3c29070489aa61899d56","src/benchmarks/README.md":"ccee8dbddba8762d0453fa855bd6984137b224b8c019f3dd8e86a3c303f51d71","src/benchmarks/client.rs":"e5897d4e2eda06809fa6dc6db4e780b9ef266f613fb113aa6613b83f7005dd0b","src/benchmarks/geoname.rs":"00fab05cf9465cf8e22e143cde75a81885411001b240af00efda4071975d0563","src/benchmarks/ingest.rs":"1f3b5eca704c51bc8f972e7a3492a518516461e5834f97a5f7d1855a048ab16b","src/benchmarks/mod.rs":"24751c377f549ead6b6e1d46685c649f51303cc090f6374c93633f71dcf3cadf","src/benchmarks/query.rs":"d54946063e72cf98e7f46d94665c17c66af637774c2bb50cd5798dbe63d74f3c","src/bin/debug_ingestion_sizes.rs":"ce6e810be7b3fc19e826d75b622b82cfab5a1a99397a6d0833c2c4eebff2d364","src/config.rs":"0ca876e845841bb6429862c0904c82265003f53b55aea053fac60aed278586a7","src/db.rs":"566e62ab951c0a372450ffb8842ded85a0147242cf191254d895dc0fe320a58c","src/error.rs":"e2ef3ec0e0b2b8ecbb8f2f1717d4cb753af06913b8395d086b7643098ad100a7","src/fakespot.rs":"f501c9fe5296e7c130a9fcb532b861465717652cb5ef688230bc7a3b94df91b1","src/geoname.rs":"77376dbc7d06532a7797a93b863f150317df7f31d9200d375c8ea489ac8bee6f","src/lib.rs":"a4c0989a01a7c13184049c1f11bc7813cd3cbfb6354fcca1f5a7204e45a0dc9c","src/metrics.rs":"871f0d834efbbc9e26d61f66fa31f0021dcf41444746cd7c082f93ba9628e399","src/pocket.rs":"1316668840ec9b4ea886223921dc9d3b5a1731d1a5206c0b1089f2a6c45c1b7b","src/provider.rs":"cf00114a4293a4c9d956efffb8a6859f3568ea0e4868c6b63b8273daca69b0d5","src/query.rs":"66f229272c9245eb8ee0cab237071627aec599f145f64da8894bcaeb1ed7c6f9","src/rs.rs":"37cce2cb0068421f6b40e13f3bcb1f6212acee2f7117759cd095d381b25580f8","src/schema.rs":"51dfe27c01884dfbd3bb7c868c01505dd69cf119d9bb37ddb653f77ead170956","src/store.rs":"d127c58e26a3e380e815e11e6660feb58df335ab40426aa051902a6fec659b5a","src/suggestion.rs":"e74abdc1eace082ad7ed8762bcee25b1943ec3d04d7e644959c5737b42732660","src/testing/client.rs":"47a32fd84c733001f11e8bfff94dc8c060b6b0780346dca5ddc7a5f5489c1d85","src/testing/data.rs":"5b1935946185f55be2383f2f979e966155825b1b9df7913d93eb50289052639c","src/testing/mod.rs":"34120abb160a913069c3f7df03c4f52815be3461dbbf08fb0fcc4251a517ba71","src/util.rs":"52c6ec405637afa2d1a89f29fbbb7dcc341546b6deb97d326c4490bbf8713cb0","src/weather.rs":"7cc9167dcdfca49d6ad91eba6fba4d5fd49f45052f25a7fe3ad6749d3e6783fb","src/yelp.rs":"0b9dfa698d9c3162d47c0103d1799838d444345f9d7f943eedc6bcc98fd8b57d","uniffi.toml":"8205e4679ac26d53e70af0f85c013fd27cda1119f4322aebf5f2b9403d45a611"},"package":null} \ No newline at end of file +{"files":{"Cargo.toml":"922b2e4d85f325dbef99d5e439558a75dbfda82e1d263c2dd3bfadac9879df18","README.md":"5e28baf874b643d756228bdab345e287bf107d3182dfe6a18aafadcc4b9a3fc9","benches/benchmark_all.rs":"5909dfb1e62793afb1f2bc15b75914527a4d14fce6796307c04a309e45c0598c","metrics.yaml":"0540ab2271aeab7f07335c7ceec12acde942995f9dcb3c29070489aa61899d56","src/benchmarks/README.md":"ccee8dbddba8762d0453fa855bd6984137b224b8c019f3dd8e86a3c303f51d71","src/benchmarks/client.rs":"e5897d4e2eda06809fa6dc6db4e780b9ef266f613fb113aa6613b83f7005dd0b","src/benchmarks/geoname.rs":"00fab05cf9465cf8e22e143cde75a81885411001b240af00efda4071975d0563","src/benchmarks/ingest.rs":"1f3b5eca704c51bc8f972e7a3492a518516461e5834f97a5f7d1855a048ab16b","src/benchmarks/mod.rs":"24751c377f549ead6b6e1d46685c649f51303cc090f6374c93633f71dcf3cadf","src/benchmarks/query.rs":"d54946063e72cf98e7f46d94665c17c66af637774c2bb50cd5798dbe63d74f3c","src/bin/debug_ingestion_sizes.rs":"ce6e810be7b3fc19e826d75b622b82cfab5a1a99397a6d0833c2c4eebff2d364","src/config.rs":"0ca876e845841bb6429862c0904c82265003f53b55aea053fac60aed278586a7","src/db.rs":"04c04be4a71e1e671734147a0c153c7fb06254d7fe6aa016f64efd8a21826fe8","src/error.rs":"e2ef3ec0e0b2b8ecbb8f2f1717d4cb753af06913b8395d086b7643098ad100a7","src/fakespot.rs":"f501c9fe5296e7c130a9fcb532b861465717652cb5ef688230bc7a3b94df91b1","src/geoname.rs":"77376dbc7d06532a7797a93b863f150317df7f31d9200d375c8ea489ac8bee6f","src/lib.rs":"a4c0989a01a7c13184049c1f11bc7813cd3cbfb6354fcca1f5a7204e45a0dc9c","src/metrics.rs":"871f0d834efbbc9e26d61f66fa31f0021dcf41444746cd7c082f93ba9628e399","src/pocket.rs":"1316668840ec9b4ea886223921dc9d3b5a1731d1a5206c0b1089f2a6c45c1b7b","src/provider.rs":"cf00114a4293a4c9d956efffb8a6859f3568ea0e4868c6b63b8273daca69b0d5","src/query.rs":"66f229272c9245eb8ee0cab237071627aec599f145f64da8894bcaeb1ed7c6f9","src/rs.rs":"37cce2cb0068421f6b40e13f3bcb1f6212acee2f7117759cd095d381b25580f8","src/schema.rs":"56a4da91b703000dce1399467cd10b6b5c1ab32b33c9ed7b1c928b4536b48546","src/store.rs":"b9da68feba614d5df598bfb9facda115aa2aadda1c6f8374c340bada27311876","src/suggestion.rs":"bd4acd1d7f0bfd4ceebd52d44d4ea6ac639d32ef43819e217fbffaa9346b50f2","src/testing/client.rs":"47a32fd84c733001f11e8bfff94dc8c060b6b0780346dca5ddc7a5f5489c1d85","src/testing/data.rs":"5b1935946185f55be2383f2f979e966155825b1b9df7913d93eb50289052639c","src/testing/mod.rs":"34120abb160a913069c3f7df03c4f52815be3461dbbf08fb0fcc4251a517ba71","src/util.rs":"52c6ec405637afa2d1a89f29fbbb7dcc341546b6deb97d326c4490bbf8713cb0","src/weather.rs":"7cc9167dcdfca49d6ad91eba6fba4d5fd49f45052f25a7fe3ad6749d3e6783fb","src/yelp.rs":"0b9dfa698d9c3162d47c0103d1799838d444345f9d7f943eedc6bcc98fd8b57d","uniffi.toml":"8205e4679ac26d53e70af0f85c013fd27cda1119f4322aebf5f2b9403d45a611"},"package":null} \ No newline at end of file diff --git a/third_party/rust/suggest/src/db.rs b/third_party/rust/suggest/src/db.rs index 427473567d9..f643ce5dd93 100644 --- a/third_party/rust/suggest/src/db.rs +++ b/third_party/rust/suggest/src/db.rs @@ -1271,12 +1271,12 @@ impl<'a> SuggestDao<'a> { Ok(()) } - pub fn insert_dismissal(&self, url: &str) -> Result<()> { + pub fn insert_dismissal(&self, key: &str) -> Result<()> { self.conn.execute( "INSERT OR IGNORE INTO dismissed_suggestions(url) VALUES(:url)", named_params! { - ":url": url, + ":url": key, }, )?; Ok(()) @@ -1287,6 +1287,21 @@ impl<'a> SuggestDao<'a> { Ok(()) } + pub fn has_dismissal(&self, key: &str) -> Result { + Ok(self.conn.exists( + "SELECT 1 FROM dismissed_suggestions WHERE url = :url", + named_params! { + ":url": key, + }, + )?) + } + + pub fn any_dismissals(&self) -> Result { + Ok(self + .conn + .exists("SELECT 1 FROM dismissed_suggestions LIMIT 1", ())?) + } + /// Deletes all suggestions associated with a Remote Settings record from /// the database. pub fn drop_suggestions(&mut self, record_id: &SuggestRecordId) -> Result<()> { diff --git a/third_party/rust/suggest/src/schema.rs b/third_party/rust/suggest/src/schema.rs index db00c858169..c7287ebf338 100644 --- a/third_party/rust/suggest/src/schema.rs +++ b/third_party/rust/suggest/src/schema.rs @@ -23,7 +23,7 @@ use sql_support::{ /// `clear_database()` by adding their names to `conditional_tables`, unless /// they are cleared via a deletion trigger or there's some other good /// reason not to do so. -pub const VERSION: u32 = 35; +pub const VERSION: u32 = 36; /// The current Suggest database schema. pub const SQL: &str = " @@ -645,6 +645,10 @@ impl ConnectionInitializer for SuggestConnectionInitializer<'_> { )?; Ok(()) } + 35 => { + // The commit that added this migration was reverted. + Ok(()) + } _ => Err(open_database::Error::IncompatibleVersion(version)), } } diff --git a/third_party/rust/suggest/src/store.rs b/third_party/rust/suggest/src/store.rs index 951e882988e..0e4c8c53525 100644 --- a/third_party/rust/suggest/src/store.rs +++ b/third_party/rust/suggest/src/store.rs @@ -134,7 +134,7 @@ pub enum InterruptKind { /// Interrupt read operations like [SuggestStore::query] Read, /// Interrupt write operations. This mostly means [SuggestStore::ingest], but - /// [SuggestStore::dismiss_suggestion] may also be interrupted. + /// other operations may also be interrupted. Write, /// Interrupt both read and write operations, ReadWrite, @@ -204,12 +204,27 @@ impl SuggestStore { } /// Dismiss a suggestion. + /// + /// Dismissed suggestions cannot be fetched again. #[handle_error(Error)] - pub fn dismiss(&self, suggestion: &Suggestion) -> SuggestApiResult<()> { - self.inner.dismiss(suggestion) + pub fn dismiss_by_suggestion(&self, suggestion: &Suggestion) -> SuggestApiResult<()> { + self.inner.dismiss_by_suggestion(suggestion) } - /// Deprecated, use [SuggestStore::dismiss] instead. + /// Dismiss a suggestion by its dismissal key. + /// + /// Dismissed suggestions cannot be fetched again. + /// + /// Prefer [SuggestStore::dismiss_by_suggestion] if you have a + /// `crate::Suggestion`. This method is intended for cases where a + /// suggestion originates outside this component. + #[handle_error(Error)] + pub fn dismiss_by_key(&self, key: &str) -> SuggestApiResult<()> { + self.inner.dismiss_by_key(key) + } + + /// Deprecated, use [SuggestStore::dismiss_by_suggestion] or + /// [SuggestStore::dismiss_by_key] instead. /// /// Dismiss a suggestion /// @@ -225,6 +240,33 @@ impl SuggestStore { self.inner.clear_dismissed_suggestions() } + /// Return whether a suggestion has been dismissed. + /// + /// [SuggestStore::query] will never return dismissed suggestions, so + /// normally you never need to know whether a `Suggestion` has been + /// dismissed, but this method can be used to do so. + #[handle_error(Error)] + pub fn is_dismissed_by_suggestion(&self, suggestion: &Suggestion) -> SuggestApiResult { + self.inner.is_dismissed_by_suggestion(suggestion) + } + + /// Return whether a suggestion has been dismissed given its dismissal key. + /// + /// [SuggestStore::query] will never return dismissed suggestions, so + /// normally you never need to know whether a suggestion has been dismissed. + /// This method is intended for cases where a dismissal key originates + /// outside this component. + #[handle_error(Error)] + pub fn is_dismissed_by_key(&self, key: &str) -> SuggestApiResult { + self.inner.is_dismissed_by_key(key) + } + + /// Return whether any suggestions have been dismissed. + #[handle_error(Error)] + pub fn any_dismissed_suggestions(&self) -> SuggestApiResult { + self.inner.any_dismissed_suggestions() + } + /// Interrupts any ongoing queries. /// /// This should be called when the user types new input into the address @@ -448,15 +490,17 @@ impl SuggestStoreInner { }) } - fn dismiss(&self, suggestion: &Suggestion) -> Result<()> { - if let Some(dismissal_key) = suggestion.dismissal_key() { - self.dbs()? - .writer - .write(|dao| dao.insert_dismissal(dismissal_key))?; + fn dismiss_by_suggestion(&self, suggestion: &Suggestion) -> Result<()> { + if let Some(key) = suggestion.dismissal_key() { + self.dismiss_by_key(key)?; } Ok(()) } + fn dismiss_by_key(&self, key: &str) -> Result<()> { + self.dbs()?.writer.write(|dao| dao.insert_dismissal(key)) + } + fn dismiss_suggestion(&self, suggestion_url: String) -> Result<()> { self.dbs()? .writer @@ -468,6 +512,22 @@ impl SuggestStoreInner { Ok(()) } + fn is_dismissed_by_suggestion(&self, suggestion: &Suggestion) -> Result { + if let Some(key) = suggestion.dismissal_key() { + self.dbs()?.reader.read(|dao| dao.has_dismissal(key)) + } else { + Ok(false) + } + } + + fn is_dismissed_by_key(&self, key: &str) -> Result { + self.dbs()?.reader.read(|dao| dao.has_dismissal(key)) + } + + fn any_dismissed_suggestions(&self) -> Result { + self.dbs()?.reader.read(|dao| dao.any_dismissals()) + } + fn interrupt(&self, kind: Option) { if let Some(dbs) = self.dbs.get() { // Only interrupt if the databases are already open. @@ -1174,8 +1234,12 @@ pub(crate) mod tests { assert_eq!(suggestions[0].dismissal_key(), expected_dismissal_key); // Dismiss the suggestion. - store.inner.dismiss(&suggestions[0])?; + let dismissal_key = suggestions[0].dismissal_key().unwrap(); + store.inner.dismiss_by_suggestion(&suggestions[0])?; assert_eq!(store.fetch_suggestions(SuggestionQuery::amp(query)), vec![]); + assert!(store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(store.inner.any_dismissed_suggestions()?); // Clear dismissals and fetch again. store.inner.clear_dismissed_suggestions()?; @@ -1183,19 +1247,44 @@ pub(crate) mod tests { store.fetch_suggestions(SuggestionQuery::amp(query)), vec![expected_suggestion.clone()] ); + assert!(!store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(!store.inner.any_dismissed_suggestions()?); - // Dismiss the suggestion by its raw URL using the deprecated API. - store - .inner - .dismiss_suggestion(expected_suggestion.raw_url().unwrap().to_string())?; + // Dismiss the suggestion by its dismissal key. + store.inner.dismiss_by_key(dismissal_key)?; assert_eq!(store.fetch_suggestions(SuggestionQuery::amp(query)), vec![]); + assert!(store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(store.inner.any_dismissed_suggestions()?); // Clear dismissals and fetch again. store.inner.clear_dismissed_suggestions()?; assert_eq!( store.fetch_suggestions(SuggestionQuery::amp(query)), - vec![expected_suggestion] + vec![expected_suggestion.clone()] ); + assert!(!store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(!store.inner.any_dismissed_suggestions()?); + + // Dismiss the suggestion by its raw URL using the deprecated API. + let raw_url = expected_suggestion.raw_url().unwrap(); + store.inner.dismiss_suggestion(raw_url.to_string())?; + assert_eq!(store.fetch_suggestions(SuggestionQuery::amp(query)), vec![]); + assert!(store.inner.is_dismissed_by_key(raw_url)?); + assert!(store.inner.any_dismissed_suggestions()?); + + // Clear dismissals and fetch again. + store.inner.clear_dismissed_suggestions()?; + assert_eq!( + store.fetch_suggestions(SuggestionQuery::amp(query)), + vec![expected_suggestion.clone()] + ); + assert!(!store.inner.is_dismissed_by_suggestion(&suggestions[0])?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(!store.inner.is_dismissed_by_key(raw_url)?); + assert!(!store.inner.any_dismissed_suggestions()?); } Ok(()) @@ -2452,19 +2541,32 @@ pub(crate) mod tests { let results = store.fetch_suggestions(query.clone()); assert_eq!(results.len(), 5); - for result in results { - store - .inner - .dismiss_suggestion(result.raw_url().unwrap().to_string())?; + assert!(!store.inner.any_dismissed_suggestions()?); + + for result in &results { + let dismissal_key = result.dismissal_key().unwrap(); + assert!(!store.inner.is_dismissed_by_suggestion(result)?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + store.inner.dismiss_by_suggestion(result)?; + assert!(store.inner.is_dismissed_by_suggestion(result)?); + assert!(store.inner.is_dismissed_by_key(dismissal_key)?); + assert!(store.inner.any_dismissed_suggestions()?); } // After dismissing the suggestions, the next query shouldn't return them - assert_eq!(store.fetch_suggestions(query.clone()).len(), 0); + assert_eq!(store.fetch_suggestions(query.clone()), vec![]); // Clearing the dismissals should cause them to be returned again store.inner.clear_dismissed_suggestions()?; assert_eq!(store.fetch_suggestions(query.clone()).len(), 5); + for result in &results { + let dismissal_key = result.dismissal_key().unwrap(); + assert!(!store.inner.is_dismissed_by_suggestion(result)?); + assert!(!store.inner.is_dismissed_by_key(dismissal_key)?); + } + assert!(!store.inner.any_dismissed_suggestions()?); + Ok(()) } @@ -3697,8 +3799,9 @@ pub(crate) mod tests { }); // Make sure the suggestions are initially fetchable. + let suggestions = store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])); assert_eq!( - store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])), + suggestions, vec![ Suggestion::Dynamic { suggestion_type: "aaa".to_string(), @@ -3722,7 +3825,8 @@ pub(crate) mod tests { ); // Dismiss the first suggestion. - store.inner.dismiss_suggestion("dk0".to_string())?; + assert_eq!(suggestions[0].dismissal_key(), Some("dk0")); + store.inner.dismiss_by_suggestion(&suggestions[0])?; assert_eq!( store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])), vec![ @@ -3742,7 +3846,8 @@ pub(crate) mod tests { ); // Dismiss the second suggestion. - store.inner.dismiss_suggestion("dk1".to_string())?; + assert_eq!(suggestions[1].dismissal_key(), Some("dk1")); + store.inner.dismiss_by_suggestion(&suggestions[1])?; assert_eq!( store.fetch_suggestions(SuggestionQuery::dynamic("aaa", &["aaa"])), vec![Suggestion::Dynamic { diff --git a/third_party/rust/suggest/src/suggestion.rs b/third_party/rust/suggest/src/suggestion.rs index cb8452625ba..3d96d01b4df 100644 --- a/third_party/rust/suggest/src/suggestion.rs +++ b/third_party/rust/suggest/src/suggestion.rs @@ -146,14 +146,14 @@ impl Suggestion { self.raw_url() } } + Self::Dynamic { dismissal_key, .. } => dismissal_key.as_deref(), Self::Pocket { .. } | Self::Wikipedia { .. } | Self::Amo { .. } | Self::Yelp { .. } | Self::Mdn { .. } | Self::Weather { .. } - | Self::Fakespot { .. } - | Self::Dynamic { .. } => self.raw_url(), + | Self::Fakespot { .. } => self.raw_url(), } } diff --git a/third_party/sqlite3/ext/lib.symbols b/third_party/sqlite3/ext/lib.symbols index 14521ef4005..ee5dddc2a6c 100644 --- a/third_party/sqlite3/ext/lib.symbols +++ b/third_party/sqlite3/ext/lib.symbols @@ -3,3 +3,4 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. sqlite3_fts5_init +sqlite3_vec_init diff --git a/third_party/sqlite3/ext/moz.build b/third_party/sqlite3/ext/moz.build index ffd938b601f..b31cb14acab 100644 --- a/third_party/sqlite3/ext/moz.build +++ b/third_party/sqlite3/ext/moz.build @@ -18,6 +18,7 @@ else: SOURCES += [ "fts5.c", + "sqlite-vec/sqlite-vec.c", ] if CONFIG["OS_TARGET"] == "Linux" or CONFIG["OS_TARGET"] == "Android": diff --git a/third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT b/third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT new file mode 100644 index 00000000000..9c106bc48c7 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Alex Garcia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/sqlite3/ext/sqlite-vec/VERSION.txt b/third_party/sqlite3/ext/sqlite-vec/VERSION.txt new file mode 100644 index 00000000000..d9d7c74bbb7 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/VERSION.txt @@ -0,0 +1 @@ +0.1.7-alpha.2 \ No newline at end of file diff --git a/third_party/sqlite3/ext/sqlite-vec/moz.yaml b/third_party/sqlite3/ext/sqlite-vec/moz.yaml new file mode 100644 index 00000000000..84acb6584b8 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/moz.yaml @@ -0,0 +1,50 @@ +schema: 1 + +bugzilla: + product: Toolkit + component: Storage + +origin: + name: sqlite-vec + description: > + An extremely small, "fast enough" vector search SQLite extension that runs + anywhere! + url: https://github.com/asg017/sqlite-vec + release: v0.1.7-alpha.2 (2025-01-10T14:54:13-08:00). + revision: v0.1.7-alpha.2 + license: MIT + license-file: LICENSE-MIT + notes: > + Please check for eventual limitations of this extension on the Github page + official documentation. + +vendoring: + url: https://github.com/asg017/sqlite-vec + source-hosting: github + tracking: tag + vendor-directory: third_party/sqlite3/ext/sqlite-vec + skip-vendoring-steps: + - update-moz-build + exclude: + - "**" + include: + - LICENSE-MIT + - VERSION + - sqlite-vec.c + keep: + - moz.yaml + - vendor.sh + + update-actions: + - action: move-file + from: '{vendor_dir}/VERSION' + to: '{vendor_dir}/VERSION.txt' + # Linking multiple extensions in the same library ends up defining + # sqlite3_api multiple times, INIT3 is just an extern declaration. + - action: replace-in-file + pattern: 'SQLITE_EXTENSION_INIT1' + with: 'SQLITE_EXTENSION_INIT3' + file: '{vendor_dir}/sqlite-vec.c' + - action: run-script + script: '{yaml_dir}/vendor.sh' + cwd: '{vendor_dir}' diff --git a/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c new file mode 100644 index 00000000000..057b5d795b3 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.c @@ -0,0 +1,9751 @@ +#include "sqlite-vec.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef SQLITE_VEC_OMIT_FS +#include +#endif + +#ifndef SQLITE_CORE +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT3 +#else +#include "sqlite3.h" +#endif + +#ifndef UINT32_TYPE +#ifdef HAVE_UINT32_T +#define UINT32_TYPE uint32_t +#else +#define UINT32_TYPE unsigned int +#endif +#endif +#ifndef UINT16_TYPE +#ifdef HAVE_UINT16_T +#define UINT16_TYPE uint16_t +#else +#define UINT16_TYPE unsigned short int +#endif +#endif +#ifndef INT16_TYPE +#ifdef HAVE_INT16_T +#define INT16_TYPE int16_t +#else +#define INT16_TYPE short int +#endif +#endif +#ifndef UINT8_TYPE +#ifdef HAVE_UINT8_T +#define UINT8_TYPE uint8_t +#else +#define UINT8_TYPE unsigned char +#endif +#endif +#ifndef INT8_TYPE +#ifdef HAVE_INT8_T +#define INT8_TYPE int8_t +#else +#define INT8_TYPE signed char +#endif +#endif +#ifndef LONGDOUBLE_TYPE +#define LONGDOUBLE_TYPE long double +#endif + +#ifndef _WIN32 +#ifndef __EMSCRIPTEN__ +#ifndef __COSMOPOLITAN__ +#ifndef __wasi__ +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int64_t uint64_t; +#endif +#endif +#endif +#endif + +typedef int8_t i8; +typedef uint8_t u8; +typedef int16_t i16; +typedef int32_t i32; +typedef sqlite3_int64 i64; +typedef uint32_t u32; +typedef uint64_t u64; +typedef float f32; +typedef size_t usize; + +#ifndef UNUSED_PARAMETER +#define UNUSED_PARAMETER(X) (void)(X) +#endif + +// sqlite3_vtab_in() was added in SQLite version 3.38 (2022-02-22) +// https://www.sqlite.org/changes.html#version_3_38_0 +#if SQLITE_VERSION_NUMBER >= 3038000 +#define COMPILER_SUPPORTS_VTAB_IN 1 +#endif + +#ifndef SQLITE_SUBTYPE +#define SQLITE_SUBTYPE 0x000100000 +#endif + +#ifndef SQLITE_RESULT_SUBTYPE +#define SQLITE_RESULT_SUBTYPE 0x001000000 +#endif + +#ifndef SQLITE_INDEX_CONSTRAINT_LIMIT +#define SQLITE_INDEX_CONSTRAINT_LIMIT 73 +#endif + +#ifndef SQLITE_INDEX_CONSTRAINT_OFFSET +#define SQLITE_INDEX_CONSTRAINT_OFFSET 74 +#endif + +#define countof(x) (sizeof(x) / sizeof((x)[0])) +#define min(a, b) (((a) <= (b)) ? (a) : (b)) + +enum VectorElementType { + // clang-format off + SQLITE_VEC_ELEMENT_TYPE_FLOAT32 = 223 + 0, + SQLITE_VEC_ELEMENT_TYPE_BIT = 223 + 1, + SQLITE_VEC_ELEMENT_TYPE_INT8 = 223 + 2, + // clang-format on +}; + +#ifdef SQLITE_VEC_ENABLE_AVX +#include +#define PORTABLE_ALIGN32 __attribute__((aligned(32))) +#define PORTABLE_ALIGN64 __attribute__((aligned(64))) + +static f32 l2_sqr_float_avx(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + f32 PORTABLE_ALIGN32 TmpRes[8]; + size_t qty16 = qty >> 4; + + const f32 *pEnd1 = pVect1 + (qty16 << 4); + + __m256 diff, v1, v2; + __m256 sum = _mm256_set1_ps(0); + + while (pVect1 < pEnd1) { + v1 = _mm256_loadu_ps(pVect1); + pVect1 += 8; + v2 = _mm256_loadu_ps(pVect2); + pVect2 += 8; + diff = _mm256_sub_ps(v1, v2); + sum = _mm256_add_ps(sum, _mm256_mul_ps(diff, diff)); + + v1 = _mm256_loadu_ps(pVect1); + pVect1 += 8; + v2 = _mm256_loadu_ps(pVect2); + pVect2 += 8; + diff = _mm256_sub_ps(v1, v2); + sum = _mm256_add_ps(sum, _mm256_mul_ps(diff, diff)); + } + + _mm256_store_ps(TmpRes, sum); + return sqrt(TmpRes[0] + TmpRes[1] + TmpRes[2] + TmpRes[3] + TmpRes[4] + + TmpRes[5] + TmpRes[6] + TmpRes[7]); +} +#endif + +#ifdef SQLITE_VEC_ENABLE_NEON +#include + +#define PORTABLE_ALIGN32 __attribute__((aligned(32))) + +// thx https://github.com/nmslib/hnswlib/pull/299/files +static f32 l2_sqr_float_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + size_t qty16 = qty >> 4; + + const f32 *pEnd1 = pVect1 + (qty16 << 4); + + float32x4_t diff, v1, v2; + float32x4_t sum0 = vdupq_n_f32(0); + float32x4_t sum1 = vdupq_n_f32(0); + float32x4_t sum2 = vdupq_n_f32(0); + float32x4_t sum3 = vdupq_n_f32(0); + + while (pVect1 < pEnd1) { + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum0 = vfmaq_f32(sum0, diff, diff); + + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum1 = vfmaq_f32(sum1, diff, diff); + + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum2 = vfmaq_f32(sum2, diff, diff); + + v1 = vld1q_f32(pVect1); + pVect1 += 4; + v2 = vld1q_f32(pVect2); + pVect2 += 4; + diff = vsubq_f32(v1, v2); + sum3 = vfmaq_f32(sum3, diff, diff); + } + + f32 sum_scalar = + vaddvq_f32(vaddq_f32(vaddq_f32(sum0, sum1), vaddq_f32(sum2, sum3))); + const f32 *pEnd2 = pVect1 + (qty - (qty16 << 4)); + while (pVect1 < pEnd2) { + f32 diff = *pVect1 - *pVect2; + sum_scalar += diff * diff; + pVect1++; + pVect2++; + } + + return sqrt(sum_scalar); +} + +static f32 l2_sqr_int8_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + i8 *pVect1 = (i8 *)pVect1v; + i8 *pVect2 = (i8 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + const i8 *pEnd1 = pVect1 + qty; + i32 sum_scalar = 0; + + while (pVect1 < pEnd1 - 7) { + // loading 8 at a time + int8x8_t v1 = vld1_s8(pVect1); + int8x8_t v2 = vld1_s8(pVect2); + pVect1 += 8; + pVect2 += 8; + + // widen to protect against overflow + int16x8_t v1_wide = vmovl_s8(v1); + int16x8_t v2_wide = vmovl_s8(v2); + + int16x8_t diff = vsubq_s16(v1_wide, v2_wide); + int16x8_t squared_diff = vmulq_s16(diff, diff); + int32x4_t sum = vpaddlq_s16(squared_diff); + + sum_scalar += vgetq_lane_s32(sum, 0) + vgetq_lane_s32(sum, 1) + + vgetq_lane_s32(sum, 2) + vgetq_lane_s32(sum, 3); + } + + // handle leftovers + while (pVect1 < pEnd1) { + i16 diff = (i16)*pVect1 - (i16)*pVect2; + sum_scalar += diff * diff; + pVect1++; + pVect2++; + } + + return sqrtf(sum_scalar); +} + +static i32 l1_int8_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + i8 *pVect1 = (i8 *)pVect1v; + i8 *pVect2 = (i8 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + const int8_t *pEnd1 = pVect1 + qty; + + int32x4_t acc1 = vdupq_n_s32(0); + int32x4_t acc2 = vdupq_n_s32(0); + int32x4_t acc3 = vdupq_n_s32(0); + int32x4_t acc4 = vdupq_n_s32(0); + + while (pVect1 < pEnd1 - 63) { + int8x16_t v1 = vld1q_s8(pVect1); + int8x16_t v2 = vld1q_s8(pVect2); + int8x16_t diff1 = vabdq_s8(v1, v2); + acc1 = vaddq_s32(acc1, vpaddlq_u16(vpaddlq_u8(diff1))); + + v1 = vld1q_s8(pVect1 + 16); + v2 = vld1q_s8(pVect2 + 16); + int8x16_t diff2 = vabdq_s8(v1, v2); + acc2 = vaddq_s32(acc2, vpaddlq_u16(vpaddlq_u8(diff2))); + + v1 = vld1q_s8(pVect1 + 32); + v2 = vld1q_s8(pVect2 + 32); + int8x16_t diff3 = vabdq_s8(v1, v2); + acc3 = vaddq_s32(acc3, vpaddlq_u16(vpaddlq_u8(diff3))); + + v1 = vld1q_s8(pVect1 + 48); + v2 = vld1q_s8(pVect2 + 48); + int8x16_t diff4 = vabdq_s8(v1, v2); + acc4 = vaddq_s32(acc4, vpaddlq_u16(vpaddlq_u8(diff4))); + + pVect1 += 64; + pVect2 += 64; + } + + while (pVect1 < pEnd1 - 15) { + int8x16_t v1 = vld1q_s8(pVect1); + int8x16_t v2 = vld1q_s8(pVect2); + int8x16_t diff = vabdq_s8(v1, v2); + acc1 = vaddq_s32(acc1, vpaddlq_u16(vpaddlq_u8(diff))); + pVect1 += 16; + pVect2 += 16; + } + + int32x4_t acc = vaddq_s32(vaddq_s32(acc1, acc2), vaddq_s32(acc3, acc4)); + + int32_t sum = 0; + while (pVect1 < pEnd1) { + int32_t diff = abs((int32_t)*pVect1 - (int32_t)*pVect2); + sum += diff; + pVect1++; + pVect2++; + } + + return vaddvq_s32(acc) + sum; +} + +static double l1_f32_neon(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + const f32 *pEnd1 = pVect1 + qty; + float64x2_t acc = vdupq_n_f64(0); + + while (pVect1 < pEnd1 - 3) { + float32x4_t v1 = vld1q_f32(pVect1); + float32x4_t v2 = vld1q_f32(pVect2); + pVect1 += 4; + pVect2 += 4; + + // f32x4 -> f64x2 pad for overflow + float64x2_t low_diff = vabdq_f64(vcvt_f64_f32(vget_low_f32(v1)), + vcvt_f64_f32(vget_low_f32(v2))); + float64x2_t high_diff = + vabdq_f64(vcvt_high_f64_f32(v1), vcvt_high_f64_f32(v2)); + + acc = vaddq_f64(acc, vaddq_f64(low_diff, high_diff)); + } + + double sum = 0; + while (pVect1 < pEnd1) { + sum += fabs((double)*pVect1 - (double)*pVect2); + pVect1++; + pVect2++; + } + + return vaddvq_f64(acc) + sum; +} +#endif + +static f32 l2_sqr_float(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + f32 res = 0; + for (size_t i = 0; i < qty; i++) { + f32 t = *pVect1 - *pVect2; + pVect1++; + pVect2++; + res += t * t; + } + return sqrt(res); +} + +static f32 l2_sqr_int8(const void *pA, const void *pB, const void *pD) { + i8 *a = (i8 *)pA; + i8 *b = (i8 *)pB; + size_t d = *((size_t *)pD); + + f32 res = 0; + for (size_t i = 0; i < d; i++) { + f32 t = *a - *b; + a++; + b++; + res += t * t; + } + return sqrt(res); +} + +static f32 distance_l2_sqr_float(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 16) { + return l2_sqr_float_neon(a, b, d); + } +#endif +#ifdef SQLITE_VEC_ENABLE_AVX + if (((*(const size_t *)d) % 16 == 0)) { + return l2_sqr_float_avx(a, b, d); + } +#endif + return l2_sqr_float(a, b, d); +} + +static f32 distance_l2_sqr_int8(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 7) { + return l2_sqr_int8_neon(a, b, d); + } +#endif + return l2_sqr_int8(a, b, d); +} + +static i32 l1_int8(const void *pA, const void *pB, const void *pD) { + i8 *a = (i8 *)pA; + i8 *b = (i8 *)pB; + size_t d = *((size_t *)pD); + + i32 res = 0; + for (size_t i = 0; i < d; i++) { + res += abs(*a - *b); + a++; + b++; + } + + return res; +} + +static i32 distance_l1_int8(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 15) { + return l1_int8_neon(a, b, d); + } +#endif + return l1_int8(a, b, d); +} + +static double l1_f32(const void *pA, const void *pB, const void *pD) { + f32 *a = (f32 *)pA; + f32 *b = (f32 *)pB; + size_t d = *((size_t *)pD); + + double res = 0; + for (size_t i = 0; i < d; i++) { + res += fabs((double)*a - (double)*b); + a++; + b++; + } + + return res; +} + +static double distance_l1_f32(const void *a, const void *b, const void *d) { +#ifdef SQLITE_VEC_ENABLE_NEON + if ((*(const size_t *)d) > 3) { + return l1_f32_neon(a, b, d); + } +#endif + return l1_f32(a, b, d); +} + +static f32 distance_cosine_float(const void *pVect1v, const void *pVect2v, + const void *qty_ptr) { + f32 *pVect1 = (f32 *)pVect1v; + f32 *pVect2 = (f32 *)pVect2v; + size_t qty = *((size_t *)qty_ptr); + + f32 dot = 0; + f32 aMag = 0; + f32 bMag = 0; + for (size_t i = 0; i < qty; i++) { + dot += *pVect1 * *pVect2; + aMag += *pVect1 * *pVect1; + bMag += *pVect2 * *pVect2; + pVect1++; + pVect2++; + } + return 1 - (dot / (sqrt(aMag) * sqrt(bMag))); +} +static f32 distance_cosine_int8(const void *pA, const void *pB, + const void *pD) { + i8 *a = (i8 *)pA; + i8 *b = (i8 *)pB; + size_t d = *((size_t *)pD); + + f32 dot = 0; + f32 aMag = 0; + f32 bMag = 0; + for (size_t i = 0; i < d; i++) { + dot += *a * *b; + aMag += *a * *a; + bMag += *b * *b; + a++; + b++; + } + return 1 - (dot / (sqrt(aMag) * sqrt(bMag))); +} + +// https://github.com/facebookresearch/faiss/blob/77e2e79cd0a680adc343b9840dd865da724c579e/faiss/utils/hamming_distance/common.h#L34 +static u8 hamdist_table[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, + 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, + 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + +static f32 distance_hamming_u8(u8 *a, u8 *b, size_t n) { + int same = 0; + for (unsigned long i = 0; i < n; i++) { + same += hamdist_table[a[i] ^ b[i]]; + } + return (f32)same; +} + +#ifdef _MSC_VER +#if !defined(__clang__) && (defined(_M_ARM) || defined(_M_ARM64)) +// From +// https://github.com/ngtcp2/ngtcp2/blob/b64f1e77b5e0d880b93d31f474147fae4a1d17cc/lib/ngtcp2_ringbuf.c, +// line 34-43 +static unsigned int __builtin_popcountl(unsigned int x) { + unsigned int c = 0; + for (; x; ++c) { + x &= x - 1; + } + return c; +} +#else +#include +#define __builtin_popcountl __popcnt64 +#endif +#endif + +static f32 distance_hamming_u64(u64 *a, u64 *b, size_t n) { + int same = 0; + for (unsigned long i = 0; i < n; i++) { + same += __builtin_popcountl(a[i] ^ b[i]); + } + return (f32)same; +} + +/** + * @brief Calculate the hamming distance between two bitvectors. + * + * @param a - first bitvector, MUST have d dimensions + * @param b - second bitvector, MUST have d dimensions + * @param d - pointer to size_t, MUST be divisible by CHAR_BIT + * @return f32 + */ +static f32 distance_hamming(const void *a, const void *b, const void *d) { + size_t dimensions = *((size_t *)d); + + if ((dimensions % 64) == 0) { + return distance_hamming_u64((u64 *)a, (u64 *)b, dimensions / 8 / CHAR_BIT); + } + return distance_hamming_u8((u8 *)a, (u8 *)b, dimensions / CHAR_BIT); +} + +// from SQLite source: +// https://github.com/sqlite/sqlite/blob/a509a90958ddb234d1785ed7801880ccb18b497e/src/json.c#L153 +static const char vecJsonIsSpaceX[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +#define vecJsonIsspace(x) (vecJsonIsSpaceX[(unsigned char)x]) + +typedef void (*vector_cleanup)(void *p); + +void vector_cleanup_noop(void *_) { UNUSED_PARAMETER(_); } + +#define JSON_SUBTYPE 74 + +void vtab_set_error(sqlite3_vtab *pVTab, const char *zFormat, ...) { + va_list args; + sqlite3_free(pVTab->zErrMsg); + va_start(args, zFormat); + pVTab->zErrMsg = sqlite3_vmprintf(zFormat, args); + va_end(args); +} +struct Array { + size_t element_size; + size_t length; + size_t capacity; + void *z; +}; + +/** + * @brief Initial an array with the given element size and capacity. + * + * @param array + * @param element_size + * @param init_capacity + * @return SQLITE_OK on success, error code on failure. Only error is + * SQLITE_NOMEM + */ +int array_init(struct Array *array, size_t element_size, size_t init_capacity) { + int sz = element_size * init_capacity; + void *z = sqlite3_malloc(sz); + if (!z) { + return SQLITE_NOMEM; + } + memset(z, 0, sz); + + array->element_size = element_size; + array->length = 0; + array->capacity = init_capacity; + array->z = z; + return SQLITE_OK; +} + +int array_append(struct Array *array, const void *element) { + if (array->length == array->capacity) { + size_t new_capacity = array->capacity * 2 + 100; + void *z = sqlite3_realloc64(array->z, array->element_size * new_capacity); + if (z) { + array->capacity = new_capacity; + array->z = z; + } else { + return SQLITE_NOMEM; + } + } + memcpy(&((unsigned char *)array->z)[array->length * array->element_size], + element, array->element_size); + array->length++; + return SQLITE_OK; +} + +void array_cleanup(struct Array *array) { + if (!array) + return; + array->element_size = 0; + array->length = 0; + array->capacity = 0; + sqlite3_free(array->z); + array->z = NULL; +} + +char *vector_subtype_name(int subtype) { + switch (subtype) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + return "float32"; + case SQLITE_VEC_ELEMENT_TYPE_INT8: + return "int8"; + case SQLITE_VEC_ELEMENT_TYPE_BIT: + return "bit"; + } + return ""; +} +char *type_name(int type) { + switch (type) { + case SQLITE_INTEGER: + return "INTEGER"; + case SQLITE_BLOB: + return "BLOB"; + case SQLITE_TEXT: + return "TEXT"; + case SQLITE_FLOAT: + return "FLOAT"; + case SQLITE_NULL: + return "NULL"; + } + return ""; +} + +typedef void (*fvec_cleanup)(f32 *vector); + +void fvec_cleanup_noop(f32 *_) { UNUSED_PARAMETER(_); } + +static int fvec_from_value(sqlite3_value *value, f32 **vector, + size_t *dimensions, fvec_cleanup *cleanup, + char **pzErr) { + int value_type = sqlite3_value_type(value); + + if (value_type == SQLITE_BLOB) { + const void *blob = sqlite3_value_blob(value); + int bytes = sqlite3_value_bytes(value); + if (bytes == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + if ((bytes % sizeof(f32)) != 0) { + *pzErr = sqlite3_mprintf("invalid float32 vector BLOB length. Must be " + "divisible by %d, found %d", + sizeof(f32), bytes); + return SQLITE_ERROR; + } + *vector = (f32 *)blob; + *dimensions = bytes / sizeof(f32); + *cleanup = fvec_cleanup_noop; + return SQLITE_OK; + } + + if (value_type == SQLITE_TEXT) { + const char *source = (const char *)sqlite3_value_text(value); + int source_len = sqlite3_value_bytes(value); + if (source_len == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + int i = 0; + + struct Array x; + int rc = array_init(&x, sizeof(f32), ceil(source_len / 2.0)); + if (rc != SQLITE_OK) { + return rc; + } + + // advance leading whitespace to first '[' + while (i < source_len) { + if (vecJsonIsspace(source[i])) { + i++; + continue; + } + if (source[i] == '[') { + break; + } + + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + if (source[i] != '[') { + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + int offset = i + 1; + + while (offset < source_len) { + char *ptr = (char *)&source[offset]; + char *endptr; + + errno = 0; + double result = strtod(ptr, &endptr); + if ((errno != 0 && result == 0) // some interval error? + || (errno == ERANGE && + (result == HUGE_VAL || result == -HUGE_VAL)) // too big / smalls + ) { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + + if (endptr == ptr) { + if (*ptr != ']') { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + goto done; + } + + f32 res = (f32)result; + array_append(&x, (const void *)&res); + + offset += (endptr - ptr); + while (offset < source_len) { + if (vecJsonIsspace(source[offset])) { + offset++; + continue; + } + if (source[offset] == ',') { + offset++; + continue; + } + if (source[offset] == ']') + goto done; + break; + } + } + + done: + + if (x.length > 0) { + *vector = (f32 *)x.z; + *dimensions = x.length; + *cleanup = (fvec_cleanup)sqlite3_free; + return SQLITE_OK; + } + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + + *pzErr = sqlite3_mprintf( + "Input must have type BLOB (compact format) or TEXT (JSON), found %s", + type_name(value_type)); + return SQLITE_ERROR; +} + +static int bitvec_from_value(sqlite3_value *value, u8 **vector, + size_t *dimensions, vector_cleanup *cleanup, + char **pzErr) { + int value_type = sqlite3_value_type(value); + if (value_type == SQLITE_BLOB) { + const void *blob = sqlite3_value_blob(value); + int bytes = sqlite3_value_bytes(value); + if (bytes == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + *vector = (u8 *)blob; + *dimensions = bytes * CHAR_BIT; + *cleanup = vector_cleanup_noop; + return SQLITE_OK; + } + *pzErr = sqlite3_mprintf("Unknown type for bitvector."); + return SQLITE_ERROR; +} + +static int int8_vec_from_value(sqlite3_value *value, i8 **vector, + size_t *dimensions, vector_cleanup *cleanup, + char **pzErr) { + int value_type = sqlite3_value_type(value); + if (value_type == SQLITE_BLOB) { + const void *blob = sqlite3_value_blob(value); + int bytes = sqlite3_value_bytes(value); + if (bytes == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + *vector = (i8 *)blob; + *dimensions = bytes; + *cleanup = vector_cleanup_noop; + return SQLITE_OK; + } + + if (value_type == SQLITE_TEXT) { + const char *source = (const char *)sqlite3_value_text(value); + int source_len = sqlite3_value_bytes(value); + int i = 0; + + if (source_len == 0) { + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + + struct Array x; + int rc = array_init(&x, sizeof(i8), ceil(source_len / 2.0)); + if (rc != SQLITE_OK) { + return rc; + } + + // advance leading whitespace to first '[' + while (i < source_len) { + if (vecJsonIsspace(source[i])) { + i++; + continue; + } + if (source[i] == '[') { + break; + } + + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + if (source[i] != '[') { + *pzErr = sqlite3_mprintf( + "JSON array parsing error: Input does not start with '['"); + array_cleanup(&x); + return SQLITE_ERROR; + } + int offset = i + 1; + + while (offset < source_len) { + char *ptr = (char *)&source[offset]; + char *endptr; + + errno = 0; + long result = strtol(ptr, &endptr, 10); + if ((errno != 0 && result == 0) || + (errno == ERANGE && (result == LONG_MAX || result == LONG_MIN))) { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + + if (endptr == ptr) { + if (*ptr != ']') { + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("JSON parsing error"); + return SQLITE_ERROR; + } + goto done; + } + + if (result < INT8_MIN || result > INT8_MAX) { + sqlite3_free(x.z); + *pzErr = + sqlite3_mprintf("JSON parsing error: value out of range for int8"); + return SQLITE_ERROR; + } + + i8 res = (i8)result; + array_append(&x, (const void *)&res); + + offset += (endptr - ptr); + while (offset < source_len) { + if (vecJsonIsspace(source[offset])) { + offset++; + continue; + } + if (source[offset] == ',') { + offset++; + continue; + } + if (source[offset] == ']') + goto done; + break; + } + } + + done: + + if (x.length > 0) { + *vector = (i8 *)x.z; + *dimensions = x.length; + *cleanup = (vector_cleanup)sqlite3_free; + return SQLITE_OK; + } + sqlite3_free(x.z); + *pzErr = sqlite3_mprintf("zero-length vectors are not supported."); + return SQLITE_ERROR; + } + + *pzErr = sqlite3_mprintf("Unknown type for int8 vector."); + return SQLITE_ERROR; +} + +/** + * @brief Extract a vector from a sqlite3_value. Can be a float32, int8, or bit + * vector. + * + * @param value: the sqlite3_value to read from. + * @param vector: Output pointer to vector data. + * @param dimensions: Output number of dimensions + * @param dimensions: Output vector element type + * @param cleanup + * @param pzErrorMessage + * @return int SQLITE_OK on success, error code otherwise + */ +int vector_from_value(sqlite3_value *value, void **vector, size_t *dimensions, + enum VectorElementType *element_type, + vector_cleanup *cleanup, char **pzErrorMessage) { + int subtype = sqlite3_value_subtype(value); + if (!subtype || (subtype == SQLITE_VEC_ELEMENT_TYPE_FLOAT32) || + (subtype == JSON_SUBTYPE)) { + int rc = fvec_from_value(value, (f32 **)vector, dimensions, + (fvec_cleanup *)cleanup, pzErrorMessage); + if (rc == SQLITE_OK) { + *element_type = SQLITE_VEC_ELEMENT_TYPE_FLOAT32; + } + return rc; + } + + if (subtype == SQLITE_VEC_ELEMENT_TYPE_BIT) { + int rc = bitvec_from_value(value, (u8 **)vector, dimensions, cleanup, + pzErrorMessage); + if (rc == SQLITE_OK) { + *element_type = SQLITE_VEC_ELEMENT_TYPE_BIT; + } + return rc; + } + if (subtype == SQLITE_VEC_ELEMENT_TYPE_INT8) { + int rc = int8_vec_from_value(value, (i8 **)vector, dimensions, cleanup, + pzErrorMessage); + if (rc == SQLITE_OK) { + *element_type = SQLITE_VEC_ELEMENT_TYPE_INT8; + } + return rc; + } + *pzErrorMessage = sqlite3_mprintf("Unknown subtype: %d", subtype); + return SQLITE_ERROR; +} + +int ensure_vector_match(sqlite3_value *aValue, sqlite3_value *bValue, void **a, + void **b, enum VectorElementType *element_type, + size_t *dimensions, vector_cleanup *outACleanup, + vector_cleanup *outBCleanup, char **outError) { + int rc; + enum VectorElementType aType, bType; + size_t aDims, bDims; + char *error = NULL; + vector_cleanup aCleanup, bCleanup; + + rc = vector_from_value(aValue, a, &aDims, &aType, &aCleanup, &error); + if (rc != SQLITE_OK) { + *outError = sqlite3_mprintf("Error reading 1st vector: %s", error); + sqlite3_free(error); + return SQLITE_ERROR; + } + + rc = vector_from_value(bValue, b, &bDims, &bType, &bCleanup, &error); + if (rc != SQLITE_OK) { + *outError = sqlite3_mprintf("Error reading 2nd vector: %s", error); + sqlite3_free(error); + aCleanup(a); + return SQLITE_ERROR; + } + + if (aType != bType) { + *outError = + sqlite3_mprintf("Vector type mistmatch. First vector has type %s, " + "while the second has type %s.", + vector_subtype_name(aType), vector_subtype_name(bType)); + aCleanup(*a); + bCleanup(*b); + return SQLITE_ERROR; + } + if (aDims != bDims) { + *outError = sqlite3_mprintf( + "Vector dimension mistmatch. First vector has %ld dimensions, " + "while the second has %ld dimensions.", + aDims, bDims); + aCleanup(*a); + bCleanup(*b); + return SQLITE_ERROR; + } + *element_type = aType; + *dimensions = aDims; + *outACleanup = aCleanup; + *outBCleanup = bCleanup; + return SQLITE_OK; +} + +int _cmp(const void *a, const void *b) { return (*(i64 *)a - *(i64 *)b); } + +struct VecNpyFile { + char *path; + size_t pathLength; +}; +#define SQLITE_VEC_NPY_FILE_NAME "vec0-npy-file" + +#ifndef SQLITE_VEC_OMIT_FS +static void vec_npy_file(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + char *path = (char *)sqlite3_value_text(argv[0]); + size_t pathLength = sqlite3_value_bytes(argv[0]); + struct VecNpyFile *f; + + f = sqlite3_malloc(sizeof(*f)); + if (!f) { + sqlite3_result_error_nomem(context); + return; + } + memset(f, 0, sizeof(*f)); + + f->path = path; + f->pathLength = pathLength; + sqlite3_result_pointer(context, f, SQLITE_VEC_NPY_FILE_NAME, sqlite3_free); +} +#endif + +#pragma region scalar functions +static void vec_f32(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + int rc; + f32 *vector = NULL; + size_t dimensions; + fvec_cleanup cleanup; + char *errmsg; + rc = fvec_from_value(argv[0], &vector, &dimensions, &cleanup, &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_blob(context, vector, dimensions * sizeof(f32), + (void (*)(void *))cleanup); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); +} + +static void vec_bit(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + int rc; + u8 *vector; + size_t dimensions; + vector_cleanup cleanup; + char *errmsg; + rc = bitvec_from_value(argv[0], &vector, &dimensions, &cleanup, &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_blob(context, vector, dimensions / CHAR_BIT, SQLITE_TRANSIENT); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT); + cleanup(vector); +} +static void vec_int8(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + int rc; + i8 *vector; + size_t dimensions; + vector_cleanup cleanup; + char *errmsg; + rc = int8_vec_from_value(argv[0], &vector, &dimensions, &cleanup, &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_blob(context, vector, dimensions, SQLITE_TRANSIENT); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + cleanup(vector); +} + +static void vec_length(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + int rc; + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *errmsg; + enum VectorElementType elementType; + rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, &cleanup, + &errmsg); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, errmsg, -1); + sqlite3_free(errmsg); + return; + } + sqlite3_result_int64(context, dimensions); + cleanup(vector); +} + +static void vec_distance_cosine(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error( + context, "Cannot calculate cosine distance between two bitvectors.", + -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + f32 result = distance_cosine_float(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + f32 result = distance_cosine_int8(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +static void vec_distance_l2(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error( + context, "Cannot calculate L2 distance between two bitvectors.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + f32 result = distance_l2_sqr_float(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + f32 result = distance_l2_sqr_int8(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +static void vec_distance_l1(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a, *b; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error( + context, "Cannot calculate L1 distance between two bitvectors.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + double result = distance_l1_f32(a, b, &dimensions); + sqlite3_result_double(context, result); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + i64 result = distance_l1_int8(a, b, &dimensions); + sqlite3_result_int(context, result); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +static void vec_distance_hamming(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_double(context, distance_hamming(a, b, &dimensions)); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_error( + context, + "Cannot calculate hamming distance between two float32 vectors.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + sqlite3_result_error( + context, "Cannot calculate hamming distance between two int8 vectors.", + -1); + goto finish; + } + } + +finish: + aCleanup(a); + bCleanup(b); + return; +} + +char *vec_type_name(enum VectorElementType elementType) { + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + return "float32"; + case SQLITE_VEC_ELEMENT_TYPE_INT8: + return "int8"; + case SQLITE_VEC_ELEMENT_TYPE_BIT: + return "bit"; + } + return ""; +} + +static void vec_type(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *pzError; + enum VectorElementType elementType; + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &pzError); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, pzError, -1); + sqlite3_free(pzError); + return; + } + sqlite3_result_text(context, vec_type_name(elementType), -1, SQLITE_STATIC); + cleanup(vector); +} +static void vec_quantize_binary(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup vectorCleanup; + char *pzError; + enum VectorElementType elementType; + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &vectorCleanup, &pzError); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, pzError, -1); + sqlite3_free(pzError); + return; + } + + if (dimensions <= 0) { + sqlite3_result_error(context, "Zero length vectors are not supported.", -1); + goto cleanup; + return; + } + if ((dimensions % CHAR_BIT) != 0) { + sqlite3_result_error( + context, + "Binary quantization requires vectors with a length divisible by 8", + -1); + goto cleanup; + return; + } + + int sz = dimensions / CHAR_BIT; + u8 *out = sqlite3_malloc(sz); + if (!out) { + sqlite3_result_error_code(context, SQLITE_NOMEM); + goto cleanup; + return; + } + memset(out, 0, sz); + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + + for (size_t i = 0; i < dimensions; i++) { + int res = ((f32 *)vector)[i] > 0.0; + out[i / 8] |= (res << (i % 8)); + } + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + for (size_t i = 0; i < dimensions; i++) { + int res = ((i8 *)vector)[i] > 0; + out[i / 8] |= (res << (i % 8)); + } + break; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error(context, + "Can only binary quantize float or int8 vectors", -1); + sqlite3_free(out); + return; + } + } + sqlite3_result_blob(context, out, sz, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT); + +cleanup: + vectorCleanup(vector); +} + +static void vec_quantize_int8(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 2); + f32 *srcVector; + size_t dimensions; + fvec_cleanup srcCleanup; + char *err; + i8 *out = NULL; + int rc = fvec_from_value(argv[0], &srcVector, &dimensions, &srcCleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + int sz = dimensions * sizeof(i8); + out = sqlite3_malloc(sz); + if (!out) { + sqlite3_result_error_nomem(context); + goto cleanup; + } + memset(out, 0, sz); + + if ((sqlite3_value_type(argv[1]) != SQLITE_TEXT) || + (sqlite3_value_bytes(argv[1]) != strlen("unit")) || + (sqlite3_stricmp((const char *)sqlite3_value_text(argv[1]), "unit") != + 0)) { + sqlite3_result_error( + context, "2nd argument to vec_quantize_int8() must be 'unit'.", -1); + sqlite3_free(out); + goto cleanup; + } + f32 step = (1.0 - (-1.0)) / 255; + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((srcVector[i] - (-1.0)) / step) - 128; + } + + sqlite3_result_blob(context, out, dimensions * sizeof(i8), sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + +cleanup: + srcCleanup(srcVector); +} + +static void vec_add(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error(context, "Cannot add two bitvectors together.", -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + size_t outSize = dimensions * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((f32 *)a)[i] + ((f32 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + size_t outSize = dimensions * sizeof(i8); + i8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((i8 *)a)[i] + ((i8 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + goto finish; + } + } +finish: + aCleanup(a); + bCleanup(b); + return; +} +static void vec_sub(sqlite3_context *context, int argc, sqlite3_value **argv) { + assert(argc == 2); + int rc; + void *a = NULL, *b = NULL; + size_t dimensions; + vector_cleanup aCleanup, bCleanup; + char *error; + enum VectorElementType elementType; + rc = ensure_vector_match(argv[0], argv[1], &a, &b, &elementType, &dimensions, + &aCleanup, &bCleanup, &error); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, error, -1); + sqlite3_free(error); + return; + } + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + sqlite3_result_error(context, "Cannot subtract two bitvectors together.", + -1); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + size_t outSize = dimensions * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((f32 *)a)[i] - ((f32 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + goto finish; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + size_t outSize = dimensions * sizeof(i8); + i8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto finish; + } + memset(out, 0, outSize); + for (size_t i = 0; i < dimensions; i++) { + out[i] = ((i8 *)a)[i] - ((i8 *)b)[i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + goto finish; + } + } +finish: + aCleanup(a); + bCleanup(b); + return; +} +static void vec_slice(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 3); + + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *err; + enum VectorElementType elementType; + + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + int start = sqlite3_value_int(argv[1]); + int end = sqlite3_value_int(argv[2]); + + if (start < 0) { + sqlite3_result_error(context, + "slice 'start' index must be a postive number.", -1); + goto done; + } + if (end < 0) { + sqlite3_result_error(context, "slice 'end' index must be a postive number.", + -1); + goto done; + } + if (((size_t)start) > dimensions) { + sqlite3_result_error( + context, "slice 'start' index is greater than the number of dimensions", + -1); + goto done; + } + if (((size_t)end) > dimensions) { + sqlite3_result_error( + context, "slice 'end' index is greater than the number of dimensions", + -1); + goto done; + } + if (start > end) { + sqlite3_result_error(context, + "slice 'start' index is greater than 'end' index", -1); + goto done; + } + if (start == end) { + sqlite3_result_error(context, + "slice 'start' index is equal to the 'end' index, " + "vectors must have non-zero length", + -1); + goto done; + } + size_t n = end - start; + + switch (elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + int outSize = n * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + goto done; + } + memset(out, 0, outSize); + for (size_t i = 0; i < n; i++) { + out[i] = ((f32 *)vector)[start + i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + goto done; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + int outSize = n * sizeof(i8); + i8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + return; + } + memset(out, 0, outSize); + for (size_t i = 0; i < n; i++) { + out[i] = ((i8 *)vector)[start + i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_INT8); + goto done; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + if ((start % CHAR_BIT) != 0) { + sqlite3_result_error(context, "start index must be divisible by 8.", -1); + goto done; + } + if ((end % CHAR_BIT) != 0) { + sqlite3_result_error(context, "end index must be divisible by 8.", -1); + goto done; + } + int outSize = n / CHAR_BIT; + u8 *out = sqlite3_malloc(outSize); + if (!out) { + sqlite3_result_error_nomem(context); + return; + } + memset(out, 0, outSize); + for (size_t i = 0; i < n / CHAR_BIT; i++) { + out[i] = ((u8 *)vector)[(start / CHAR_BIT) + i]; + } + sqlite3_result_blob(context, out, outSize, sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_BIT); + goto done; + } + } +done: + cleanup(vector); +} + +static void vec_to_json(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *err; + enum VectorElementType elementType; + + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + sqlite3_str *str = sqlite3_str_new(sqlite3_context_db_handle(context)); + sqlite3_str_appendall(str, "["); + for (size_t i = 0; i < dimensions; i++) { + if (i != 0) { + sqlite3_str_appendall(str, ","); + } + if (elementType == SQLITE_VEC_ELEMENT_TYPE_FLOAT32) { + f32 value = ((f32 *)vector)[i]; + if (isnan(value)) { + sqlite3_str_appendall(str, "null"); + } else { + sqlite3_str_appendf(str, "%f", value); + } + + } else if (elementType == SQLITE_VEC_ELEMENT_TYPE_INT8) { + sqlite3_str_appendf(str, "%d", ((i8 *)vector)[i]); + } else if (elementType == SQLITE_VEC_ELEMENT_TYPE_BIT) { + u8 b = (((u8 *)vector)[i / 8] >> (i % CHAR_BIT)) & 1; + sqlite3_str_appendf(str, "%d", b); + } + } + sqlite3_str_appendall(str, "]"); + int len = sqlite3_str_length(str); + char *s = sqlite3_str_finish(str); + if (s) { + sqlite3_result_text(context, s, len, sqlite3_free); + sqlite3_result_subtype(context, JSON_SUBTYPE); + } else { + sqlite3_result_error_nomem(context); + } + cleanup(vector); +} + +static void vec_normalize(sqlite3_context *context, int argc, + sqlite3_value **argv) { + assert(argc == 1); + void *vector; + size_t dimensions; + vector_cleanup cleanup; + char *err; + enum VectorElementType elementType; + + int rc = vector_from_value(argv[0], &vector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + sqlite3_result_error(context, err, -1); + sqlite3_free(err); + return; + } + + if (elementType != SQLITE_VEC_ELEMENT_TYPE_FLOAT32) { + sqlite3_result_error( + context, "only float32 vectors are supported when normalizing", -1); + cleanup(vector); + return; + } + + int outSize = dimensions * sizeof(f32); + f32 *out = sqlite3_malloc(outSize); + if (!out) { + cleanup(vector); + sqlite3_result_error_code(context, SQLITE_NOMEM); + return; + } + memset(out, 0, outSize); + + f32 *v = (f32 *)vector; + + f32 norm = 0; + for (size_t i = 0; i < dimensions; i++) { + norm += v[i] * v[i]; + } + norm = sqrt(norm); + for (size_t i = 0; i < dimensions; i++) { + out[i] = v[i] / norm; + } + + sqlite3_result_blob(context, out, dimensions * sizeof(f32), sqlite3_free); + sqlite3_result_subtype(context, SQLITE_VEC_ELEMENT_TYPE_FLOAT32); + cleanup(vector); +} + +static void _static_text_func(sqlite3_context *context, int argc, + sqlite3_value **argv) { + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3_result_text(context, sqlite3_user_data(context), -1, SQLITE_STATIC); +} + +#pragma endregion + +enum Vec0TokenType { + TOKEN_TYPE_IDENTIFIER, + TOKEN_TYPE_DIGIT, + TOKEN_TYPE_LBRACKET, + TOKEN_TYPE_RBRACKET, + TOKEN_TYPE_PLUS, + TOKEN_TYPE_EQ, +}; +struct Vec0Token { + enum Vec0TokenType token_type; + char *start; + char *end; +}; + +int is_alpha(char x) { + return (x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z'); +} +int is_digit(char x) { return (x >= '0' && x <= '9'); } +int is_whitespace(char x) { + return x == ' ' || x == '\t' || x == '\n' || x == '\r'; +} + +#define VEC0_TOKEN_RESULT_EOF 1 +#define VEC0_TOKEN_RESULT_SOME 2 +#define VEC0_TOKEN_RESULT_ERROR 3 + +int vec0_token_next(char *start, char *end, struct Vec0Token *out) { + char *ptr = start; + while (ptr < end) { + char curr = *ptr; + if (is_whitespace(curr)) { + ptr++; + continue; + } else if (curr == '+') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_PLUS; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '[') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_LBRACKET; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ']') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_RBRACKET; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '=') { + ptr++; + out->start = ptr; + out->end = ptr; + out->token_type = TOKEN_TYPE_EQ; + return VEC0_TOKEN_RESULT_SOME; + } else if (is_alpha(curr)) { + char *start = ptr; + while (ptr < end && (is_alpha(*ptr) || is_digit(*ptr) || *ptr == '_')) { + ptr++; + } + out->start = start; + out->end = ptr; + out->token_type = TOKEN_TYPE_IDENTIFIER; + return VEC0_TOKEN_RESULT_SOME; + } else if (is_digit(curr)) { + char *start = ptr; + while (ptr < end && (is_digit(*ptr))) { + ptr++; + } + out->start = start; + out->end = ptr; + out->token_type = TOKEN_TYPE_DIGIT; + return VEC0_TOKEN_RESULT_SOME; + } else { + return VEC0_TOKEN_RESULT_ERROR; + } + } + return VEC0_TOKEN_RESULT_EOF; +} + +struct Vec0Scanner { + char *start; + char *end; + char *ptr; +}; + +void vec0_scanner_init(struct Vec0Scanner *scanner, const char *source, + int source_length) { + scanner->start = (char *)source; + scanner->end = (char *)source + source_length; + scanner->ptr = (char *)source; +} +int vec0_scanner_next(struct Vec0Scanner *scanner, struct Vec0Token *out) { + int rc = vec0_token_next(scanner->start, scanner->end, out); + if (rc == VEC0_TOKEN_RESULT_SOME) { + scanner->start = out->end; + } + return rc; +} + +int vec0_parse_table_option(const char *source, int source_length, + char **out_key, int *out_key_length, + char **out_value, int *out_value_length) { + int rc; + struct Vec0Scanner scanner; + struct Vec0Token token; + char *key; + char *value; + int keyLength, valueLength; + + vec0_scanner_init(&scanner, source, source_length); + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + key = token.start; + keyLength = token.end - token.start; + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_EQ) { + return SQLITE_EMPTY; + } + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + !((token.token_type == TOKEN_TYPE_IDENTIFIER) || + (token.token_type == TOKEN_TYPE_DIGIT))) { + return SQLITE_ERROR; + } + value = token.start; + valueLength = token.end - token.start; + + rc = vec0_scanner_next(&scanner, &token); + if (rc == VEC0_TOKEN_RESULT_EOF) { + *out_key = key; + *out_key_length = keyLength; + *out_value = value; + *out_value_length = valueLength; + return SQLITE_OK; + } + return SQLITE_ERROR; +} +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's a PARTITION KEY definition. + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a partition key, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: SQLITE_TEXT or SQLITE_INTEGER. + * @return int: SQLITE_EMPTY if not a PK, SQLITE_OK if it is. + */ +int vec0_parse_partition_key_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + int *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + int column_type; + vec0_scanner_init(&scanner, source, source_length); + + // Check first token is identifier, will be the column name + int rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches "text" or "integer", as column type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "text", token.end - token.start) == 0) { + column_type = SQLITE_TEXT; + } else if (sqlite3_strnicmp(token.start, "int", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "integer", + token.end - token.start) == 0) { + column_type = SQLITE_INTEGER; + } else { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "partition" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "partition", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "key" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "key", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's an auxiliar column definition, ie `+[name] [type]` like `+contents text` + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a partition key, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: SQLITE_TEXT, SQLITE_INTEGER, SQLITE_FLOAT, or SQLITE_BLOB. + * @return int: SQLITE_EMPTY if not an aux column, SQLITE_OK if it is. + */ +int vec0_parse_auxiliary_column_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + int *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + int column_type; + vec0_scanner_init(&scanner, source, source_length); + + // Check first token is '+', which denotes aux columns + int rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_PLUS) { + return SQLITE_EMPTY; + } + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches "text" or "integer", as column type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "text", token.end - token.start) == 0) { + column_type = SQLITE_TEXT; + } else if (sqlite3_strnicmp(token.start, "int", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "integer", + token.end - token.start) == 0) { + column_type = SQLITE_INTEGER; + } else if (sqlite3_strnicmp(token.start, "float", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "double", + token.end - token.start) == 0) { + column_type = SQLITE_FLOAT; + } else if (sqlite3_strnicmp(token.start, "blob", token.end - token.start) ==0) { + column_type = SQLITE_BLOB; + } else { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +typedef enum { + VEC0_METADATA_COLUMN_KIND_BOOLEAN, + VEC0_METADATA_COLUMN_KIND_INTEGER, + VEC0_METADATA_COLUMN_KIND_FLOAT, + VEC0_METADATA_COLUMN_KIND_TEXT, + // future: blob, date, datetime +} vec0_metadata_column_kind; + +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's an metadata column definition, ie `[name] [type]` like `is_released boolean` + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a metadata column, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: one of vec0_metadata_column_kind + * @return int: SQLITE_EMPTY if not an metadata column, SQLITE_OK if it is. + */ +int vec0_parse_metadata_column_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + vec0_metadata_column_kind *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + vec0_metadata_column_kind column_type; + int rc; + vec0_scanner_init(&scanner, source, source_length); + + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches a valid metadata type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + char * t = token.start; + int n = token.end - token.start; + if (sqlite3_strnicmp(t, "boolean", n) == 0 || sqlite3_strnicmp(t, "bool", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_BOOLEAN; + }else if (sqlite3_strnicmp(t, "int64", n) == 0 || sqlite3_strnicmp(t, "integer64", n) == 0 || sqlite3_strnicmp(t, "integer", n) == 0 || sqlite3_strnicmp(t, "int", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_INTEGER; + }else if (sqlite3_strnicmp(t, "float", n) == 0 || sqlite3_strnicmp(t, "double", n) == 0 || sqlite3_strnicmp(t, "float64", n) == 0 || sqlite3_strnicmp(t, "f64", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_FLOAT; + } else if (sqlite3_strnicmp(t, "text", n) == 0) { + column_type = VEC0_METADATA_COLUMN_KIND_TEXT; + } else { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +/** + * @brief Parse an argv[i] entry of a vec0 virtual table definition, and see if + * it's a PRIMARY KEY definition. + * + * @param source: argv[i] source string + * @param source_length: length of the source string + * @param out_column_name: If it is a PK, the output column name. Same lifetime + * as source, points to specific char * + * @param out_column_name_length: Length of out_column_name in bytes + * @param out_column_type: SQLITE_TEXT or SQLITE_INTEGER. + * @return int: SQLITE_EMPTY if not a PK, SQLITE_OK if it is. + */ +int vec0_parse_primary_key_definition(const char *source, int source_length, + char **out_column_name, + int *out_column_name_length, + int *out_column_type) { + struct Vec0Scanner scanner; + struct Vec0Token token; + char *column_name; + int column_name_length; + int column_type; + vec0_scanner_init(&scanner, source, source_length); + + // Check first token is identifier, will be the column name + int rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + column_name = token.start; + column_name_length = token.end - token.start; + + // Check the next token matches "text" or "integer", as column type + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "text", token.end - token.start) == 0) { + column_type = SQLITE_TEXT; + } else if (sqlite3_strnicmp(token.start, "int", token.end - token.start) == + 0 || + sqlite3_strnicmp(token.start, "integer", + token.end - token.start) == 0) { + column_type = SQLITE_INTEGER; + } else { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "primary" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "primary", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + // Check the next token is identifier and matches "key" + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "key", token.end - token.start) != 0) { + return SQLITE_EMPTY; + } + + *out_column_name = column_name; + *out_column_name_length = column_name_length; + *out_column_type = column_type; + + return SQLITE_OK; +} + +enum Vec0DistanceMetrics { + VEC0_DISTANCE_METRIC_L2 = 1, + VEC0_DISTANCE_METRIC_COSINE = 2, + VEC0_DISTANCE_METRIC_L1 = 3, +}; + +struct VectorColumnDefinition { + char *name; + int name_length; + size_t dimensions; + enum VectorElementType element_type; + enum Vec0DistanceMetrics distance_metric; +}; + +struct Vec0PartitionColumnDefinition { + int type; + char * name; + int name_length; +}; + +struct Vec0AuxiliaryColumnDefinition { + int type; + char * name; + int name_length; +}; +struct Vec0MetadataColumnDefinition { + vec0_metadata_column_kind kind; + char * name; + int name_length; +}; + +size_t vector_byte_size(enum VectorElementType element_type, + size_t dimensions) { + switch (element_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + return dimensions * sizeof(f32); + case SQLITE_VEC_ELEMENT_TYPE_INT8: + return dimensions * sizeof(i8); + case SQLITE_VEC_ELEMENT_TYPE_BIT: + return dimensions / CHAR_BIT; + } + return 0; +} + +size_t vector_column_byte_size(struct VectorColumnDefinition column) { + return vector_byte_size(column.element_type, column.dimensions); +} + +/** + * @brief Parse an vec0 vtab argv[i] column definition and see if + * it's a vector column defintion, ex `contents_embedding float[768]`. + * + * @param source vec0 argv[i] item + * @param source_length length of source in bytes + * @param outColumn Output the parse vector column to this struct, if success + * @return int SQLITE_OK on success, SQLITE_EMPTY is it's not a vector column + * definition, SQLITE_ERROR on error. + */ +int vec0_parse_vector_column(const char *source, int source_length, + struct VectorColumnDefinition *outColumn) { + // parses a vector column definition like so: + // "abc float[123]", "abc_123 bit[1234]", eetc. + // https://github.com/asg017/sqlite-vec/issues/46 + int rc; + struct Vec0Scanner scanner; + struct Vec0Token token; + + char *name; + int nameLength; + enum VectorElementType elementType; + enum Vec0DistanceMetrics distanceMetric = VEC0_DISTANCE_METRIC_L2; + int dimensions; + + vec0_scanner_init(&scanner, source, source_length); + + // starts with an identifier + rc = vec0_scanner_next(&scanner, &token); + + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + + name = token.start; + nameLength = token.end - token.start; + + // vector column type comes next: float, int, or bit + rc = vec0_scanner_next(&scanner, &token); + + if (rc != VEC0_TOKEN_RESULT_SOME || + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_EMPTY; + } + if (sqlite3_strnicmp(token.start, "float", 5) == 0 || + sqlite3_strnicmp(token.start, "f32", 3) == 0) { + elementType = SQLITE_VEC_ELEMENT_TYPE_FLOAT32; + } else if (sqlite3_strnicmp(token.start, "int8", 4) == 0 || + sqlite3_strnicmp(token.start, "i8", 2) == 0) { + elementType = SQLITE_VEC_ELEMENT_TYPE_INT8; + } else if (sqlite3_strnicmp(token.start, "bit", 3) == 0) { + elementType = SQLITE_VEC_ELEMENT_TYPE_BIT; + } else { + return SQLITE_EMPTY; + } + + // left '[' bracket + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_LBRACKET) { + return SQLITE_EMPTY; + } + + // digit, for vector dimension length + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_DIGIT) { + return SQLITE_ERROR; + } + dimensions = atoi(token.start); + if (dimensions <= 0) { + return SQLITE_ERROR; + } + + // // right ']' bracket + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_RBRACKET) { + return SQLITE_ERROR; + } + + // any other tokens left should be column-level options , ex `key=value` + // ex `distance_metric=L2 distance_metric=cosine` should error + while (1) { + // should be EOF or identifier (option key) + rc = vec0_scanner_next(&scanner, &token); + if (rc == VEC0_TOKEN_RESULT_EOF) { + break; + } + + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_ERROR; + } + + char *key = token.start; + int keyLength = token.end - token.start; + + if (sqlite3_strnicmp(key, "distance_metric", keyLength) == 0) { + + if (elementType == SQLITE_VEC_ELEMENT_TYPE_BIT) { + return SQLITE_ERROR; + } + // ensure equal sign after distance_metric + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && token.token_type != TOKEN_TYPE_EQ) { + return SQLITE_ERROR; + } + + // distance_metric value, an identifier (L2, cosine, etc) + rc = vec0_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME && + token.token_type != TOKEN_TYPE_IDENTIFIER) { + return SQLITE_ERROR; + } + + char *value = token.start; + int valueLength = token.end - token.start; + if (sqlite3_strnicmp(value, "l2", valueLength) == 0) { + distanceMetric = VEC0_DISTANCE_METRIC_L2; + } else if (sqlite3_strnicmp(value, "l1", valueLength) == 0) { + distanceMetric = VEC0_DISTANCE_METRIC_L1; + } else if (sqlite3_strnicmp(value, "cosine", valueLength) == 0) { + distanceMetric = VEC0_DISTANCE_METRIC_COSINE; + } else { + return SQLITE_ERROR; + } + } + // unknown key + else { + return SQLITE_ERROR; + } + } + + outColumn->name = sqlite3_mprintf("%.*s", nameLength, name); + if (!outColumn->name) { + return SQLITE_ERROR; + } + outColumn->name_length = nameLength; + outColumn->distance_metric = distanceMetric; + outColumn->element_type = elementType; + outColumn->dimensions = dimensions; + return SQLITE_OK; +} + +#pragma region vec_each table function + +typedef struct vec_each_vtab vec_each_vtab; +struct vec_each_vtab { + sqlite3_vtab base; +}; + +typedef struct vec_each_cursor vec_each_cursor; +struct vec_each_cursor { + sqlite3_vtab_cursor base; + i64 iRowid; + enum VectorElementType vector_type; + void *vector; + size_t dimensions; + vector_cleanup cleanup; +}; + +static int vec_eachConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + UNUSED_PARAMETER(pAux); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + vec_each_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, "CREATE TABLE x(value, vector hidden)"); +#define VEC_EACH_COLUMN_VALUE 0 +#define VEC_EACH_COLUMN_VECTOR 1 + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +static int vec_eachDisconnect(sqlite3_vtab *pVtab) { + vec_each_vtab *p = (vec_each_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_eachOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_each_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_eachClose(sqlite3_vtab_cursor *cur) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + if(pCur->vector) { + pCur->cleanup(pCur->vector); + } + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_eachBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + UNUSED_PARAMETER(pVTab); + int hasVector = 0; + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; + // printf("i=%d iColumn=%d, op=%d, usable=%d\n", i, pCons->iColumn, + // pCons->op, pCons->usable); + switch (pCons->iColumn) { + case VEC_EACH_COLUMN_VECTOR: { + if (pCons->op == SQLITE_INDEX_CONSTRAINT_EQ && pCons->usable) { + hasVector = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + } + break; + } + } + } + if (!hasVector) { + return SQLITE_CONSTRAINT; + } + + pIdxInfo->estimatedCost = (double)100000; + pIdxInfo->estimatedRows = 100000; + + return SQLITE_OK; +} + +static int vec_eachFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, sqlite3_value **argv) { + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + assert(argc == 1); + vec_each_cursor *pCur = (vec_each_cursor *)pVtabCursor; + + if (pCur->vector) { + pCur->cleanup(pCur->vector); + pCur->vector = NULL; + } + + char *pzErrMsg; + int rc = vector_from_value(argv[0], &pCur->vector, &pCur->dimensions, + &pCur->vector_type, &pCur->cleanup, &pzErrMsg); + if (rc != SQLITE_OK) { + return SQLITE_ERROR; + } + pCur->iRowid = 0; + return SQLITE_OK; +} + +static int vec_eachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +static int vec_eachEof(sqlite3_vtab_cursor *cur) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + return pCur->iRowid >= (i64)pCur->dimensions; +} + +static int vec_eachNext(sqlite3_vtab_cursor *cur) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +static int vec_eachColumn(sqlite3_vtab_cursor *cur, sqlite3_context *context, + int i) { + vec_each_cursor *pCur = (vec_each_cursor *)cur; + switch (i) { + case VEC_EACH_COLUMN_VALUE: + switch (pCur->vector_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_double(context, ((f32 *)pCur->vector)[pCur->iRowid]); + break; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + u8 x = ((u8 *)pCur->vector)[pCur->iRowid / CHAR_BIT]; + sqlite3_result_int(context, + (x & (0b10000000 >> ((pCur->iRowid % CHAR_BIT)))) > 0); + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + sqlite3_result_int(context, ((i8 *)pCur->vector)[pCur->iRowid]); + break; + } + } + + break; + } + return SQLITE_OK; +} + +static sqlite3_module vec_eachModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ vec_eachConnect, + /* xBestIndex */ vec_eachBestIndex, + /* xDisconnect */ vec_eachDisconnect, + /* xDestroy */ 0, + /* xOpen */ vec_eachOpen, + /* xClose */ vec_eachClose, + /* xFilter */ vec_eachFilter, + /* xNext */ vec_eachNext, + /* xEof */ vec_eachEof, + /* xColumn */ vec_eachColumn, + /* xRowid */ vec_eachRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0 +#endif +}; + +#pragma endregion + +#pragma region vec_npy_each table function + +enum NpyTokenType { + NPY_TOKEN_TYPE_IDENTIFIER, + NPY_TOKEN_TYPE_NUMBER, + NPY_TOKEN_TYPE_LPAREN, + NPY_TOKEN_TYPE_RPAREN, + NPY_TOKEN_TYPE_LBRACE, + NPY_TOKEN_TYPE_RBRACE, + NPY_TOKEN_TYPE_COLON, + NPY_TOKEN_TYPE_COMMA, + NPY_TOKEN_TYPE_STRING, + NPY_TOKEN_TYPE_FALSE, +}; + +struct NpyToken { + enum NpyTokenType token_type; + unsigned char *start; + unsigned char *end; +}; + +int npy_token_next(unsigned char *start, unsigned char *end, + struct NpyToken *out) { + unsigned char *ptr = start; + while (ptr < end) { + unsigned char curr = *ptr; + if (is_whitespace(curr)) { + ptr++; + continue; + } else if (curr == '(') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_LPAREN; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ')') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_RPAREN; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '{') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_LBRACE; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '}') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_RBRACE; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ':') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_COLON; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == ',') { + out->start = ptr++; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_COMMA; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == '\'') { + unsigned char *start = ptr; + ptr++; + while (ptr < end) { + if ((*ptr) == '\'') { + break; + } + ptr++; + } + if ((*ptr) != '\'') { + return VEC0_TOKEN_RESULT_ERROR; + } + out->start = start; + out->end = ++ptr; + out->token_type = NPY_TOKEN_TYPE_STRING; + return VEC0_TOKEN_RESULT_SOME; + } else if (curr == 'F' && + strncmp((char *)ptr, "False", strlen("False")) == 0) { + out->start = ptr; + out->end = (ptr + (int)strlen("False")); + ptr = out->end; + out->token_type = NPY_TOKEN_TYPE_FALSE; + return VEC0_TOKEN_RESULT_SOME; + } else if (is_digit(curr)) { + unsigned char *start = ptr; + while (ptr < end && (is_digit(*ptr))) { + ptr++; + } + out->start = start; + out->end = ptr; + out->token_type = NPY_TOKEN_TYPE_NUMBER; + return VEC0_TOKEN_RESULT_SOME; + } else { + return VEC0_TOKEN_RESULT_ERROR; + } + } + return VEC0_TOKEN_RESULT_ERROR; +} + +struct NpyScanner { + unsigned char *start; + unsigned char *end; + unsigned char *ptr; +}; + +void npy_scanner_init(struct NpyScanner *scanner, const unsigned char *source, + int source_length) { + scanner->start = (unsigned char *)source; + scanner->end = (unsigned char *)source + source_length; + scanner->ptr = (unsigned char *)source; +} + +int npy_scanner_next(struct NpyScanner *scanner, struct NpyToken *out) { + int rc = npy_token_next(scanner->start, scanner->end, out); + if (rc == VEC0_TOKEN_RESULT_SOME) { + scanner->start = out->end; + } + return rc; +} + +#define NPY_PARSE_ERROR "Error parsing numpy array: " +int parse_npy_header(sqlite3_vtab *pVTab, const unsigned char *header, + size_t headerLength, + enum VectorElementType *out_element_type, + int *fortran_order, size_t *numElements, + size_t *numDimensions) { + + struct NpyScanner scanner; + struct NpyToken token; + int rc; + npy_scanner_init(&scanner, header, headerLength); + + if (npy_scanner_next(&scanner, &token) != VEC0_TOKEN_RESULT_SOME && + token.token_type != NPY_TOKEN_TYPE_LBRACE) { + vtab_set_error(pVTab, + NPY_PARSE_ERROR "numpy header did not start with '{'"); + return SQLITE_ERROR; + } + while (1) { + rc = npy_scanner_next(&scanner, &token); + if (rc != VEC0_TOKEN_RESULT_SOME) { + vtab_set_error(pVTab, NPY_PARSE_ERROR "expected key in numpy header"); + return SQLITE_ERROR; + } + + if (token.token_type == NPY_TOKEN_TYPE_RBRACE) { + break; + } + if (token.token_type != NPY_TOKEN_TYPE_STRING) { + vtab_set_error(pVTab, NPY_PARSE_ERROR + "expected a string as key in numpy header"); + return SQLITE_ERROR; + } + unsigned char *key = token.start; + + rc = npy_scanner_next(&scanner, &token); + if ((rc != VEC0_TOKEN_RESULT_SOME) || + (token.token_type != NPY_TOKEN_TYPE_COLON)) { + vtab_set_error(pVTab, NPY_PARSE_ERROR + "expected a ':' after key in numpy header"); + return SQLITE_ERROR; + } + + if (strncmp((char *)key, "'descr'", strlen("'descr'")) == 0) { + rc = npy_scanner_next(&scanner, &token); + if ((rc != VEC0_TOKEN_RESULT_SOME) || + (token.token_type != NPY_TOKEN_TYPE_STRING)) { + vtab_set_error(pVTab, NPY_PARSE_ERROR + "expected a string value after 'descr' key"); + return SQLITE_ERROR; + } + if (strncmp((char *)token.start, "'maxChunks = 1024; + pCur->chunksBufferSize = + (vector_byte_size(element_type, numDimensions)) * pCur->maxChunks; + pCur->chunksBuffer = sqlite3_malloc(pCur->chunksBufferSize); + if (pCur->chunksBufferSize && !pCur->chunksBuffer) { + return SQLITE_NOMEM; + } + + pCur->currentChunkSize = + fread(pCur->chunksBuffer, vector_byte_size(element_type, numDimensions), + pCur->maxChunks, file); + + pCur->currentChunkIndex = 0; + pCur->elementType = element_type; + pCur->nElements = numElements; + pCur->nDimensions = numDimensions; + pCur->input_type = VEC_NPY_EACH_INPUT_FILE; + + pCur->eof = pCur->currentChunkSize == 0; + pCur->file = file; + return SQLITE_OK; +} +#endif + +int parse_npy_buffer(sqlite3_vtab *pVTab, const unsigned char *buffer, + int bufferLength, void **data, size_t *numElements, + size_t *numDimensions, + enum VectorElementType *element_type) { + + if (bufferLength < 10) { + // IMP: V03312_20150 + vtab_set_error(pVTab, "numpy array too short"); + return SQLITE_ERROR; + } + if (memcmp(NPY_MAGIC, buffer, sizeof(NPY_MAGIC)) != 0) { + // V11954_28792 + vtab_set_error(pVTab, "numpy array does not contain the 'magic' header"); + return SQLITE_ERROR; + } + + u8 major = buffer[6]; + u8 minor = buffer[7]; + uint16_t headerLength = 0; + memcpy(&headerLength, &buffer[8], sizeof(uint16_t)); + + i32 totalHeaderLength = sizeof(NPY_MAGIC) + sizeof(major) + sizeof(minor) + + sizeof(headerLength) + headerLength; + i32 dataSize = bufferLength - totalHeaderLength; + + if (dataSize < 0) { + vtab_set_error(pVTab, "numpy array header length is invalid"); + return SQLITE_ERROR; + } + + const unsigned char *header = &buffer[10]; + int fortran_order; + + int rc = parse_npy_header(pVTab, header, headerLength, element_type, + &fortran_order, numElements, numDimensions); + if (rc != SQLITE_OK) { + return rc; + } + + i32 expectedDataSize = + (*numElements * vector_byte_size(*element_type, *numDimensions)); + if (expectedDataSize != dataSize) { + vtab_set_error(pVTab, + "numpy array error: Expected a data size of %d, found %d", + expectedDataSize, dataSize); + return SQLITE_ERROR; + } + + *data = (void *)&buffer[totalHeaderLength]; + return SQLITE_OK; +} + +static int vec_npy_eachConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + UNUSED_PARAMETER(pAux); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + vec_npy_each_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, "CREATE TABLE x(vector, input hidden)"); +#define VEC_NPY_EACH_COLUMN_VECTOR 0 +#define VEC_NPY_EACH_COLUMN_INPUT 1 + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +static int vec_npy_eachDisconnect(sqlite3_vtab *pVtab) { + vec_npy_each_vtab *p = (vec_npy_each_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_npy_eachOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_npy_each_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_npy_eachClose(sqlite3_vtab_cursor *cur) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; +#ifndef SQLITE_VEC_OMIT_FS + if (pCur->file) { + fclose(pCur->file); + pCur->file = NULL; + } +#endif + if (pCur->chunksBuffer) { + sqlite3_free(pCur->chunksBuffer); + pCur->chunksBuffer = NULL; + } + if (pCur->vector) { + pCur->vector = NULL; + } + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_npy_eachBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + int hasInput; + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + const struct sqlite3_index_constraint *pCons = &pIdxInfo->aConstraint[i]; + // printf("i=%d iColumn=%d, op=%d, usable=%d\n", i, pCons->iColumn, + // pCons->op, pCons->usable); + switch (pCons->iColumn) { + case VEC_NPY_EACH_COLUMN_INPUT: { + if (pCons->op == SQLITE_INDEX_CONSTRAINT_EQ && pCons->usable) { + hasInput = 1; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + } + break; + } + } + } + if (!hasInput) { + pVTab->zErrMsg = sqlite3_mprintf("input argument is required"); + return SQLITE_ERROR; + } + + pIdxInfo->estimatedCost = (double)100000; + pIdxInfo->estimatedRows = 100000; + + return SQLITE_OK; +} + +static int vec_npy_eachFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, + sqlite3_value **argv) { + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + assert(argc == 1); + int rc; + + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)pVtabCursor; + +#ifndef SQLITE_VEC_OMIT_FS + if (pCur->file) { + fclose(pCur->file); + pCur->file = NULL; + } +#endif + if (pCur->chunksBuffer) { + sqlite3_free(pCur->chunksBuffer); + pCur->chunksBuffer = NULL; + } + if (pCur->vector) { + pCur->vector = NULL; + } + +#ifndef SQLITE_VEC_OMIT_FS + struct VecNpyFile *f = NULL; + if ((f = sqlite3_value_pointer(argv[0], SQLITE_VEC_NPY_FILE_NAME))) { + FILE *file = fopen(f->path, "r"); + if (!file) { + vtab_set_error(pVtabCursor->pVtab, "Could not open numpy file"); + return SQLITE_ERROR; + } + + rc = parse_npy_file(pVtabCursor->pVtab, file, pCur); + if (rc != SQLITE_OK) { +#ifndef SQLITE_VEC_OMIT_FS + fclose(file); +#endif + return rc; + } + + } else +#endif + { + + const unsigned char *input = sqlite3_value_blob(argv[0]); + int inputLength = sqlite3_value_bytes(argv[0]); + void *data; + size_t numElements; + size_t numDimensions; + enum VectorElementType element_type; + + rc = parse_npy_buffer(pVtabCursor->pVtab, input, inputLength, &data, + &numElements, &numDimensions, &element_type); + if (rc != SQLITE_OK) { + return rc; + } + + pCur->vector = data; + pCur->elementType = element_type; + pCur->nElements = numElements; + pCur->nDimensions = numDimensions; + pCur->input_type = VEC_NPY_EACH_INPUT_BUFFER; + } + + pCur->iRowid = 0; + return SQLITE_OK; +} + +static int vec_npy_eachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +static int vec_npy_eachEof(sqlite3_vtab_cursor *cur) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + if (pCur->input_type == VEC_NPY_EACH_INPUT_BUFFER) { + return (!pCur->nElements) || (size_t)pCur->iRowid >= pCur->nElements; + } + return pCur->eof; +} + +static int vec_npy_eachNext(sqlite3_vtab_cursor *cur) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + pCur->iRowid++; + if (pCur->input_type == VEC_NPY_EACH_INPUT_BUFFER) { + return SQLITE_OK; + } + +#ifndef SQLITE_VEC_OMIT_FS + // else: input is a file + pCur->currentChunkIndex++; + if (pCur->currentChunkIndex >= pCur->currentChunkSize) { + pCur->currentChunkSize = + fread(pCur->chunksBuffer, + vector_byte_size(pCur->elementType, pCur->nDimensions), + pCur->maxChunks, pCur->file); + if (!pCur->currentChunkSize) { + pCur->eof = 1; + } + pCur->currentChunkIndex = 0; + } +#endif + return SQLITE_OK; +} + +static int vec_npy_eachColumnBuffer(vec_npy_each_cursor *pCur, + sqlite3_context *context, int i) { + switch (i) { + case VEC_NPY_EACH_COLUMN_VECTOR: { + sqlite3_result_subtype(context, pCur->elementType); + switch (pCur->elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_blob( + context, + &((unsigned char *) + pCur->vector)[pCur->iRowid * pCur->nDimensions * sizeof(f32)], + pCur->nDimensions * sizeof(f32), SQLITE_TRANSIENT); + + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + // https://github.com/asg017/sqlite-vec/issues/42 + sqlite3_result_error(context, + "vec_npy_each only supports float32 vectors", -1); + break; + } + } + + break; + } + } + return SQLITE_OK; +} +static int vec_npy_eachColumnFile(vec_npy_each_cursor *pCur, + sqlite3_context *context, int i) { + switch (i) { + case VEC_NPY_EACH_COLUMN_VECTOR: { + switch (pCur->elementType) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + sqlite3_result_blob( + context, + &((unsigned char *) + pCur->chunksBuffer)[pCur->currentChunkIndex * + pCur->nDimensions * sizeof(f32)], + pCur->nDimensions * sizeof(f32), SQLITE_TRANSIENT); + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + // https://github.com/asg017/sqlite-vec/issues/42 + sqlite3_result_error(context, + "vec_npy_each only supports float32 vectors", -1); + break; + } + } + break; + } + } + return SQLITE_OK; +} +static int vec_npy_eachColumn(sqlite3_vtab_cursor *cur, + sqlite3_context *context, int i) { + vec_npy_each_cursor *pCur = (vec_npy_each_cursor *)cur; + switch (pCur->input_type) { + case VEC_NPY_EACH_INPUT_BUFFER: + return vec_npy_eachColumnBuffer(pCur, context, i); + case VEC_NPY_EACH_INPUT_FILE: + return vec_npy_eachColumnFile(pCur, context, i); + } + return SQLITE_ERROR; +} + +static sqlite3_module vec_npy_eachModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ vec_npy_eachConnect, + /* xBestIndex */ vec_npy_eachBestIndex, + /* xDisconnect */ vec_npy_eachDisconnect, + /* xDestroy */ 0, + /* xOpen */ vec_npy_eachOpen, + /* xClose */ vec_npy_eachClose, + /* xFilter */ vec_npy_eachFilter, + /* xNext */ vec_npy_eachNext, + /* xEof */ vec_npy_eachEof, + /* xColumn */ vec_npy_eachColumn, + /* xRowid */ vec_npy_eachRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0, +#endif +}; + +#pragma endregion + +#pragma region vec0 virtual table + +#define VEC0_COLUMN_ID 0 +#define VEC0_COLUMN_USERN_START 1 +#define VEC0_COLUMN_OFFSET_DISTANCE 1 +#define VEC0_COLUMN_OFFSET_K 2 + +#define VEC0_SHADOW_INFO_NAME "\"%w\".\"%w_info\"" + +#define VEC0_SHADOW_CHUNKS_NAME "\"%w\".\"%w_chunks\"" +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_CHUNKS_CREATE \ + "CREATE TABLE " VEC0_SHADOW_CHUNKS_NAME "(" \ + "chunk_id INTEGER PRIMARY KEY AUTOINCREMENT," \ + "size INTEGER NOT NULL," \ + "validity BLOB NOT NULL," \ + "rowids BLOB NOT NULL" \ + ");" + +#define VEC0_SHADOW_ROWIDS_NAME "\"%w\".\"%w_rowids\"" +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_ROWIDS_CREATE_BASIC \ + "CREATE TABLE " VEC0_SHADOW_ROWIDS_NAME "(" \ + "rowid INTEGER PRIMARY KEY AUTOINCREMENT," \ + "id," \ + "chunk_id INTEGER," \ + "chunk_offset INTEGER" \ + ");" + +// vec0 tables with a text primary keys are still backed by int64 primary keys, +// since a fixed-length rowid is required for vec0 chunks. But we add a new 'id +// text unique' column to emulate a text primary key interface. +#define VEC0_SHADOW_ROWIDS_CREATE_PK_TEXT \ + "CREATE TABLE " VEC0_SHADOW_ROWIDS_NAME "(" \ + "rowid INTEGER PRIMARY KEY AUTOINCREMENT," \ + "id TEXT UNIQUE NOT NULL," \ + "chunk_id INTEGER," \ + "chunk_offset INTEGER" \ + ");" + +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_VECTOR_N_NAME "\"%w\".\"%w_vector_chunks%02d\"" + +/// 1) schema, 2) original vtab table name +#define VEC0_SHADOW_VECTOR_N_CREATE \ + "CREATE TABLE " VEC0_SHADOW_VECTOR_N_NAME "(" \ + "rowid PRIMARY KEY," \ + "vectors BLOB NOT NULL" \ + ");" + +#define VEC0_SHADOW_AUXILIARY_NAME "\"%w\".\"%w_auxiliary\"" + +#define VEC0_SHADOW_METADATA_N_NAME "\"%w\".\"%w_metadatachunks%02d\"" +#define VEC0_SHADOW_METADATA_TEXT_DATA_NAME "\"%w\".\"%w_metadatatext%02d\"" + +#define VEC_INTERAL_ERROR "Internal sqlite-vec error: " +#define REPORT_URL "https://github.com/asg017/sqlite-vec/issues/new" + +typedef struct vec0_vtab vec0_vtab; + +#define VEC0_MAX_VECTOR_COLUMNS 16 +#define VEC0_MAX_PARTITION_COLUMNS 4 +#define VEC0_MAX_AUXILIARY_COLUMNS 16 +#define VEC0_MAX_METADATA_COLUMNS 16 + +#define SQLITE_VEC_VEC0_MAX_DIMENSIONS 8192 +#define VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH 16 +#define VEC0_METADATA_TEXT_VIEW_DATA_LENGTH 12 + +typedef enum { + // vector column, ie "contents_embedding float[1024]" + SQLITE_VEC0_USER_COLUMN_KIND_VECTOR = 1, + + // partition key column, ie "user_id integer partition key" + SQLITE_VEC0_USER_COLUMN_KIND_PARTITION = 2, + + // + SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY = 3, + + // metadata column that can be filtered, ie "genre text" + SQLITE_VEC0_USER_COLUMN_KIND_METADATA = 4, +} vec0_user_column_kind; + +struct vec0_vtab { + sqlite3_vtab base; + + // the SQLite connection of the host database + sqlite3 *db; + + // True if the primary key of the vec0 table has a column type TEXT. + // Will change the schema of the _rowids table, and insert/query logic. + int pkIsText; + + // number of defined vector columns. + int numVectorColumns; + + // number of defined PARTITION KEY columns. + int numPartitionColumns; + + // number of defined auxiliary columns + int numAuxiliaryColumns; + + // number of defined metadata columns + int numMetadataColumns; + + + // Name of the schema the table exists on. + // Must be freed with sqlite3_free() + char *schemaName; + + // Name of the table the table exists on. + // Must be freed with sqlite3_free() + char *tableName; + + // Name of the _rowids shadow table. + // Must be freed with sqlite3_free() + char *shadowRowidsName; + + // Name of the _chunks shadow table. + // Must be freed with sqlite3_free() + char *shadowChunksName; + + // contains enum vec0_user_column_kind values for up to + // numVectorColumns + numPartitionColumns entries + vec0_user_column_kind user_column_kinds[VEC0_MAX_VECTOR_COLUMNS + VEC0_MAX_PARTITION_COLUMNS + VEC0_MAX_AUXILIARY_COLUMNS + VEC0_MAX_METADATA_COLUMNS]; + + uint8_t user_column_idxs[VEC0_MAX_VECTOR_COLUMNS + VEC0_MAX_PARTITION_COLUMNS + VEC0_MAX_AUXILIARY_COLUMNS + VEC0_MAX_METADATA_COLUMNS]; + + + // Name of all the vector chunk shadow tables. + // Ex '_vector_chunks00' + // Only the first numVectorColumns entries will be available. + // The first numVectorColumns entries must be freed with sqlite3_free() + char *shadowVectorChunksNames[VEC0_MAX_VECTOR_COLUMNS]; + + // Name of all metadata chunk shadow tables, ie `_metadatachunks00` + // Only the first numMetadataColumns entries will be available. + // The first numMetadataColumns entries must be freed with sqlite3_free() + char *shadowMetadataChunksNames[VEC0_MAX_METADATA_COLUMNS]; + + struct VectorColumnDefinition vector_columns[VEC0_MAX_VECTOR_COLUMNS]; + struct Vec0PartitionColumnDefinition paritition_columns[VEC0_MAX_PARTITION_COLUMNS]; + struct Vec0AuxiliaryColumnDefinition auxiliary_columns[VEC0_MAX_AUXILIARY_COLUMNS]; + struct Vec0MetadataColumnDefinition metadata_columns[VEC0_MAX_METADATA_COLUMNS]; + + int chunk_size; + + // select latest chunk from _chunks, getting chunk_id + sqlite3_stmt *stmtLatestChunk; + + /** + * Statement to insert a row into the _rowids table, with a rowid. + * Parameters: + * 1: int64, rowid to insert + * Result columns: none + * SQL: "INSERT INTO _rowids(rowid) VALUES (?)" + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsInsertRowid; + + /** + * Statement to insert a row into the _rowids table, with an id. + * The id column isn't a tradition primary key, but instead a unique + * column to handle "text primary key" vec0 tables. The true int64 rowid + * can be retrieved after inserting with sqlite3_last_rowid(). + * + * Parameters: + * 1: text or null, id to insert + * Result columns: none + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsInsertId; + + /** + * Statement to update the "position" columns chunk_id and chunk_offset for + * a given _rowids row. Used when the "next available" chunk position is found + * for a vector. + * + * Parameters: + * 1: int64, chunk_id value + * 2: int64, chunk_offset value + * 3: int64, rowid value + * Result columns: none + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsUpdatePosition; + + /** + * Statement to quickly find the chunk_id + chunk_offset of a given row. + * Parameters: + * 1: rowid of the row/vector to lookup + * Result columns: + * 0: chunk_id (i64) + * 1: chunk_offset (i64) + * SQL: "SELECT id, chunk_id, chunk_offset FROM _rowids WHERE rowid = ?"" + * + * Must be cleaned up with sqlite3_finalize(). + */ + sqlite3_stmt *stmtRowidsGetChunkPosition; +}; + +/** + * @brief Finalize all the sqlite3_stmt members in a vec0_vtab. + * + * @param p vec0_vtab pointer + */ +void vec0_free_resources(vec0_vtab *p) { + sqlite3_finalize(p->stmtLatestChunk); + p->stmtLatestChunk = NULL; + sqlite3_finalize(p->stmtRowidsInsertRowid); + p->stmtRowidsInsertRowid = NULL; + sqlite3_finalize(p->stmtRowidsInsertId); + p->stmtRowidsInsertId = NULL; + sqlite3_finalize(p->stmtRowidsUpdatePosition); + p->stmtRowidsUpdatePosition = NULL; + sqlite3_finalize(p->stmtRowidsGetChunkPosition); + p->stmtRowidsGetChunkPosition = NULL; +} + +/** + * @brief Free all memory and sqlite3_stmt members of a vec0_vtab + * + * @param p vec0_vtab pointer + */ +void vec0_free(vec0_vtab *p) { + vec0_free_resources(p); + + sqlite3_free(p->schemaName); + p->schemaName = NULL; + sqlite3_free(p->tableName); + p->tableName = NULL; + sqlite3_free(p->shadowChunksName); + p->shadowChunksName = NULL; + sqlite3_free(p->shadowRowidsName); + p->shadowRowidsName = NULL; + + for (int i = 0; i < p->numVectorColumns; i++) { + sqlite3_free(p->shadowVectorChunksNames[i]); + p->shadowVectorChunksNames[i] = NULL; + + sqlite3_free(p->vector_columns[i].name); + p->vector_columns[i].name = NULL; + } +} + +int vec0_num_defined_user_columns(vec0_vtab *p) { + return p->numVectorColumns + p->numPartitionColumns + p->numAuxiliaryColumns + p->numMetadataColumns; +} + +/** + * @brief Returns the index of the distance hidden column for the given vec0 + * table. + * + * @param p vec0 table + * @return int + */ +int vec0_column_distance_idx(vec0_vtab *p) { + return VEC0_COLUMN_USERN_START + (vec0_num_defined_user_columns(p) - 1) + + VEC0_COLUMN_OFFSET_DISTANCE; +} + +/** + * @brief Returns the index of the k hidden column for the given vec0 table. + * + * @param p vec0 table + * @return int k column index + */ +int vec0_column_k_idx(vec0_vtab *p) { + return VEC0_COLUMN_USERN_START + (vec0_num_defined_user_columns(p) - 1) + + VEC0_COLUMN_OFFSET_K; +} + +/** + * Returns 1 if the given column-based index is a valid vector column, + * 0 otherwise. + */ +int vec0_column_idx_is_vector(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_VECTOR; +} + +/** + * Returns the vector index of the given user column index. + * ONLY call if validated with vec0_column_idx_is_vector before + */ +int vec0_column_idx_to_vector_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} +/** + * Returns 1 if the given column-based index is a "partition key" column, + * 0 otherwise. + */ +int vec0_column_idx_is_partition(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_PARTITION; +} + +/** + * Returns the partition column index of the given user column index. + * ONLY call if validated with vec0_column_idx_is_vector before + */ +int vec0_column_idx_to_partition_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} + +/** + * Returns 1 if the given column-based index is a auxiliary column, + * 0 otherwise. + */ +int vec0_column_idx_is_auxiliary(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY; +} + +/** + * Returns the auxiliary column index of the given user column index. + * ONLY call if validated with vec0_column_idx_to_partition_idx before + */ +int vec0_column_idx_to_auxiliary_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} + +/** + * Returns 1 if the given column-based index is a metadata column, + * 0 otherwise. + */ +int vec0_column_idx_is_metadata(vec0_vtab *pVtab, int column_idx) { + return column_idx >= VEC0_COLUMN_USERN_START && + column_idx <= (VEC0_COLUMN_USERN_START + vec0_num_defined_user_columns(pVtab) - 1) && + pVtab->user_column_kinds[column_idx - VEC0_COLUMN_USERN_START] == SQLITE_VEC0_USER_COLUMN_KIND_METADATA; +} + +/** + * Returns the metadata column index of the given user column index. + * ONLY call if validated with vec0_column_idx_is_metadata before + */ +int vec0_column_idx_to_metadata_idx(vec0_vtab *pVtab, int column_idx) { + UNUSED_PARAMETER(pVtab); + return pVtab->user_column_idxs[column_idx - VEC0_COLUMN_USERN_START]; +} + +/** + * @brief Retrieve the chunk_id, chunk_offset, and possible "id" value + * of a vec0_vtab row with the provided rowid + * + * @param p vec0_vtab + * @param rowid the rowid of the row to query + * @param id output, optional sqlite3_value to provide the id. + * Useful for text PK rows. Must be freed with sqlite3_value_free() + * @param chunk_id output, the chunk_id the row belongs to + * @param chunk_offset output, the offset within the chunk the row belongs to + * @return SQLITE_ROW on success, error code otherwise. SQLITE_EMPTY if row DNE + */ +int vec0_get_chunk_position(vec0_vtab *p, i64 rowid, sqlite3_value **id, + i64 *chunk_id, i64 *chunk_offset) { + int rc; + + if (!p->stmtRowidsGetChunkPosition) { + const char *zSql = + sqlite3_mprintf("SELECT id, chunk_id, chunk_offset " + "FROM " VEC0_SHADOW_ROWIDS_NAME " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsGetChunkPosition, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR + "could not initialize 'rowids get chunk position' statement"); + goto cleanup; + } + } + + sqlite3_bind_int64(p->stmtRowidsGetChunkPosition, 1, rowid); + rc = sqlite3_step(p->stmtRowidsGetChunkPosition); + // special case: when no results, return SQLITE_EMPTY to convey "that chunk + // position doesnt exist" + if (rc == SQLITE_DONE) { + rc = SQLITE_EMPTY; + goto cleanup; + } + if (rc != SQLITE_ROW) { + goto cleanup; + } + + if (id) { + sqlite3_value *value = + sqlite3_column_value(p->stmtRowidsGetChunkPosition, 0); + *id = sqlite3_value_dup(value); + if (!*id) { + rc = SQLITE_NOMEM; + goto cleanup; + } + } + + if (chunk_id) { + *chunk_id = sqlite3_column_int64(p->stmtRowidsGetChunkPosition, 1); + } + if (chunk_offset) { + *chunk_offset = sqlite3_column_int64(p->stmtRowidsGetChunkPosition, 2); + } + + rc = SQLITE_OK; + +cleanup: + sqlite3_reset(p->stmtRowidsGetChunkPosition); + sqlite3_clear_bindings(p->stmtRowidsGetChunkPosition); + return rc; +} + +/** + * @brief Return the id value from the _rowids table where _rowids.rowid = + * rowid. + * + * @param pVtab: vec0 table to query + * @param rowid: rowid of the row to query. + * @param out: A dup'ed sqlite3_value of the id column. Might be null. + * Must be cleaned up with sqlite3_value_free(). + * @returns SQLITE_OK on success, error code on failure + */ +int vec0_get_id_value_from_rowid(vec0_vtab *pVtab, i64 rowid, + sqlite3_value **out) { + // PERF: different strategy than get_chunk_position? + return vec0_get_chunk_position((vec0_vtab *)pVtab, rowid, out, NULL, NULL); +} + +int vec0_rowid_from_id(vec0_vtab *p, sqlite3_value *valueId, i64 *rowid) { + sqlite3_stmt *stmt = NULL; + int rc; + char *zSql; + zSql = sqlite3_mprintf("SELECT rowid" + " FROM " VEC0_SHADOW_ROWIDS_NAME " WHERE id = ?", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_value(stmt, 1, valueId); + rc = sqlite3_step(stmt); + if (rc == SQLITE_DONE) { + rc = SQLITE_EMPTY; + goto cleanup; + } + if (rc != SQLITE_ROW) { + goto cleanup; + } + *rowid = sqlite3_column_int64(stmt, 0); + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + goto cleanup; + } + + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmt); + return rc; +} + +int vec0_result_id(vec0_vtab *p, sqlite3_context *context, i64 rowid) { + if (!p->pkIsText) { + sqlite3_result_int64(context, rowid); + return SQLITE_OK; + } + sqlite3_value *valueId; + int rc = vec0_get_id_value_from_rowid(p, rowid, &valueId); + if (rc != SQLITE_OK) { + return rc; + } + if (!valueId) { + sqlite3_result_error_nomem(context); + } else { + sqlite3_result_value(context, valueId); + sqlite3_value_free(valueId); + } + return SQLITE_OK; +} + +/** + * @brief + * + * @param pVtab: virtual table to query + * @param rowid: row to lookup + * @param vector_column_idx: which vector column to query + * @param outVector: Output pointer to the vector buffer. + * Must be sqlite3_free()'ed. + * @param outVectorSize: Pointer to a int where the size of outVector + * will be stored. + * @return int SQLITE_OK on success. + */ +int vec0_get_vector_data(vec0_vtab *pVtab, i64 rowid, int vector_column_idx, + void **outVector, int *outVectorSize) { + vec0_vtab *p = pVtab; + int rc, brc; + i64 chunk_id; + i64 chunk_offset; + size_t size; + void *buf = NULL; + int blobOffset; + sqlite3_blob *vectorBlob = NULL; + assert((vector_column_idx >= 0) && + (vector_column_idx < pVtab->numVectorColumns)); + + rc = vec0_get_chunk_position(pVtab, rowid, NULL, &chunk_id, &chunk_offset); + if (rc == SQLITE_EMPTY) { + vtab_set_error(&pVtab->base, "Could not find a row with rowid %lld", rowid); + goto cleanup; + } + if (rc != SQLITE_OK) { + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, + p->shadowVectorChunksNames[vector_column_idx], + "vectors", chunk_id, 0, &vectorBlob); + + if (rc != SQLITE_OK) { + vtab_set_error(&pVtab->base, + "Could not fetch vector data for %lld, opening blob failed", + rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + + size = vector_column_byte_size(pVtab->vector_columns[vector_column_idx]); + blobOffset = chunk_offset * size; + + buf = sqlite3_malloc(size); + if (!buf) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + rc = sqlite3_blob_read(vectorBlob, buf, size, blobOffset); + if (rc != SQLITE_OK) { + sqlite3_free(buf); + buf = NULL; + vtab_set_error( + &pVtab->base, + "Could not fetch vector data for %lld, reading from blob failed", + rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + + *outVector = buf; + if (outVectorSize) { + *outVectorSize = size; + } + rc = SQLITE_OK; + +cleanup: + brc = sqlite3_blob_close(vectorBlob); + if ((rc == SQLITE_OK) && (brc != SQLITE_OK)) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR + "unknown error, could not close vector blob, please file an issue"); + return brc; + } + + return rc; +} + +/** + * @brief Retrieve the sqlite3_value of the i'th partition value for the given row. + * + * @param pVtab - the vec0_vtab in questions + * @param rowid - rowid of target row + * @param partition_idx - which partition column to retrieve + * @param outValue - output sqlite3_value + * @return int - SQLITE_OK on success, otherwise error code + */ +int vec0_get_partition_value_for_rowid(vec0_vtab *pVtab, i64 rowid, int partition_idx, sqlite3_value ** outValue) { + int rc; + i64 chunk_id; + i64 chunk_offset; + rc = vec0_get_chunk_position(pVtab, rowid, NULL, &chunk_id, &chunk_offset); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_stmt * stmt = NULL; + char * zSql = sqlite3_mprintf("SELECT partition%02d FROM " VEC0_SHADOW_CHUNKS_NAME " WHERE chunk_id = ?", partition_idx, pVtab->schemaName, pVtab->tableName); + if(!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(pVtab->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_bind_int64(stmt, 1, chunk_id); + rc = sqlite3_step(stmt); + if(rc != SQLITE_ROW) { + rc = SQLITE_ERROR; + goto done; + } + *outValue = sqlite3_value_dup(sqlite3_column_value(stmt, 0)); + if(!*outValue) { + rc = SQLITE_NOMEM; + goto done; + } + rc = SQLITE_OK; + + done: + sqlite3_finalize(stmt); + return rc; + +} + +/** + * @brief Get the value of an auxiliary column for the given rowid + * + * @param pVtab vec0_vtab + * @param rowid the rowid of the row to lookup + * @param auxiliary_idx aux index of the column we care about + * @param outValue Output sqlite3_value to store + * @return int SQLITE_OK on success, error code otherwise + */ +int vec0_get_auxiliary_value_for_rowid(vec0_vtab *pVtab, i64 rowid, int auxiliary_idx, sqlite3_value ** outValue) { + int rc; + sqlite3_stmt * stmt = NULL; + char * zSql = sqlite3_mprintf("SELECT value%02d FROM " VEC0_SHADOW_AUXILIARY_NAME " WHERE rowid = ?", auxiliary_idx, pVtab->schemaName, pVtab->tableName); + if(!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(pVtab->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_ROW) { + rc = SQLITE_ERROR; + goto done; + } + *outValue = sqlite3_value_dup(sqlite3_column_value(stmt, 0)); + if(!*outValue) { + rc = SQLITE_NOMEM; + goto done; + } + rc = SQLITE_OK; + + done: + sqlite3_finalize(stmt); + return rc; +} + +/** + * @brief Result the given metadata value for the given row and metadata column index. + * Will traverse the metadatachunksNN table with BLOB I/0 for the given rowid. + * + * @param p + * @param rowid + * @param metadata_idx + * @param context + * @return int + */ +int vec0_result_metadata_value_for_rowid(vec0_vtab *p, i64 rowid, int metadata_idx, sqlite3_context * context) { + int rc; + i64 chunk_id; + i64 chunk_offset; + rc = vec0_get_chunk_position(p, rowid, NULL, &chunk_id, &chunk_offset); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_blob * blobValue; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 0, &blobValue); + if(rc != SQLITE_OK) { + return rc; + } + + switch(p->metadata_columns[metadata_idx].kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + u8 block; + rc = sqlite3_blob_read(blobValue, &block, sizeof(block), chunk_offset / CHAR_BIT); + if(rc != SQLITE_OK) { + goto done; + } + int value = block >> ((chunk_offset % CHAR_BIT)) & 1; + sqlite3_result_int(context, value); + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 value; + rc = sqlite3_blob_read(blobValue, &value, sizeof(value), chunk_offset * sizeof(i64)); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_result_int64(context, value); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double value; + rc = sqlite3_blob_read(blobValue, &value, sizeof(value), chunk_offset * sizeof(double)); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_result_double(context, value); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + rc = sqlite3_blob_read(blobValue, &view, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH, chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + int length = ((int *)view)[0]; + if(length <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + sqlite3_result_text(context, (const char*) (view + 4), length, SQLITE_TRANSIENT); + } + else { + sqlite3_stmt * stmt; + const char * zSql = sqlite3_mprintf("SELECT data FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_idx); + if(!zSql) { + rc = SQLITE_ERROR; + goto done; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free((void *) zSql); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_ROW) { + sqlite3_finalize(stmt); + rc = SQLITE_ERROR; + goto done; + } + sqlite3_result_value(context, sqlite3_column_value(stmt, 0)); + sqlite3_finalize(stmt); + rc = SQLITE_OK; + } + break; + } + } + done: + // blobValue is read-only, will not fail on close + sqlite3_blob_close(blobValue); + return rc; + +} + +int vec0_get_latest_chunk_rowid(vec0_vtab *p, i64 *chunk_rowid, sqlite3_value ** partitionKeyValues) { + int rc; + const char *zSql; + // lazy initialize stmtLatestChunk when needed. May be cleared during xSync() + if (!p->stmtLatestChunk) { + if(p->numPartitionColumns > 0) { + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "SELECT max(rowid) FROM " VEC0_SHADOW_CHUNKS_NAME " WHERE ", + p->schemaName, p->tableName); + + for(int i = 0; i < p->numPartitionColumns; i++) { + if(i != 0) { + sqlite3_str_appendall(s, " AND "); + } + sqlite3_str_appendf(s, " partition%02d = ? ", i); + } + zSql = sqlite3_str_finish(s); + }else { + zSql = sqlite3_mprintf("SELECT max(rowid) FROM " VEC0_SHADOW_CHUNKS_NAME, + p->schemaName, p->tableName); + } + + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtLatestChunk, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + // IMP: V21406_05476 + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'latest chunk' statement"); + goto cleanup; + } + } + + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_bind_value(p->stmtLatestChunk, i+1, (partitionKeyValues[i])); + } + + rc = sqlite3_step(p->stmtLatestChunk); + if (rc != SQLITE_ROW) { + // IMP: V31559_15629 + vtab_set_error(&p->base, VEC_INTERAL_ERROR "Could not find latest chunk"); + rc = SQLITE_ERROR; + goto cleanup; + } + if(sqlite3_column_type(p->stmtLatestChunk, 0) == SQLITE_NULL){ + rc = SQLITE_EMPTY; + goto cleanup; + } + *chunk_rowid = sqlite3_column_int64(p->stmtLatestChunk, 0); + rc = sqlite3_step(p->stmtLatestChunk); + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "unknown result code when closing out stmtLatestChunk. " + "Please file an issue: " REPORT_URL, + p->schemaName, p->shadowChunksName); + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + if (p->stmtLatestChunk) { + sqlite3_reset(p->stmtLatestChunk); + sqlite3_clear_bindings(p->stmtLatestChunk); + } + return rc; +} + +int vec0_rowids_insert_rowid(vec0_vtab *p, i64 rowid) { + int rc = SQLITE_OK; + int entered = 0; + UNUSED_PARAMETER(entered); // temporary + if (!p->stmtRowidsInsertRowid) { + const char *zSql = + sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_ROWIDS_NAME "(rowid)" + "VALUES (?);", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsInsertRowid, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'insert rowids' statement"); + goto cleanup; + } + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_enter) { + sqlite3_mutex_enter(sqlite3_db_mutex(p->db)); + entered = 1; + } +#endif + sqlite3_bind_int64(p->stmtRowidsInsertRowid, 1, rowid); + rc = sqlite3_step(p->stmtRowidsInsertRowid); + + if (rc != SQLITE_DONE) { + if (sqlite3_extended_errcode(p->db) == SQLITE_CONSTRAINT_PRIMARYKEY) { + // IMP: V17090_01160 + vtab_set_error(&p->base, "UNIQUE constraint failed on %s primary key", + p->tableName); + } else { + // IMP: V04679_21517 + vtab_set_error(&p->base, + "Error inserting rowid into rowids shadow table: %s", + sqlite3_errmsg(sqlite3_db_handle(p->stmtRowidsInsertId))); + } + rc = SQLITE_ERROR; + goto cleanup; + } + + rc = SQLITE_OK; + +cleanup: + if (p->stmtRowidsInsertRowid) { + sqlite3_reset(p->stmtRowidsInsertRowid); + sqlite3_clear_bindings(p->stmtRowidsInsertRowid); + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_leave && entered) { + sqlite3_mutex_leave(sqlite3_db_mutex(p->db)); + } +#endif + return rc; +} + +int vec0_rowids_insert_id(vec0_vtab *p, sqlite3_value *idValue, i64 *rowid) { + int rc = SQLITE_OK; + int entered = 0; + UNUSED_PARAMETER(entered); // temporary + if (!p->stmtRowidsInsertId) { + const char *zSql = + sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_ROWIDS_NAME "(id)" + "VALUES (?);", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto complete; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsInsertId, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'insert rowids id' statement"); + goto complete; + } + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_enter) { + sqlite3_mutex_enter(sqlite3_db_mutex(p->db)); + entered = 1; + } +#endif + + if (idValue) { + sqlite3_bind_value(p->stmtRowidsInsertId, 1, idValue); + } + rc = sqlite3_step(p->stmtRowidsInsertId); + + if (rc != SQLITE_DONE) { + if (sqlite3_extended_errcode(p->db) == SQLITE_CONSTRAINT_UNIQUE) { + // IMP: V20497_04568 + vtab_set_error(&p->base, "UNIQUE constraint failed on %s primary key", + p->tableName); + } else { + // IMP: V24016_08086 + // IMP: V15177_32015 + vtab_set_error(&p->base, + "Error inserting id into rowids shadow table: %s", + sqlite3_errmsg(sqlite3_db_handle(p->stmtRowidsInsertId))); + } + rc = SQLITE_ERROR; + goto complete; + } + + *rowid = sqlite3_last_insert_rowid(p->db); + rc = SQLITE_OK; + +complete: + if (p->stmtRowidsInsertId) { + sqlite3_reset(p->stmtRowidsInsertId); + sqlite3_clear_bindings(p->stmtRowidsInsertId); + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_leave && entered) { + sqlite3_mutex_leave(sqlite3_db_mutex(p->db)); + } +#endif + return rc; +} + +int vec0_metadata_chunk_size(vec0_metadata_column_kind kind, int chunk_size) { + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: + return chunk_size / 8; + case VEC0_METADATA_COLUMN_KIND_INTEGER: + return chunk_size * sizeof(i64); + case VEC0_METADATA_COLUMN_KIND_FLOAT: + return chunk_size * sizeof(double); + case VEC0_METADATA_COLUMN_KIND_TEXT: + return chunk_size * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH; + } + return 0; +} + +int vec0_rowids_update_position(vec0_vtab *p, i64 rowid, i64 chunk_rowid, + i64 chunk_offset) { + int rc = SQLITE_OK; + + if (!p->stmtRowidsUpdatePosition) { + const char *zSql = sqlite3_mprintf(" UPDATE " VEC0_SHADOW_ROWIDS_NAME + " SET chunk_id = ?, chunk_offset = ?" + " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &p->stmtRowidsUpdatePosition, 0); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "could not initialize 'update rowids position' statement"); + goto cleanup; + } + } + + sqlite3_bind_int64(p->stmtRowidsUpdatePosition, 1, chunk_rowid); + sqlite3_bind_int64(p->stmtRowidsUpdatePosition, 2, chunk_offset); + sqlite3_bind_int64(p->stmtRowidsUpdatePosition, 3, rowid); + + rc = sqlite3_step(p->stmtRowidsUpdatePosition); + if (rc != SQLITE_DONE) { + // IMP: V21925_05995 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not update rowids position for rowid=%lld, " + "chunk_rowid=%lld, chunk_offset=%lld", + rowid, chunk_rowid, chunk_offset); + rc = SQLITE_ERROR; + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + if (p->stmtRowidsUpdatePosition) { + sqlite3_reset(p->stmtRowidsUpdatePosition); + sqlite3_clear_bindings(p->stmtRowidsUpdatePosition); + } + + return rc; +} + +/** + * @brief Adds a new chunk for the vec0 table, and the corresponding vector + * chunks. + * + * Inserts a new row into the _chunks table, with blank data, and uses that new + * rowid to insert new blank rows into _vector_chunksXX tables. + * + * @param p: vec0 table to add new chunk + * @param paritionKeyValues: Array of partition key valeus for the new chunk, if available + * @param chunk_rowid: Output pointer, if not NULL, then will be filled with the + * new chunk rowid. + * @return int SQLITE_OK on success, error code otherwise. + */ +int vec0_new_chunk(vec0_vtab *p, sqlite3_value ** partitionKeyValues, i64 *chunk_rowid) { + int rc; + char *zSql; + sqlite3_stmt *stmt; + i64 rowid; + + // Step 1: Insert a new row in _chunks, capture that new rowid + if(p->numPartitionColumns > 0) { + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "INSERT INTO " VEC0_SHADOW_CHUNKS_NAME, p->schemaName, p->tableName); + sqlite3_str_appendall(s, "(size, validity, rowids"); + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_str_appendf(s, ", partition%02d", i); + } + sqlite3_str_appendall(s, ") VALUES (?, ?, ?"); + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_str_appendall(s, ", ?"); + } + sqlite3_str_appendall(s, ")"); + + zSql = sqlite3_str_finish(s); + }else { + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_CHUNKS_NAME + "(size, validity, rowids) " + "VALUES (?, ?, ?);", + p->schemaName, p->tableName); + } + + if (!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return rc; + } + +#if SQLITE_THREADSAFE + if (sqlite3_mutex_enter) { + sqlite3_mutex_enter(sqlite3_db_mutex(p->db)); + } +#endif + + sqlite3_bind_int64(stmt, 1, p->chunk_size); // size + sqlite3_bind_zeroblob(stmt, 2, p->chunk_size / CHAR_BIT); // validity bitmap + sqlite3_bind_zeroblob(stmt, 3, p->chunk_size * sizeof(i64)); // rowids + + for(int i = 0; i < p->numPartitionColumns; i++) { + sqlite3_bind_value(stmt, 4 + i, partitionKeyValues[i]); + } + + rc = sqlite3_step(stmt); + int failed = rc != SQLITE_DONE; + rowid = sqlite3_last_insert_rowid(p->db); +#if SQLITE_THREADSAFE + if (sqlite3_mutex_leave) { + sqlite3_mutex_leave(sqlite3_db_mutex(p->db)); + } +#endif + sqlite3_finalize(stmt); + if (failed) { + return SQLITE_ERROR; + } + + // Step 2: Create new vector chunks for each vector column, with + // that new chunk_rowid. + + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_VECTOR) { + continue; + } + int vector_column_idx = p->user_column_idxs[i]; + i64 vectorsSize = + p->chunk_size * vector_column_byte_size(p->vector_columns[vector_column_idx]); + + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_VECTOR_N_NAME + "(rowid, vectors)" + "VALUES (?, ?)", + p->schemaName, p->tableName, vector_column_idx); + if (!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + + if (rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return rc; + } + + sqlite3_bind_int64(stmt, 1, rowid); + sqlite3_bind_zeroblob64(stmt, 2, vectorsSize); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) { + return rc; + } + } + + // Step 3: Create new metadata chunks for each metadata column + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_METADATA) { + continue; + } + int metadata_column_idx = p->user_column_idxs[i]; + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_METADATA_N_NAME + "(rowid, data)" + "VALUES (?, ?)", + p->schemaName, p->tableName, metadata_column_idx); + if (!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + + if (rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return rc; + } + + sqlite3_bind_int64(stmt, 1, rowid); + sqlite3_bind_zeroblob64(stmt, 2, vec0_metadata_chunk_size(p->metadata_columns[metadata_column_idx].kind, p->chunk_size)); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + if (rc != SQLITE_DONE) { + return rc; + } + } + + + if (chunk_rowid) { + *chunk_rowid = rowid; + } + + return SQLITE_OK; +} + +struct vec0_query_fullscan_data { + sqlite3_stmt *rowids_stmt; + i8 done; +}; +void vec0_query_fullscan_data_clear( + struct vec0_query_fullscan_data *fullscan_data) { + if (!fullscan_data) + return; + + if (fullscan_data->rowids_stmt) { + sqlite3_finalize(fullscan_data->rowids_stmt); + fullscan_data->rowids_stmt = NULL; + } +} + +struct vec0_query_knn_data { + i64 k; + i64 k_used; + // Array of rowids of size k. Must be freed with sqlite3_free(). + i64 *rowids; + // Array of distances of size k. Must be freed with sqlite3_free(). + f32 *distances; + i64 current_idx; +}; +void vec0_query_knn_data_clear(struct vec0_query_knn_data *knn_data) { + if (!knn_data) + return; + + if (knn_data->rowids) { + sqlite3_free(knn_data->rowids); + knn_data->rowids = NULL; + } + if (knn_data->distances) { + sqlite3_free(knn_data->distances); + knn_data->distances = NULL; + } +} + +struct vec0_query_point_data { + i64 rowid; + void *vectors[VEC0_MAX_VECTOR_COLUMNS]; + int done; +}; +void vec0_query_point_data_clear(struct vec0_query_point_data *point_data) { + if (!point_data) + return; + for (int i = 0; i < VEC0_MAX_VECTOR_COLUMNS; i++) { + sqlite3_free(point_data->vectors[i]); + point_data->vectors[i] = NULL; + } +} + +typedef enum { + // If any values are updated, please update the ARCHITECTURE.md docs accordingly! + + VEC0_QUERY_PLAN_FULLSCAN = '1', + VEC0_QUERY_PLAN_POINT = '2', + VEC0_QUERY_PLAN_KNN = '3', +} vec0_query_plan; + +typedef struct vec0_cursor vec0_cursor; +struct vec0_cursor { + sqlite3_vtab_cursor base; + + vec0_query_plan query_plan; + struct vec0_query_fullscan_data *fullscan_data; + struct vec0_query_knn_data *knn_data; + struct vec0_query_point_data *point_data; +}; + +void vec0_cursor_clear(vec0_cursor *pCur) { + if (pCur->fullscan_data) { + vec0_query_fullscan_data_clear(pCur->fullscan_data); + sqlite3_free(pCur->fullscan_data); + pCur->fullscan_data = NULL; + } + if (pCur->knn_data) { + vec0_query_knn_data_clear(pCur->knn_data); + sqlite3_free(pCur->knn_data); + pCur->knn_data = NULL; + } + if (pCur->point_data) { + vec0_query_point_data_clear(pCur->point_data); + sqlite3_free(pCur->point_data); + pCur->point_data = NULL; + } +} + +#define VEC_CONSTRUCTOR_ERROR "vec0 constructor error: " +static int vec0_init(sqlite3 *db, void *pAux, int argc, const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr, bool isCreate) { + UNUSED_PARAMETER(pAux); + vec0_vtab *pNew; + int rc; + const char *zSql; + + pNew = sqlite3_malloc(sizeof(*pNew)); + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + + // Declared chunk_size=N for entire table. + // -1 to use the defualt, otherwise will get re-assigned on `chunk_size=N` + // option + int chunk_size = -1; + int numVectorColumns = 0; + int numPartitionColumns = 0; + int numAuxiliaryColumns = 0; + int numMetadataColumns = 0; + int user_column_idx = 0; + + // track if a "primary key" column is defined + char *pkColumnName = NULL; + int pkColumnNameLength; + int pkColumnType = SQLITE_INTEGER; + + for (int i = 3; i < argc; i++) { + struct VectorColumnDefinition vecColumn; + struct Vec0PartitionColumnDefinition partitionColumn; + struct Vec0AuxiliaryColumnDefinition auxColumn; + struct Vec0MetadataColumnDefinition metadataColumn; + char *cName = NULL; + int cNameLength; + int cType; + + // Scenario #1: Constructor argument is a vector column definition, ie `foo float[1024]` + rc = vec0_parse_vector_column(argv[i], strlen(argv[i]), &vecColumn); + if (rc == SQLITE_ERROR) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR "could not parse vector column '%s'", argv[i]); + goto error; + } + if (rc == SQLITE_OK) { + if (numVectorColumns >= VEC0_MAX_VECTOR_COLUMNS) { + sqlite3_free(vecColumn.name); + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "Too many provided vector columns, maximum %d", + VEC0_MAX_VECTOR_COLUMNS); + goto error; + } + + if (vecColumn.dimensions > SQLITE_VEC_VEC0_MAX_DIMENSIONS) { + sqlite3_free(vecColumn.name); + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "Dimension on vector column too large, provided %lld, maximum %lld", + (i64)vecColumn.dimensions, SQLITE_VEC_VEC0_MAX_DIMENSIONS); + goto error; + } + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_VECTOR; + pNew->user_column_idxs[user_column_idx] = numVectorColumns; + memcpy(&pNew->vector_columns[numVectorColumns], &vecColumn, sizeof(vecColumn)); + numVectorColumns++; + user_column_idx++; + + continue; + } + + // Scenario #2: Constructor argument is a partition key column definition, ie `user_id text partition key` + rc = vec0_parse_partition_key_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &cType); + if (rc == SQLITE_OK) { + if (numPartitionColumns >= VEC0_MAX_PARTITION_COLUMNS) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than %d partition key columns were provided", + VEC0_MAX_PARTITION_COLUMNS); + goto error; + } + partitionColumn.type = cType; + partitionColumn.name_length = cNameLength; + partitionColumn.name = sqlite3_mprintf("%.*s", cNameLength, cName); + if(!partitionColumn.name) { + rc = SQLITE_NOMEM; + goto error; + } + + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_PARTITION; + pNew->user_column_idxs[user_column_idx] = numPartitionColumns; + memcpy(&pNew->paritition_columns[numPartitionColumns], &partitionColumn, sizeof(partitionColumn)); + numPartitionColumns++; + user_column_idx++; + continue; + } + + // Scenario #3: Constructor argument is a primary key column definition, ie `article_id text primary key` + rc = vec0_parse_primary_key_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &cType); + if (rc == SQLITE_OK) { + if (pkColumnName) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than one primary key definition was provided, vec0 only " + "suports a single primary key column", + argv[i]); + goto error; + } + pkColumnName = cName; + pkColumnNameLength = cNameLength; + pkColumnType = cType; + continue; + } + + // Scenario #4: Constructor argument is a auxiliary column definition, ie `+contents text` + rc = vec0_parse_auxiliary_column_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &cType); + if(rc == SQLITE_OK) { + if (numAuxiliaryColumns >= VEC0_MAX_AUXILIARY_COLUMNS) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than %d auxiliary columns were provided", + VEC0_MAX_AUXILIARY_COLUMNS); + goto error; + } + auxColumn.type = cType; + auxColumn.name_length = cNameLength; + auxColumn.name = sqlite3_mprintf("%.*s", cNameLength, cName); + if(!auxColumn.name) { + rc = SQLITE_NOMEM; + goto error; + } + + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY; + pNew->user_column_idxs[user_column_idx] = numAuxiliaryColumns; + memcpy(&pNew->auxiliary_columns[numAuxiliaryColumns], &auxColumn, sizeof(auxColumn)); + numAuxiliaryColumns++; + user_column_idx++; + continue; + } + + vec0_metadata_column_kind kind; + rc = vec0_parse_metadata_column_definition(argv[i], strlen(argv[i]), &cName, + &cNameLength, &kind); + if(rc == SQLITE_OK) { + if (numMetadataColumns >= VEC0_MAX_METADATA_COLUMNS) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR + "More than %d metadata columns were provided", + VEC0_MAX_METADATA_COLUMNS); + goto error; + } + metadataColumn.kind = kind; + metadataColumn.name_length = cNameLength; + metadataColumn.name = sqlite3_mprintf("%.*s", cNameLength, cName); + if(!metadataColumn.name) { + rc = SQLITE_NOMEM; + goto error; + } + + pNew->user_column_kinds[user_column_idx] = SQLITE_VEC0_USER_COLUMN_KIND_METADATA; + pNew->user_column_idxs[user_column_idx] = numMetadataColumns; + memcpy(&pNew->metadata_columns[numMetadataColumns], &metadataColumn, sizeof(metadataColumn)); + numMetadataColumns++; + user_column_idx++; + continue; + } + + // Scenario #4: Constructor argument is a table-level option, ie `chunk_size` + + char *key; + char *value; + int keyLength, valueLength; + rc = vec0_parse_table_option(argv[i], strlen(argv[i]), &key, &keyLength, + &value, &valueLength); + if (rc == SQLITE_ERROR) { + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR "could not parse table option '%s'", argv[i]); + goto error; + } + if (rc == SQLITE_OK) { + if (sqlite3_strnicmp(key, "chunk_size", keyLength) == 0) { + chunk_size = atoi(value); + if (chunk_size <= 0) { + // IMP: V01931_18769 + *pzErr = + sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "chunk_size must be a non-zero positive integer"); + goto error; + } + if ((chunk_size % 8) != 0) { + // IMP: V14110_30948 + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "chunk_size must be divisible by 8"); + goto error; + } +#define SQLITE_VEC_CHUNK_SIZE_MAX 4096 + if (chunk_size > SQLITE_VEC_CHUNK_SIZE_MAX) { + *pzErr = + sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR "chunk_size too large"); + goto error; + } + } else { + // IMP: V27642_11712 + *pzErr = sqlite3_mprintf( + VEC_CONSTRUCTOR_ERROR "Unknown table option: %.*s", keyLength, key); + goto error; + } + continue; + } + + // Scenario #5: Unknown constructor argument + *pzErr = + sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR "Could not parse '%s'", argv[i]); + goto error; + } + + if (chunk_size < 0) { + chunk_size = 1024; + } + + if (numVectorColumns <= 0) { + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "At least one vector column is required"); + goto error; + } + + sqlite3_str *createStr = sqlite3_str_new(NULL); + sqlite3_str_appendall(createStr, "CREATE TABLE x("); + if (pkColumnName) { + sqlite3_str_appendf(createStr, "\"%.*w\" primary key, ", pkColumnNameLength, + pkColumnName); + } else { + sqlite3_str_appendall(createStr, "rowid, "); + } + for (int i = 0; i < numVectorColumns + numPartitionColumns + numAuxiliaryColumns + numMetadataColumns; i++) { + switch(pNew->user_column_kinds[i]) { + case SQLITE_VEC0_USER_COLUMN_KIND_VECTOR: { + int vector_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->vector_columns[vector_idx].name_length, + pNew->vector_columns[vector_idx].name); + break; + } + case SQLITE_VEC0_USER_COLUMN_KIND_PARTITION: { + int partition_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->paritition_columns[partition_idx].name_length, + pNew->paritition_columns[partition_idx].name); + break; + } + case SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY: { + int auxiliary_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->auxiliary_columns[auxiliary_idx].name_length, + pNew->auxiliary_columns[auxiliary_idx].name); + break; + } + case SQLITE_VEC0_USER_COLUMN_KIND_METADATA: { + int metadata_idx = pNew->user_column_idxs[i]; + sqlite3_str_appendf(createStr, "\"%.*w\", ", + pNew->metadata_columns[metadata_idx].name_length, + pNew->metadata_columns[metadata_idx].name); + break; + } + } + + } + sqlite3_str_appendall(createStr, " distance hidden, k hidden) "); + if (pkColumnName) { + sqlite3_str_appendall(createStr, "without rowid "); + } + zSql = sqlite3_str_finish(createStr); + if (!zSql) { + goto error; + } + rc = sqlite3_declare_vtab(db, zSql); + sqlite3_free((void *)zSql); + if (rc != SQLITE_OK) { + *pzErr = sqlite3_mprintf(VEC_CONSTRUCTOR_ERROR + "could not declare virtual table, '%s'", + sqlite3_errmsg(db)); + goto error; + } + + const char *schemaName = argv[1]; + const char *tableName = argv[2]; + + pNew->db = db; + pNew->pkIsText = pkColumnType == SQLITE_TEXT; + pNew->schemaName = sqlite3_mprintf("%s", schemaName); + if (!pNew->schemaName) { + goto error; + } + pNew->tableName = sqlite3_mprintf("%s", tableName); + if (!pNew->tableName) { + goto error; + } + pNew->shadowRowidsName = sqlite3_mprintf("%s_rowids", tableName); + if (!pNew->shadowRowidsName) { + goto error; + } + pNew->shadowChunksName = sqlite3_mprintf("%s_chunks", tableName); + if (!pNew->shadowChunksName) { + goto error; + } + pNew->numVectorColumns = numVectorColumns; + pNew->numPartitionColumns = numPartitionColumns; + pNew->numAuxiliaryColumns = numAuxiliaryColumns; + pNew->numMetadataColumns = numMetadataColumns; + + for (int i = 0; i < pNew->numVectorColumns; i++) { + pNew->shadowVectorChunksNames[i] = + sqlite3_mprintf("%s_vector_chunks%02d", tableName, i); + if (!pNew->shadowVectorChunksNames[i]) { + goto error; + } + } + for (int i = 0; i < pNew->numMetadataColumns; i++) { + pNew->shadowMetadataChunksNames[i] = + sqlite3_mprintf("%s_metadatachunks%02d", tableName, i); + if (!pNew->shadowMetadataChunksNames[i]) { + goto error; + } + } + pNew->chunk_size = chunk_size; + + // if xCreate, then create the necessary shadow tables + if (isCreate) { + sqlite3_stmt *stmt; + int rc; + + char * zCreateInfo = sqlite3_mprintf("CREATE TABLE "VEC0_SHADOW_INFO_NAME " (key text primary key, value any)", pNew->schemaName, pNew->tableName); + if(!zCreateInfo) { + goto error; + } + rc = sqlite3_prepare_v2(db, zCreateInfo, -1, &stmt, NULL); + + sqlite3_free((void *) zCreateInfo); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // TODO(IMP) + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not create '_info' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + char * zSeedInfo = sqlite3_mprintf( + "INSERT INTO "VEC0_SHADOW_INFO_NAME "(key, value) VALUES " + "(?1, ?2), (?3, ?4), (?5, ?6), (?7, ?8) ", + pNew->schemaName, pNew->tableName + ); + if(!zSeedInfo) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSeedInfo, -1, &stmt, NULL); + sqlite3_free((void *) zSeedInfo); + if (rc != SQLITE_OK) { + // TODO(IMP) + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not seed '_info' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_bind_text(stmt, 1, "CREATE_VERSION", -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, SQLITE_VEC_VERSION, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 3, "CREATE_VERSION_MAJOR", -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 4, SQLITE_VEC_VERSION_MAJOR); + sqlite3_bind_text(stmt, 5, "CREATE_VERSION_MINOR", -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 6, SQLITE_VEC_VERSION_MINOR); + sqlite3_bind_text(stmt, 7, "CREATE_VERSION_PATCH", -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 8, SQLITE_VEC_VERSION_PATCH); + + if(sqlite3_step(stmt) != SQLITE_DONE) { + // TODO(IMP) + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not seed '_info' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + + + // create the _chunks shadow table + char *zCreateShadowChunks = NULL; + if(pNew->numPartitionColumns) { + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "CREATE TABLE " VEC0_SHADOW_CHUNKS_NAME "(", pNew->schemaName, pNew->tableName); + sqlite3_str_appendall(s, "chunk_id INTEGER PRIMARY KEY AUTOINCREMENT," "size INTEGER NOT NULL,"); + sqlite3_str_appendall(s, "sequence_id integer,"); + for(int i = 0; i < pNew->numPartitionColumns;i++) { + sqlite3_str_appendf(s, "partition%02d,", i); + } + sqlite3_str_appendall(s, "validity BLOB NOT NULL, rowids BLOB NOT NULL);"); + zCreateShadowChunks = sqlite3_str_finish(s); + }else { + zCreateShadowChunks = sqlite3_mprintf(VEC0_SHADOW_CHUNKS_CREATE, + pNew->schemaName, pNew->tableName); + } + if (!zCreateShadowChunks) { + goto error; + } + rc = sqlite3_prepare_v2(db, zCreateShadowChunks, -1, &stmt, 0); + sqlite3_free((void *)zCreateShadowChunks); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // IMP: V17740_01811 + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not create '_chunks' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + // create the _rowids shadow table + char *zCreateShadowRowids; + if (pNew->pkIsText) { + // adds a "text unique not null" constraint to the id column + zCreateShadowRowids = sqlite3_mprintf(VEC0_SHADOW_ROWIDS_CREATE_PK_TEXT, + pNew->schemaName, pNew->tableName); + } else { + zCreateShadowRowids = sqlite3_mprintf(VEC0_SHADOW_ROWIDS_CREATE_BASIC, + pNew->schemaName, pNew->tableName); + } + if (!zCreateShadowRowids) { + goto error; + } + rc = sqlite3_prepare_v2(db, zCreateShadowRowids, -1, &stmt, 0); + sqlite3_free((void *)zCreateShadowRowids); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // IMP: V11631_28470 + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf("Could not create '_rowids' shadow table: %s", + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + for (int i = 0; i < pNew->numVectorColumns; i++) { + char *zSql = sqlite3_mprintf(VEC0_SHADOW_VECTOR_N_CREATE, + pNew->schemaName, pNew->tableName, i); + if (!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + // IMP: V25919_09989 + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create '_vector_chunks%02d' shadow table: %s", i, + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + } + + for (int i = 0; i < pNew->numMetadataColumns; i++) { + char *zSql = sqlite3_mprintf("CREATE TABLE " VEC0_SHADOW_METADATA_N_NAME "(rowid PRIMARY KEY, data BLOB NOT NULL);", + pNew->schemaName, pNew->tableName, i); + if (!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create '_metata_chunks%02d' shadow table: %s", i, + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + if(pNew->metadata_columns[i].kind == VEC0_METADATA_COLUMN_KIND_TEXT) { + char *zSql = sqlite3_mprintf("CREATE TABLE " VEC0_SHADOW_METADATA_TEXT_DATA_NAME "(rowid PRIMARY KEY, data TEXT);", + pNew->schemaName, pNew->tableName, i); + if (!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create '_metadatatext%02d' shadow table: %s", i, + sqlite3_errmsg(db)); + goto error; + } + sqlite3_finalize(stmt); + + } + } + + if(pNew->numAuxiliaryColumns > 0) { + sqlite3_stmt * stmt; + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "CREATE TABLE " VEC0_SHADOW_AUXILIARY_NAME "( rowid integer PRIMARY KEY ", pNew->schemaName, pNew->tableName); + for(int i = 0; i < pNew->numAuxiliaryColumns; i++) { + sqlite3_str_appendf(s, ", value%02d", i); + } + sqlite3_str_appendall(s, ")"); + char *zSql = sqlite3_str_finish(s); + if(!zSql) { + goto error; + } + rc = sqlite3_prepare_v2(db, zSql, -1, &stmt, NULL); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + sqlite3_finalize(stmt); + *pzErr = sqlite3_mprintf( + "Could not create auxiliary shadow table: %s", + sqlite3_errmsg(db)); + + goto error; + } + sqlite3_finalize(stmt); + } + } + + *ppVtab = (sqlite3_vtab *)pNew; + return SQLITE_OK; + +error: + vec0_free(pNew); + return SQLITE_ERROR; +} + +static int vec0Create(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + return vec0_init(db, pAux, argc, argv, ppVtab, pzErr, true); +} +static int vec0Connect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, sqlite3_vtab **ppVtab, + char **pzErr) { + return vec0_init(db, pAux, argc, argv, ppVtab, pzErr, false); +} + +static int vec0Disconnect(sqlite3_vtab *pVtab) { + vec0_vtab *p = (vec0_vtab *)pVtab; + vec0_free(p); + sqlite3_free(p); + return SQLITE_OK; +} +static int vec0Destroy(sqlite3_vtab *pVtab) { + vec0_vtab *p = (vec0_vtab *)pVtab; + sqlite3_stmt *stmt; + int rc; + const char *zSql; + + // Free up any sqlite3_stmt, otherwise DROPs on those tables will fail + vec0_free_resources(p); + + // TODO(test) later: can't evidence-of here, bc always gives "SQL logic error" instead of + // provided error + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_CHUNKS_NAME, p->schemaName, + p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + vtab_set_error(pVtab, "could not drop chunks shadow table"); + goto done; + } + sqlite3_finalize(stmt); + + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_INFO_NAME, p->schemaName, + p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + vtab_set_error(pVtab, "could not drop info shadow table"); + goto done; + } + sqlite3_finalize(stmt); + + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_ROWIDS_NAME, p->schemaName, + p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + + for (int i = 0; i < p->numVectorColumns; i++) { + zSql = sqlite3_mprintf("DROP TABLE \"%w\".\"%w\"", p->schemaName, + p->shadowVectorChunksNames[i]); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + + if(p->numAuxiliaryColumns > 0) { + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_AUXILIARY_NAME, p->schemaName, p->tableName); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + + + for (int i = 0; i < p->numMetadataColumns; i++) { + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_METADATA_N_NAME, p->schemaName,p->tableName, i); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + + if(p->metadata_columns[i].kind == VEC0_METADATA_COLUMN_KIND_TEXT) { + zSql = sqlite3_mprintf("DROP TABLE " VEC0_SHADOW_METADATA_TEXT_DATA_NAME, p->schemaName,p->tableName, i); + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, 0); + sqlite3_free((void *)zSql); + if ((rc != SQLITE_OK) || (sqlite3_step(stmt) != SQLITE_DONE)) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + } + + stmt = NULL; + rc = SQLITE_OK; + +done: + sqlite3_finalize(stmt); + vec0_free(p); + // If there was an error + if (rc == SQLITE_OK) { + sqlite3_free(p); + } + return rc; +} + +static int vec0Open(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec0_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec0Close(sqlite3_vtab_cursor *cur) { + vec0_cursor *pCur = (vec0_cursor *)cur; + vec0_cursor_clear(pCur); + sqlite3_free(pCur); + return SQLITE_OK; +} + +// All the different type of "values" provided to argv/argc in vec0Filter. +// These enums denote the use and purpose of all of them. +typedef enum { + // If any values are updated, please update the ARCHITECTURE.md docs accordingly! + + VEC0_IDXSTR_KIND_KNN_MATCH = '{', + VEC0_IDXSTR_KIND_KNN_K = '}', + VEC0_IDXSTR_KIND_KNN_ROWID_IN = '[', + VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT = ']', + VEC0_IDXSTR_KIND_POINT_ID = '!', + VEC0_IDXSTR_KIND_METADATA_CONSTRAINT = '&', +} vec0_idxstr_kind; + +// The different SQLITE_INDEX_CONSTRAINT values that vec0 partition key columns +// support, but as characters that fit nicely in idxstr. +typedef enum { + // If any values are updated, please update the ARCHITECTURE.md docs accordingly! + + VEC0_PARTITION_OPERATOR_EQ = 'a', + VEC0_PARTITION_OPERATOR_GT = 'b', + VEC0_PARTITION_OPERATOR_LE = 'c', + VEC0_PARTITION_OPERATOR_LT = 'd', + VEC0_PARTITION_OPERATOR_GE = 'e', + VEC0_PARTITION_OPERATOR_NE = 'f', +} vec0_partition_operator; +typedef enum { + VEC0_METADATA_OPERATOR_EQ = 'a', + VEC0_METADATA_OPERATOR_GT = 'b', + VEC0_METADATA_OPERATOR_LE = 'c', + VEC0_METADATA_OPERATOR_LT = 'd', + VEC0_METADATA_OPERATOR_GE = 'e', + VEC0_METADATA_OPERATOR_NE = 'f', + VEC0_METADATA_OPERATOR_IN = 'g', +} vec0_metadata_operator; + +static int vec0BestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pIdxInfo) { + vec0_vtab *p = (vec0_vtab *)pVTab; + /** + * Possible query plans are: + * 1. KNN when: + * a) An `MATCH` op on vector column + * b) ORDER BY on distance column + * c) LIMIT + * d) rowid in (...) OPTIONAL + * 2. Point when: + * a) An `EQ` op on rowid column + * 3. else: fullscan + * + */ + int iMatchTerm = -1; + int iMatchVectorTerm = -1; + int iLimitTerm = -1; + int iRowidTerm = -1; + int iKTerm = -1; + int iRowidInTerm = -1; + int hasAuxConstraint = 0; + +#ifdef SQLITE_VEC_DEBUG + printf("pIdxInfo->nOrderBy=%d, pIdxInfo->nConstraint=%d\n", pIdxInfo->nOrderBy, pIdxInfo->nConstraint); +#endif + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + u8 vtabIn = 0; + +#if COMPILER_SUPPORTS_VTAB_IN + if (sqlite3_libversion_number() >= 3038000) { + vtabIn = sqlite3_vtab_in(pIdxInfo, i, -1); + } +#endif + +#ifdef SQLITE_VEC_DEBUG + printf("xBestIndex [%d] usable=%d iColumn=%d op=%d vtabin=%d\n", i, + pIdxInfo->aConstraint[i].usable, pIdxInfo->aConstraint[i].iColumn, + pIdxInfo->aConstraint[i].op, vtabIn); +#endif + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + + if (op == SQLITE_INDEX_CONSTRAINT_LIMIT) { + iLimitTerm = i; + } + if (op == SQLITE_INDEX_CONSTRAINT_MATCH && + vec0_column_idx_is_vector(p, iColumn)) { + if (iMatchTerm > -1) { + vtab_set_error( + pVTab, "only 1 MATCH operator is allowed in a single vec0 query"); + return SQLITE_ERROR; + } + iMatchTerm = i; + iMatchVectorTerm = vec0_column_idx_to_vector_idx(p, iColumn); + } + if (op == SQLITE_INDEX_CONSTRAINT_EQ && iColumn == VEC0_COLUMN_ID) { + if (vtabIn) { + if (iRowidInTerm != -1) { + vtab_set_error(pVTab, "only 1 'rowid in (..)' operator is allowed in " + "a single vec0 query"); + return SQLITE_ERROR; + } + iRowidInTerm = i; + + } else { + iRowidTerm = i; + } + } + if (op == SQLITE_INDEX_CONSTRAINT_EQ && iColumn == vec0_column_k_idx(p)) { + iKTerm = i; + } + if( + (op != SQLITE_INDEX_CONSTRAINT_LIMIT && op != SQLITE_INDEX_CONSTRAINT_OFFSET) + && vec0_column_idx_is_auxiliary(p, iColumn)) { + hasAuxConstraint = 1; + } + } + + sqlite3_str *idxStr = sqlite3_str_new(NULL); + int rc; + + if (iMatchTerm >= 0) { + if (iLimitTerm < 0 && iKTerm < 0) { + vtab_set_error( + pVTab, + "A LIMIT or 'k = ?' constraint is required on vec0 knn queries."); + rc = SQLITE_ERROR; + goto done; + } + if (iLimitTerm >= 0 && iKTerm >= 0) { + vtab_set_error(pVTab, "Only LIMIT or 'k =?' can be provided, not both"); + rc = SQLITE_ERROR; + goto done; + } + + if (pIdxInfo->nOrderBy) { + if (pIdxInfo->nOrderBy > 1) { + vtab_set_error(pVTab, "Only a single 'ORDER BY distance' clause is " + "allowed on vec0 KNN queries"); + rc = SQLITE_ERROR; + goto done; + } + if (pIdxInfo->aOrderBy[0].iColumn != vec0_column_distance_idx(p)) { + vtab_set_error(pVTab, + "Only a single 'ORDER BY distance' clause is allowed on " + "vec0 KNN queries, not on other columns"); + rc = SQLITE_ERROR; + goto done; + } + if (pIdxInfo->aOrderBy[0].desc) { + vtab_set_error( + pVTab, "Only ascending in ORDER BY distance clause is supported, " + "DESC is not supported yet."); + rc = SQLITE_ERROR; + goto done; + } + } + + if(hasAuxConstraint) { + // IMP: V25623_09693 + vtab_set_error(pVTab, "An illegal WHERE constraint was provided on a vec0 auxiliary column in a KNN query."); + rc = SQLITE_ERROR; + goto done; + } + + sqlite3_str_appendchar(idxStr, 1, VEC0_QUERY_PLAN_KNN); + + int argvIndex = 1; + pIdxInfo->aConstraintUsage[iMatchTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iMatchTerm].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_MATCH); + sqlite3_str_appendchar(idxStr, 3, '_'); + + if (iLimitTerm >= 0) { + pIdxInfo->aConstraintUsage[iLimitTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iLimitTerm].omit = 1; + } else { + pIdxInfo->aConstraintUsage[iKTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iKTerm].omit = 1; + } + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_K); + sqlite3_str_appendchar(idxStr, 3, '_'); + +#if COMPILER_SUPPORTS_VTAB_IN + if (iRowidInTerm >= 0) { + // already validated as >= SQLite 3.38 bc iRowidInTerm is only >= 0 when + // vtabIn == 1 + sqlite3_vtab_in(pIdxInfo, iRowidInTerm, 1); + pIdxInfo->aConstraintUsage[iRowidInTerm].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[iRowidInTerm].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_ROWID_IN); + sqlite3_str_appendchar(idxStr, 3, '_'); + } +#endif + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + if(op == SQLITE_INDEX_CONSTRAINT_LIMIT || op == SQLITE_INDEX_CONSTRAINT_OFFSET) { + continue; + } + if(!vec0_column_idx_is_partition(p, iColumn)) { + continue; + } + + int partition_idx = vec0_column_idx_to_partition_idx(p, iColumn); + char value = 0; + + switch(op) { + case SQLITE_INDEX_CONSTRAINT_EQ: { + value = VEC0_PARTITION_OPERATOR_EQ; + break; + } + case SQLITE_INDEX_CONSTRAINT_GT: { + value = VEC0_PARTITION_OPERATOR_GT; + break; + } + case SQLITE_INDEX_CONSTRAINT_LE: { + value = VEC0_PARTITION_OPERATOR_LE; + break; + } + case SQLITE_INDEX_CONSTRAINT_LT: { + value = VEC0_PARTITION_OPERATOR_LT; + break; + } + case SQLITE_INDEX_CONSTRAINT_GE: { + value = VEC0_PARTITION_OPERATOR_GE; + break; + } + case SQLITE_INDEX_CONSTRAINT_NE: { + value = VEC0_PARTITION_OPERATOR_NE; + break; + } + } + + if(value) { + pIdxInfo->aConstraintUsage[i].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[i].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT); + sqlite3_str_appendchar(idxStr, 1, 'A' + partition_idx); + sqlite3_str_appendchar(idxStr, 1, value); + sqlite3_str_appendchar(idxStr, 1, '_'); + } + + } + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + if(op == SQLITE_INDEX_CONSTRAINT_LIMIT || op == SQLITE_INDEX_CONSTRAINT_OFFSET) { + continue; + } + if(!vec0_column_idx_is_metadata(p, iColumn)) { + continue; + } + + int metadata_idx = vec0_column_idx_to_metadata_idx(p, iColumn); + char value = 0; + + switch(op) { + case SQLITE_INDEX_CONSTRAINT_EQ: { + int vtabIn = 0; + #if COMPILER_SUPPORTS_VTAB_IN + if (sqlite3_libversion_number() >= 3038000) { + vtabIn = sqlite3_vtab_in(pIdxInfo, i, -1); + } + if(vtabIn) { + switch(p->metadata_columns[metadata_idx].kind) { + case VEC0_METADATA_COLUMN_KIND_FLOAT: + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + // IMP: V15248_32086 + rc = SQLITE_ERROR; + vtab_set_error(pVTab, "'xxx in (...)' is only available on INTEGER or TEXT metadata columns."); + goto done; + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: + case VEC0_METADATA_COLUMN_KIND_TEXT: { + break; + } + } + value = VEC0_METADATA_OPERATOR_IN; + sqlite3_vtab_in(pIdxInfo, i, 1); + }else + #endif + { + value = VEC0_PARTITION_OPERATOR_EQ; + } + break; + } + case SQLITE_INDEX_CONSTRAINT_GT: { + value = VEC0_METADATA_OPERATOR_GT; + break; + } + case SQLITE_INDEX_CONSTRAINT_LE: { + value = VEC0_METADATA_OPERATOR_LE; + break; + } + case SQLITE_INDEX_CONSTRAINT_LT: { + value = VEC0_METADATA_OPERATOR_LT; + break; + } + case SQLITE_INDEX_CONSTRAINT_GE: { + value = VEC0_METADATA_OPERATOR_GE; + break; + } + case SQLITE_INDEX_CONSTRAINT_NE: { + value = VEC0_METADATA_OPERATOR_NE; + break; + } + default: { + // IMP: V16511_00582 + rc = SQLITE_ERROR; + vtab_set_error(pVTab, + "An illegal WHERE constraint was provided on a vec0 metadata column in a KNN query. " + "Only one of EQUALS, GREATER_THAN, LESS_THAN_OR_EQUAL, LESS_THAN, GREATER_THAN_OR_EQUAL, NOT_EQUALS is allowed." + ); + goto done; + } + } + + if(p->metadata_columns[metadata_idx].kind == VEC0_METADATA_COLUMN_KIND_BOOLEAN) { + if(!(value == VEC0_METADATA_OPERATOR_EQ || value == VEC0_METADATA_OPERATOR_NE)) { + // IMP: V10145_26984 + rc = SQLITE_ERROR; + vtab_set_error(pVTab, "ONLY EQUALS (=) or NOT_EQUALS (!=) operators are allowed on boolean metadata columns."); + goto done; + } + } + + pIdxInfo->aConstraintUsage[i].argvIndex = argvIndex++; + pIdxInfo->aConstraintUsage[i].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_METADATA_CONSTRAINT); + sqlite3_str_appendchar(idxStr, 1, 'A' + metadata_idx); + sqlite3_str_appendchar(idxStr, 1, value); + sqlite3_str_appendchar(idxStr, 1, '_'); + + } + + + + pIdxInfo->idxNum = iMatchVectorTerm; + pIdxInfo->estimatedCost = 30.0; + pIdxInfo->estimatedRows = 10; + + } else if (iRowidTerm >= 0) { + sqlite3_str_appendchar(idxStr, 1, VEC0_QUERY_PLAN_POINT); + pIdxInfo->aConstraintUsage[iRowidTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iRowidTerm].omit = 1; + sqlite3_str_appendchar(idxStr, 1, VEC0_IDXSTR_KIND_POINT_ID); + sqlite3_str_appendchar(idxStr, 3, '_'); + pIdxInfo->idxNum = pIdxInfo->colUsed; + pIdxInfo->estimatedCost = 10.0; + pIdxInfo->estimatedRows = 1; + } else { + sqlite3_str_appendchar(idxStr, 1, VEC0_QUERY_PLAN_FULLSCAN); + pIdxInfo->estimatedCost = 3000000.0; + pIdxInfo->estimatedRows = 100000; + } + pIdxInfo->idxStr = sqlite3_str_finish(idxStr); + idxStr = NULL; + if (!pIdxInfo->idxStr) { + rc = SQLITE_OK; + goto done; + } + pIdxInfo->needToFreeIdxStr = 1; + + + rc = SQLITE_OK; + + done: + if(idxStr) { + sqlite3_str_finish(idxStr); + } + return rc; +} + +// forward delcaration bc vec0Filter uses it +static int vec0Next(sqlite3_vtab_cursor *cur); + +void merge_sorted_lists(f32 *a, i64 *a_rowids, i64 a_length, f32 *b, + i64 *b_rowids, i32 *b_top_idxs, i64 b_length, f32 *out, + i64 *out_rowids, i64 out_length, i64 *out_used) { + // assert((a_length >= out_length) || (b_length >= out_length)); + i64 ptrA = 0; + i64 ptrB = 0; + for (int i = 0; i < out_length; i++) { + if ((ptrA >= a_length) && (ptrB >= b_length)) { + *out_used = i; + return; + } + if (ptrA >= a_length) { + out[i] = b[b_top_idxs[ptrB]]; + out_rowids[i] = b_rowids[b_top_idxs[ptrB]]; + ptrB++; + } else if (ptrB >= b_length) { + out[i] = a[ptrA]; + out_rowids[i] = a_rowids[ptrA]; + ptrA++; + } else { + if (a[ptrA] <= b[b_top_idxs[ptrB]]) { + out[i] = a[ptrA]; + out_rowids[i] = a_rowids[ptrA]; + ptrA++; + } else { + out[i] = b[b_top_idxs[ptrB]]; + out_rowids[i] = b_rowids[b_top_idxs[ptrB]]; + ptrB++; + } + } + } + + *out_used = out_length; +} + +u8 *bitmap_new(i32 n) { + assert(n % 8 == 0); + u8 *p = sqlite3_malloc(n * sizeof(u8) / CHAR_BIT); + if (p) { + memset(p, 0, n * sizeof(u8) / CHAR_BIT); + } + return p; +} +u8 *bitmap_new_from(i32 n, u8 *from) { + assert(n % 8 == 0); + u8 *p = sqlite3_malloc(n * sizeof(u8) / CHAR_BIT); + if (p) { + memcpy(p, from, n / CHAR_BIT); + } + return p; +} + +void bitmap_copy(u8 *base, u8 *from, i32 n) { + assert(n % 8 == 0); + memcpy(base, from, n / CHAR_BIT); +} + +void bitmap_and_inplace(u8 *base, u8 *other, i32 n) { + assert((n % 8) == 0); + for (int i = 0; i < n / CHAR_BIT; i++) { + base[i] = base[i] & other[i]; + } +} + +void bitmap_set(u8 *bitmap, i32 position, int value) { + if (value) { + bitmap[position / CHAR_BIT] |= 1 << (position % CHAR_BIT); + } else { + bitmap[position / CHAR_BIT] &= ~(1 << (position % CHAR_BIT)); + } +} + +int bitmap_get(u8 *bitmap, i32 position) { + return (((bitmap[position / CHAR_BIT]) >> (position % CHAR_BIT)) & 1); +} + +void bitmap_clear(u8 *bitmap, i32 n) { + assert((n % 8) == 0); + memset(bitmap, 0, n / CHAR_BIT); +} + +void bitmap_fill(u8 *bitmap, i32 n) { + assert((n % 8) == 0); + memset(bitmap, 0xFF, n / CHAR_BIT); +} + +/** + * @brief Finds the minimum k items in distances, and writes the indicies to + * out. + * + * @param distances input f32 array of size n, the items to consider. + * @param n: size of distances array. + * @param out: Output array of size k, will contain at most k element indicies + * @param k: Size of output array + * @return int + */ +int min_idx(const f32 *distances, i32 n, u8 *candidates, i32 *out, i32 k, + u8 *bTaken, i32 *k_used) { + assert(k > 0); + assert(k <= n); + + bitmap_clear(bTaken, n); + + for (int ik = 0; ik < k; ik++) { + int min_idx = 0; + while (min_idx < n && + (bitmap_get(bTaken, min_idx) || !bitmap_get(candidates, min_idx))) { + min_idx++; + } + if (min_idx >= n) { + *k_used = ik; + return SQLITE_OK; + } + + for (int i = 0; i < n; i++) { + if (distances[i] <= distances[min_idx] && !bitmap_get(bTaken, i) && + (bitmap_get(candidates, i))) { + min_idx = i; + } + } + + out[ik] = min_idx; + bitmap_set(bTaken, min_idx, 1); + } + *k_used = k; + return SQLITE_OK; +} + +int vec0_get_metadata_text_long_value( + vec0_vtab * p, + sqlite3_stmt ** stmt, + int metadata_idx, + i64 rowid, + int *n, + char ** s) { + int rc; + if(!(*stmt)) { + const char * zSql = sqlite3_mprintf("select data from " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " where rowid = ?", p->schemaName, p->tableName, metadata_idx); + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, stmt, NULL); + sqlite3_free( (void *) zSql); + if(rc != SQLITE_OK) { + goto done; + } + } + + sqlite3_reset(*stmt); + sqlite3_bind_int64(*stmt, 1, rowid); + rc = sqlite3_step(*stmt); + if(rc != SQLITE_ROW) { + rc = SQLITE_ERROR; + goto done; + } + *s = (char *) sqlite3_column_text(*stmt, 0); + *n = sqlite3_column_bytes(*stmt, 0); + rc = SQLITE_OK; + done: + return rc; +} + +/** + * @brief Crete at "iterator" (sqlite3_stmt) of chunks with the given constraints + * + * Any VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT values in idxStr/argv will be applied + * as WHERE constraints in the underlying stmt SQL, and any consumer of the stmt + * can freely step through the stmt with all constraints satisfied. + * + * @param p - vec0_vtab + * @param idxStr - the xBestIndex/xFilter idxstr containing VEC0_IDXSTR values + * @param argc - number of argv values from xFilter + * @param argv - array of sqlite3_value from xFilter + * @param outStmt - output sqlite3_stmt of chunks with all filters applied + * @return int SQLITE_OK on success, error code otherwise + */ +int vec0_chunks_iter(vec0_vtab * p, const char * idxStr, int argc, sqlite3_value ** argv, sqlite3_stmt** outStmt) { + // always null terminated, enforced by SQLite + int idxStrLength = strlen(idxStr); + // "1" refers to the initial vec0_query_plan char, 4 is the number of chars per "element" + int numValueEntries = (idxStrLength-1) / 4; + assert(argc == numValueEntries); + + int rc; + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "select chunk_id, validity, rowids " + " from " VEC0_SHADOW_CHUNKS_NAME, + p->schemaName, p->tableName); + + int appendedWhere = 0; + for(int i = 0; i < numValueEntries; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind != VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT) { + continue; + } + + int partition_idx = idxStr[idx + 1] - 'A'; + int operator = idxStr[idx + 2]; + // idxStr[idx + 3] is just null, a '_' placeholder + + if(!appendedWhere) { + sqlite3_str_appendall(s, " WHERE "); + appendedWhere = 1; + }else { + sqlite3_str_appendall(s, " AND "); + } + switch(operator) { + case VEC0_PARTITION_OPERATOR_EQ: + sqlite3_str_appendf(s, " partition%02d = ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_GT: + sqlite3_str_appendf(s, " partition%02d > ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_LE: + sqlite3_str_appendf(s, " partition%02d <= ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_LT: + sqlite3_str_appendf(s, " partition%02d < ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_GE: + sqlite3_str_appendf(s, " partition%02d >= ? ", partition_idx); + break; + case VEC0_PARTITION_OPERATOR_NE: + sqlite3_str_appendf(s, " partition%02d != ? ", partition_idx); + break; + default: { + char * zSql = sqlite3_str_finish(s); + sqlite3_free(zSql); + return SQLITE_ERROR; + } + + } + + } + + char *zSql = sqlite3_str_finish(s); + if (!zSql) { + return SQLITE_NOMEM; + } + + rc = sqlite3_prepare_v2(p->db, zSql, -1, outStmt, NULL); + sqlite3_free(zSql); + if(rc != SQLITE_OK) { + return rc; + } + + int n = 1; + for(int i = 0; i < numValueEntries; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind != VEC0_IDXSTR_KIND_KNN_PARTITON_CONSTRAINT) { + continue; + } + sqlite3_bind_value(*outStmt, n++, argv[i]); + } + + return rc; +} + +// a single `xxx in (...)` constraint on a metadata column. TEXT or INTEGER only for now. +struct Vec0MetadataIn{ + // index of argv[i]` the constraint is on + int argv_idx; + // metadata column index of the constraint, derived from idxStr + argv_idx + int metadata_idx; + // array of the copied `(...)` values from sqlite3_vtab_in_first()/sqlite3_vtab_in_next() + struct Array array; +}; + +// Array elements for `xxx in (...)` values for a text column. basically just a string +struct Vec0MetadataInTextEntry { + int n; + char * zString; +}; + + +int vec0_metadata_filter_text(vec0_vtab * p, sqlite3_value * value, const void * buffer, int size, vec0_metadata_operator op, u8* b, int metadata_idx, int chunk_rowid, struct Array * aMetadataIn, int argv_idx) { + int rc; + sqlite3_stmt * stmt = NULL; + i64 * rowids = NULL; + sqlite3_blob * rowidsBlob; + const char * sTarget = (const char *) sqlite3_value_text(value); + int nTarget = sqlite3_value_bytes(value); + + + // TODO(perf): only text metadata news the rowids BLOB. Make it so that + // rowids BLOB is re-used when multiple fitlers on text columns, + // ex "name BETWEEN 'a' and 'b'"" + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "rowids", chunk_rowid, 0, &rowidsBlob); + if(rc != SQLITE_OK) { + return rc; + } + assert(sqlite3_blob_bytes(rowidsBlob) % sizeof(i64) == 0); + assert((sqlite3_blob_bytes(rowidsBlob) / sizeof(i64)) == size); + + rowids = sqlite3_malloc(sqlite3_blob_bytes(rowidsBlob)); + if(!rowids) { + sqlite3_blob_close(rowidsBlob); + return SQLITE_NOMEM; + } + + rc = sqlite3_blob_read(rowidsBlob, rowids, sqlite3_blob_bytes(rowidsBlob), 0); + if(rc != SQLITE_OK) { + sqlite3_blob_close(rowidsBlob); + return rc; + } + sqlite3_blob_close(rowidsBlob); + + switch(op) { + int nPrefix; + char * sPrefix; + char *sFull; + int nFull; + u8 * view; + case VEC0_METADATA_OPERATOR_EQ: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + + // for EQ the text lengths must match + if(nPrefix != nTarget) { + bitmap_set(b, i, 0); + continue; + } + int cmpPrefix = strncmp(sPrefix, sTarget, min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)); + + // for short strings, use the prefix comparison direclty + if(nPrefix <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + bitmap_set(b, i, cmpPrefix == 0); + continue; + } + // for EQ on longs strings, the prefix must match + if(cmpPrefix) { + bitmap_set(b, i, 0); + continue; + } + // consult the full string + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) == 0); + } + break; + } + case VEC0_METADATA_OPERATOR_NE: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + + // for NE if text lengths dont match, it never will + if(nPrefix != nTarget) { + bitmap_set(b, i, 1); + continue; + } + + int cmpPrefix = strncmp(sPrefix, sTarget, min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)); + + // for short strings, use the prefix comparison direclty + if(nPrefix <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + bitmap_set(b, i, cmpPrefix != 0); + continue; + } + // for NE on longs strings, if prefixes dont match, then long string wont + if(cmpPrefix) { + bitmap_set(b, i, 1); + continue; + } + // consult the full string + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) != 0); + } + break; + } + case VEC0_METADATA_OPERATOR_GT: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix > nTarget); + } + else { + bitmap_set(b, i, cmpPrefix > 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) > 0); + } + break; + } + case VEC0_METADATA_OPERATOR_GE: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix >= nTarget); + } + else { + bitmap_set(b, i, cmpPrefix >= 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) >= 0); + } + break; + } + case VEC0_METADATA_OPERATOR_LE: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix <= nTarget); + } + else { + bitmap_set(b, i, cmpPrefix <= 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) <= 0); + } + break; + } + case VEC0_METADATA_OPERATOR_LT: { + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + int cmpPrefix = strncmp(sPrefix, sTarget, min(min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH), nTarget)); + + if(nPrefix < VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + // if prefix match, check which is longer + if(cmpPrefix == 0) { + bitmap_set(b, i, nPrefix < nTarget); + } + else { + bitmap_set(b, i, cmpPrefix < 0); + } + continue; + } + // TODO(perf): may not need to compare full text in some cases + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + bitmap_set(b, i, strncmp(sFull, sTarget, nFull) < 0); + } + break; + } + + case VEC0_METADATA_OPERATOR_IN: { + size_t metadataInIdx = -1; + for(size_t i = 0; i < aMetadataIn->length; i++) { + struct Vec0MetadataIn * metadataIn = &(((struct Vec0MetadataIn *) aMetadataIn->z)[i]); + if(metadataIn->argv_idx == argv_idx) { + metadataInIdx = i; + break; + } + } + if(metadataInIdx < 0) { + rc = SQLITE_ERROR; + goto done; + } + + struct Vec0MetadataIn * metadataIn = &((struct Vec0MetadataIn *) aMetadataIn->z)[metadataInIdx]; + struct Array * aTarget = &(metadataIn->array); + + + int nPrefix; + char * sPrefix; + char *sFull; + int nFull; + u8 * view; + for(int i = 0; i < size; i++) { + view = &((u8*) buffer)[i * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + nPrefix = ((int*) view)[0]; + sPrefix = (char *) &view[4]; + for(size_t target_idx = 0; target_idx < aTarget->length; target_idx++) { + struct Vec0MetadataInTextEntry * entry = &(((struct Vec0MetadataInTextEntry*)aTarget->z)[target_idx]); + if(entry->n != nPrefix) { + continue; + } + int cmpPrefix = strncmp(sPrefix, entry->zString, min(nPrefix, VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)); + if(nPrefix <= VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + if(cmpPrefix == 0) { + bitmap_set(b, i, 1); + break; + } + continue; + } + if(cmpPrefix) { + continue; + } + + rc = vec0_get_metadata_text_long_value(p, &stmt, metadata_idx, rowids[i], &nFull, &sFull); + if(rc != SQLITE_OK) { + goto done; + } + if(nPrefix != nFull) { + rc = SQLITE_ERROR; + goto done; + } + if(strncmp(sFull, entry->zString, nFull) == 0) { + bitmap_set(b, i, 1); + break; + } + } + } + break; + } + + } + rc = SQLITE_OK; + + done: + sqlite3_finalize(stmt); + sqlite3_free(rowids); + return rc; + +} + +/** + * @brief Fill in bitmap of chunk values, whether or not the values match a metadata constraint + * + * @param p vec0_vtab + * @param metadata_idx index of the metatadata column to perfrom constraints on + * @param value sqlite3_value of the constraints value + * @param blob sqlite3_blob that is already opened on the metdata column's shadow chunk table + * @param chunk_rowid rowid of the chunk to calculate on + * @param b pre-allocated and zero'd out bitmap to write results to + * @param size size of the chunk + * @return int SQLITE_OK on success, error code otherwise + */ +int vec0_set_metadata_filter_bitmap( + vec0_vtab *p, + int metadata_idx, + vec0_metadata_operator op, + sqlite3_value * value, + sqlite3_blob * blob, + i64 chunk_rowid, + u8* b, + int size, + struct Array * aMetadataIn, int argv_idx) { + // TODO: shouldn't this skip in-valid entries from the chunk's validity bitmap? + + int rc; + rc = sqlite3_blob_reopen(blob, chunk_rowid); + if(rc != SQLITE_OK) { + return rc; + } + + vec0_metadata_column_kind kind = p->metadata_columns[metadata_idx].kind; + int szMatch = 0; + int blobSize = sqlite3_blob_bytes(blob); + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + szMatch = blobSize == size / CHAR_BIT; + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + szMatch = blobSize == size * sizeof(i64); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + szMatch = blobSize == size * sizeof(double); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + szMatch = blobSize == size * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH; + break; + } + } + if(!szMatch) { + return SQLITE_ERROR; + } + void * buffer = sqlite3_malloc(blobSize); + if(!buffer) { + return SQLITE_NOMEM; + } + rc = sqlite3_blob_read(blob, buffer, blobSize, 0); + if(rc != SQLITE_OK) { + goto done; + } + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + int target = sqlite3_value_int(value); + if( (target && op == VEC0_METADATA_OPERATOR_EQ) || (!target && op == VEC0_METADATA_OPERATOR_NE)) { + for(int i = 0; i < size; i++) { bitmap_set(b, i, bitmap_get((u8*) buffer, i)); } + } + else { + for(int i = 0; i < size; i++) { bitmap_set(b, i, !bitmap_get((u8*) buffer, i)); } + } + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 * array = (i64*) buffer; + i64 target = sqlite3_value_int64(value); + switch(op) { + case VEC0_METADATA_OPERATOR_EQ: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] == target); } + break; + } + case VEC0_METADATA_OPERATOR_GT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] > target); } + break; + } + case VEC0_METADATA_OPERATOR_LE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] <= target); } + break; + } + case VEC0_METADATA_OPERATOR_LT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] < target); } + break; + } + case VEC0_METADATA_OPERATOR_GE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] >= target); } + break; + } + case VEC0_METADATA_OPERATOR_NE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] != target); } + break; + } + case VEC0_METADATA_OPERATOR_IN: { + int metadataInIdx = -1; + for(size_t i = 0; i < aMetadataIn->length; i++) { + struct Vec0MetadataIn * metadataIn = &((struct Vec0MetadataIn *) aMetadataIn->z)[i]; + if(metadataIn->argv_idx == argv_idx) { + metadataInIdx = i; + break; + } + } + if(metadataInIdx < 0) { + rc = SQLITE_ERROR; + goto done; + } + struct Vec0MetadataIn * metadataIn = &((struct Vec0MetadataIn *) aMetadataIn->z)[metadataInIdx]; + struct Array * aTarget = &(metadataIn->array); + + for(int i = 0; i < size; i++) { + for(size_t target_idx = 0; target_idx < aTarget->length; target_idx++) { + if( ((i64*)aTarget->z)[target_idx] == array[i]) { + bitmap_set(b, i, 1); + break; + } + } + } + break; + } + } + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double * array = (double*) buffer; + double target = sqlite3_value_double(value); + switch(op) { + case VEC0_METADATA_OPERATOR_EQ: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] == target); } + break; + } + case VEC0_METADATA_OPERATOR_GT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] > target); } + break; + } + case VEC0_METADATA_OPERATOR_LE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] <= target); } + break; + } + case VEC0_METADATA_OPERATOR_LT: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] < target); } + break; + } + case VEC0_METADATA_OPERATOR_GE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] >= target); } + break; + } + case VEC0_METADATA_OPERATOR_NE: { + for(int i = 0; i < size; i++) { bitmap_set(b, i, array[i] != target); } + break; + } + case VEC0_METADATA_OPERATOR_IN: { + // should never be reached + break; + } + } + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + rc = vec0_metadata_filter_text(p, value, buffer, size, op, b, metadata_idx, chunk_rowid, aMetadataIn, argv_idx); + if(rc != SQLITE_OK) { + goto done; + } + break; + } + } + done: + sqlite3_free(buffer); + return rc; +} + +int vec0Filter_knn_chunks_iter(vec0_vtab *p, sqlite3_stmt *stmtChunks, + struct VectorColumnDefinition *vector_column, + int vectorColumnIdx, struct Array *arrayRowidsIn, + struct Array * aMetadataIn, + const char * idxStr, int argc, sqlite3_value ** argv, + void *queryVector, i64 k, i64 **out_topk_rowids, + f32 **out_topk_distances, i64 *out_used) { + // for each chunk, get top min(k, chunk_size) rowid + distances to query vec. + // then reconcile all topk_chunks for a true top k. + // output only rowids + distances for now + + int rc = SQLITE_OK; + sqlite3_blob *blobVectors = NULL; + + void *baseVectors = NULL; // memory: chunk_size * dimensions * element_size + + // OWNED BY CALLER ON SUCCESS + i64 *topk_rowids = NULL; // memory: k * 4 + // OWNED BY CALLER ON SUCCESS + f32 *topk_distances = NULL; // memory: k * 4 + + i64 *tmp_topk_rowids = NULL; // memory: k * 4 + f32 *tmp_topk_distances = NULL; // memory: k * 4 + f32 *chunk_distances = NULL; // memory: chunk_size * 4 + u8 *b = NULL; // memory: chunk_size / 8 + u8 *bTaken = NULL; // memory: chunk_size / 8 + i32 *chunk_topk_idxs = NULL; // memory: k * 4 + u8 *bmRowids = NULL; // memory: chunk_size / 8 + u8 *bmMetadata = NULL; // memory: chunk_size / 8 + // // total: a lot??? + + // 6 * (k * 4) + (k * 2) + (chunk_size / 8) + (chunk_size * dimensions * 4) + + topk_rowids = sqlite3_malloc(k * sizeof(i64)); + if (!topk_rowids) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(topk_rowids, 0, k * sizeof(i64)); + + topk_distances = sqlite3_malloc(k * sizeof(f32)); + if (!topk_distances) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(topk_distances, 0, k * sizeof(f32)); + + tmp_topk_rowids = sqlite3_malloc(k * sizeof(i64)); + if (!tmp_topk_rowids) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(tmp_topk_rowids, 0, k * sizeof(i64)); + + tmp_topk_distances = sqlite3_malloc(k * sizeof(f32)); + if (!tmp_topk_distances) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(tmp_topk_distances, 0, k * sizeof(f32)); + + i64 k_used = 0; + i64 baseVectorsSize = p->chunk_size * vector_column_byte_size(*vector_column); + baseVectors = sqlite3_malloc(baseVectorsSize); + if (!baseVectors) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + chunk_distances = sqlite3_malloc(p->chunk_size * sizeof(f32)); + if (!chunk_distances) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + b = bitmap_new(p->chunk_size); + if (!b) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + bTaken = bitmap_new(p->chunk_size); + if (!bTaken) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + chunk_topk_idxs = sqlite3_malloc(k * sizeof(i32)); + if (!chunk_topk_idxs) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + bmRowids = arrayRowidsIn ? bitmap_new(p->chunk_size) : NULL; + if (arrayRowidsIn && !bmRowids) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + sqlite3_blob * metadataBlobs[VEC0_MAX_METADATA_COLUMNS]; + memset(metadataBlobs, 0, sizeof(sqlite3_blob*) * VEC0_MAX_METADATA_COLUMNS); + + bmMetadata = bitmap_new(p->chunk_size); + if(!bmMetadata) { + rc = SQLITE_NOMEM; + goto cleanup; + } + + int idxStrLength = strlen(idxStr); + int numValueEntries = (idxStrLength-1) / 4; + assert(numValueEntries == argc); + int hasMetadataFilters = 0; + for(int i = 0; i < argc; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind == VEC0_IDXSTR_KIND_METADATA_CONSTRAINT) { + hasMetadataFilters = 1; + break; + } + } + + while (true) { + rc = sqlite3_step(stmtChunks); + if (rc == SQLITE_DONE) { + break; + } + if (rc != SQLITE_ROW) { + vtab_set_error(&p->base, "chunks iter error"); + rc = SQLITE_ERROR; + goto cleanup; + } + memset(chunk_distances, 0, p->chunk_size * sizeof(f32)); + memset(chunk_topk_idxs, 0, k * sizeof(i32)); + bitmap_clear(b, p->chunk_size); + + i64 chunk_id = sqlite3_column_int64(stmtChunks, 0); + unsigned char *chunkValidity = + (unsigned char *)sqlite3_column_blob(stmtChunks, 1); + i64 validitySize = sqlite3_column_bytes(stmtChunks, 1); + if (validitySize != p->chunk_size / CHAR_BIT) { + // IMP: V05271_22109 + vtab_set_error( + &p->base, + "chunk validity size doesn't match - expected %lld, found %lld", + p->chunk_size / CHAR_BIT, validitySize); + rc = SQLITE_ERROR; + goto cleanup; + } + + i64 *chunkRowids = (i64 *)sqlite3_column_blob(stmtChunks, 2); + i64 rowidsSize = sqlite3_column_bytes(stmtChunks, 2); + if (rowidsSize != p->chunk_size * sizeof(i64)) { + // IMP: V02796_19635 + vtab_set_error(&p->base, "rowids size doesn't match"); + vtab_set_error( + &p->base, + "chunk rowids size doesn't match - expected %lld, found %lld", + p->chunk_size * sizeof(i64), rowidsSize); + rc = SQLITE_ERROR; + goto cleanup; + } + + // open the vector chunk blob for the current chunk + rc = sqlite3_blob_open(p->db, p->schemaName, + p->shadowVectorChunksNames[vectorColumnIdx], + "vectors", chunk_id, 0, &blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "could not open vectors blob for chunk %lld", + chunk_id); + rc = SQLITE_ERROR; + goto cleanup; + } + + i64 currentBaseVectorsSize = sqlite3_blob_bytes(blobVectors); + i64 expectedBaseVectorsSize = + p->chunk_size * vector_column_byte_size(*vector_column); + if (currentBaseVectorsSize != expectedBaseVectorsSize) { + // IMP: V16465_00535 + vtab_set_error( + &p->base, + "vectors blob size doesn't match - expected %lld, found %lld", + expectedBaseVectorsSize, currentBaseVectorsSize); + rc = SQLITE_ERROR; + goto cleanup; + } + rc = sqlite3_blob_read(blobVectors, baseVectors, currentBaseVectorsSize, 0); + + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "vectors blob read error for %lld", chunk_id); + rc = SQLITE_ERROR; + goto cleanup; + } + + bitmap_copy(b, chunkValidity, p->chunk_size); + if (arrayRowidsIn) { + bitmap_clear(bmRowids, p->chunk_size); + + for (int i = 0; i < p->chunk_size; i++) { + if (!bitmap_get(chunkValidity, i)) { + continue; + } + i64 rowid = chunkRowids[i]; + void *in = bsearch(&rowid, arrayRowidsIn->z, arrayRowidsIn->length, + sizeof(i64), _cmp); + bitmap_set(bmRowids, i, in ? 1 : 0); + } + bitmap_and_inplace(b, bmRowids, p->chunk_size); + } + + if(hasMetadataFilters) { + for(int i = 0; i < argc; i++) { + int idx = 1 + (i * 4); + char kind = idxStr[idx + 0]; + if(kind != VEC0_IDXSTR_KIND_METADATA_CONSTRAINT) { + continue; + } + int metadata_idx = idxStr[idx + 1] - 'A'; + int operator = idxStr[idx + 2]; + + if(!metadataBlobs[metadata_idx]) { + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 0, &metadataBlobs[metadata_idx]); + vtab_set_error(&p->base, "Could not open metadata blob"); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + + bitmap_clear(bmMetadata, p->chunk_size); + rc = vec0_set_metadata_filter_bitmap(p, metadata_idx, operator, argv[i], metadataBlobs[metadata_idx], chunk_id, bmMetadata, p->chunk_size, aMetadataIn, i); + if(rc != SQLITE_OK) { + vtab_set_error(&p->base, "Could not filter metadata fields"); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + bitmap_and_inplace(b, bmMetadata, p->chunk_size); + } + } + + + for (int i = 0; i < p->chunk_size; i++) { + if (!bitmap_get(b, i)) { + continue; + }; + + f32 result; + switch (vector_column->element_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: { + const f32 *base_i = + ((f32 *)baseVectors) + (i * vector_column->dimensions); + switch (vector_column->distance_metric) { + case VEC0_DISTANCE_METRIC_L2: { + result = distance_l2_sqr_float(base_i, (f32 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_L1: { + result = distance_l1_f32(base_i, (f32 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_COSINE: { + result = distance_cosine_float(base_i, (f32 *)queryVector, + &vector_column->dimensions); + break; + } + } + break; + } + case SQLITE_VEC_ELEMENT_TYPE_INT8: { + const i8 *base_i = + ((i8 *)baseVectors) + (i * vector_column->dimensions); + switch (vector_column->distance_metric) { + case VEC0_DISTANCE_METRIC_L2: { + result = distance_l2_sqr_int8(base_i, (i8 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_L1: { + result = distance_l1_int8(base_i, (i8 *)queryVector, + &vector_column->dimensions); + break; + } + case VEC0_DISTANCE_METRIC_COSINE: { + result = distance_cosine_int8(base_i, (i8 *)queryVector, + &vector_column->dimensions); + break; + } + } + + break; + } + case SQLITE_VEC_ELEMENT_TYPE_BIT: { + const u8 *base_i = + ((u8 *)baseVectors) + (i * (vector_column->dimensions / CHAR_BIT)); + result = distance_hamming(base_i, (u8 *)queryVector, + &vector_column->dimensions); + break; + } + } + + chunk_distances[i] = result; + } + + int used1; + min_idx(chunk_distances, p->chunk_size, b, chunk_topk_idxs, + min(k, p->chunk_size), bTaken, &used1); + + i64 used; + merge_sorted_lists(topk_distances, topk_rowids, k_used, chunk_distances, + chunkRowids, chunk_topk_idxs, + min(min(k, p->chunk_size), used1), tmp_topk_distances, + tmp_topk_rowids, k, &used); + + for (int i = 0; i < used; i++) { + topk_rowids[i] = tmp_topk_rowids[i]; + topk_distances[i] = tmp_topk_distances[i]; + } + k_used = used; + // blobVectors is always opened with read-only permissions, so this never + // fails. + sqlite3_blob_close(blobVectors); + blobVectors = NULL; + } + + *out_topk_rowids = topk_rowids; + *out_topk_distances = topk_distances; + *out_used = k_used; + rc = SQLITE_OK; + +cleanup: + if (rc != SQLITE_OK) { + sqlite3_free(topk_rowids); + sqlite3_free(topk_distances); + } + sqlite3_free(chunk_topk_idxs); + sqlite3_free(tmp_topk_rowids); + sqlite3_free(tmp_topk_distances); + sqlite3_free(b); + sqlite3_free(bTaken); + sqlite3_free(bmRowids); + sqlite3_free(baseVectors); + sqlite3_free(chunk_distances); + sqlite3_free(bmMetadata); + for(int i = 0; i < VEC0_MAX_METADATA_COLUMNS; i++) { + sqlite3_blob_close(metadataBlobs[i]); + } + // blobVectors is always opened with read-only permissions, so this never + // fails. + sqlite3_blob_close(blobVectors); + return rc; +} + +int vec0Filter_knn(vec0_cursor *pCur, vec0_vtab *p, int idxNum, + const char *idxStr, int argc, sqlite3_value **argv) { + assert(argc == (strlen(idxStr)-1) / 4); + int rc; + struct vec0_query_knn_data *knn_data; + + int vectorColumnIdx = idxNum; + struct VectorColumnDefinition *vector_column = + &p->vector_columns[vectorColumnIdx]; + + struct Array *arrayRowidsIn = NULL; + sqlite3_stmt *stmtChunks = NULL; + void *queryVector; + size_t dimensions; + enum VectorElementType elementType; + vector_cleanup queryVectorCleanup = vector_cleanup_noop; + char *pzError; + knn_data = sqlite3_malloc(sizeof(*knn_data)); + if (!knn_data) { + return SQLITE_NOMEM; + } + memset(knn_data, 0, sizeof(*knn_data)); + // array of `struct Vec0MetadataIn`, IF there are any `xxx in (...)` metadata constraints + struct Array * aMetadataIn = NULL; + + int query_idx =-1; + int k_idx = -1; + int rowid_in_idx = -1; + for(int i = 0; i < argc; i++) { + if(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_KNN_MATCH) { + query_idx = i; + } + if(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_KNN_K) { + k_idx = i; + } + if(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_KNN_ROWID_IN) { + rowid_in_idx = i; + } + } + assert(query_idx >= 0); + assert(k_idx >= 0); + + // make sure the query vector matches the vector column (type dimensions etc.) + rc = vector_from_value(argv[query_idx], &queryVector, &dimensions, &elementType, + &queryVectorCleanup, &pzError); + + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + "Query vector on the \"%.*s\" column is invalid: %z", + vector_column->name_length, vector_column->name, pzError); + rc = SQLITE_ERROR; + goto cleanup; + } + if (elementType != vector_column->element_type) { + vtab_set_error( + &p->base, + "Query vector for the \"%.*s\" column is expected to be of type " + "%s, but a %s vector was provided.", + vector_column->name_length, vector_column->name, + vector_subtype_name(vector_column->element_type), + vector_subtype_name(elementType)); + rc = SQLITE_ERROR; + goto cleanup; + } + if (dimensions != vector_column->dimensions) { + vtab_set_error( + &p->base, + "Dimension mismatch for query vector for the \"%.*s\" column. " + "Expected %d dimensions but received %d.", + vector_column->name_length, vector_column->name, + vector_column->dimensions, dimensions); + rc = SQLITE_ERROR; + goto cleanup; + } + + i64 k = sqlite3_value_int64(argv[k_idx]); + if (k < 0) { + vtab_set_error( + &p->base, "k value in knn queries must be greater than or equal to 0."); + rc = SQLITE_ERROR; + goto cleanup; + } +#define SQLITE_VEC_VEC0_K_MAX 4096 + if (k > SQLITE_VEC_VEC0_K_MAX) { + vtab_set_error( + &p->base, + "k value in knn query too large, provided %lld and the limit is %lld", + k, SQLITE_VEC_VEC0_K_MAX); + rc = SQLITE_ERROR; + goto cleanup; + } + + if (k == 0) { + knn_data->k = 0; + pCur->knn_data = knn_data; + pCur->query_plan = VEC0_QUERY_PLAN_KNN; + rc = SQLITE_OK; + goto cleanup; + } + +// handle when a `rowid in (...)` operation was provided +// Array of all the rowids that appear in any `rowid in (...)` constraint. +// NULL if none were provided, which means a "full" scan. +#if COMPILER_SUPPORTS_VTAB_IN + if (rowid_in_idx >= 0) { + sqlite3_value *item; + int rc; + arrayRowidsIn = sqlite3_malloc(sizeof(*arrayRowidsIn)); + if (!arrayRowidsIn) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(arrayRowidsIn, 0, sizeof(*arrayRowidsIn)); + + rc = array_init(arrayRowidsIn, sizeof(i64), 32); + if (rc != SQLITE_OK) { + goto cleanup; + } + for (rc = sqlite3_vtab_in_first(argv[rowid_in_idx], &item); rc == SQLITE_OK && item; + rc = sqlite3_vtab_in_next(argv[rowid_in_idx], &item)) { + i64 rowid; + if (p->pkIsText) { + rc = vec0_rowid_from_id(p, item, &rowid); + if (rc != SQLITE_OK) { + goto cleanup; + } + } else { + rowid = sqlite3_value_int64(item); + } + rc = array_append(arrayRowidsIn, &rowid); + if (rc != SQLITE_OK) { + goto cleanup; + } + } + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, "error processing rowid in (...) array"); + goto cleanup; + } + qsort(arrayRowidsIn->z, arrayRowidsIn->length, arrayRowidsIn->element_size, + _cmp); + } +#endif + + #if COMPILER_SUPPORTS_VTAB_IN + for(int i = 0; i < argc; i++) { + if(!(idxStr[1 + (i*4)] == VEC0_IDXSTR_KIND_METADATA_CONSTRAINT && idxStr[1 + (i*4) + 2] == VEC0_METADATA_OPERATOR_IN)) { + continue; + } + int metadata_idx = idxStr[1 + (i*4) + 1] - 'A'; + if(!aMetadataIn) { + aMetadataIn = sqlite3_malloc(sizeof(*aMetadataIn)); + if(!aMetadataIn) { + rc = SQLITE_NOMEM; + goto cleanup; + } + memset(aMetadataIn, 0, sizeof(*aMetadataIn)); + rc = array_init(aMetadataIn, sizeof(struct Vec0MetadataIn), 8); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + + struct Vec0MetadataIn item; + memset(&item, 0, sizeof(item)); + item.metadata_idx=metadata_idx; + item.argv_idx = i; + + switch(p->metadata_columns[metadata_idx].kind) { + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + rc = array_init(&item.array, sizeof(i64), 16); + if(rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_value *entry; + for (rc = sqlite3_vtab_in_first(argv[i], &entry); rc == SQLITE_OK && entry; rc = sqlite3_vtab_in_next(argv[i], &entry)) { + i64 v = sqlite3_value_int64(entry); + rc = array_append(&item.array, &v); + if (rc != SQLITE_OK) { + goto cleanup; + } + } + + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, "Error fetching next value in `x in (...)` integer expression"); + goto cleanup; + } + + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + rc = array_init(&item.array, sizeof(struct Vec0MetadataInTextEntry), 16); + if(rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_value *entry; + for (rc = sqlite3_vtab_in_first(argv[i], &entry); rc == SQLITE_OK && entry; rc = sqlite3_vtab_in_next(argv[i], &entry)) { + const char * s = (const char *) sqlite3_value_text(entry); + int n = sqlite3_value_bytes(entry); + + struct Vec0MetadataInTextEntry entry; + entry.zString = sqlite3_mprintf("%.*s", n, s); + if(!entry.zString) { + rc = SQLITE_NOMEM; + goto cleanup; + } + entry.n = n; + rc = array_append(&item.array, &entry); + if (rc != SQLITE_OK) { + goto cleanup; + } + } + + if (rc != SQLITE_DONE) { + vtab_set_error(&p->base, "Error fetching next value in `x in (...)` text expression"); + goto cleanup; + } + + break; + } + default: { + vtab_set_error(&p->base, "Internal sqlite-vec error"); + goto cleanup; + } + } + + rc = array_append(aMetadataIn, &item); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + #endif + + rc = vec0_chunks_iter(p, idxStr, argc, argv, &stmtChunks); + if (rc != SQLITE_OK) { + // IMP: V06942_23781 + vtab_set_error(&p->base, "Error preparing stmtChunk: %s", + sqlite3_errmsg(p->db)); + goto cleanup; + } + + i64 *topk_rowids = NULL; + f32 *topk_distances = NULL; + i64 k_used = 0; + rc = vec0Filter_knn_chunks_iter(p, stmtChunks, vector_column, vectorColumnIdx, + arrayRowidsIn, aMetadataIn, idxStr, argc, argv, queryVector, k, &topk_rowids, + &topk_distances, &k_used); + if (rc != SQLITE_OK) { + goto cleanup; + } + + knn_data->current_idx = 0; + knn_data->k = k; + knn_data->rowids = topk_rowids; + knn_data->distances = topk_distances; + knn_data->k_used = k_used; + + pCur->knn_data = knn_data; + pCur->query_plan = VEC0_QUERY_PLAN_KNN; + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmtChunks); + array_cleanup(arrayRowidsIn); + sqlite3_free(arrayRowidsIn); + queryVectorCleanup(queryVector); + if(aMetadataIn) { + for(size_t i = 0; i < aMetadataIn->length; i++) { + struct Vec0MetadataIn* item = &((struct Vec0MetadataIn *) aMetadataIn->z)[i]; + for(size_t j = 0; j < item->array.length; j++) { + if(p->metadata_columns[item->metadata_idx].kind == VEC0_METADATA_COLUMN_KIND_TEXT) { + struct Vec0MetadataInTextEntry entry = ((struct Vec0MetadataInTextEntry*)item->array.z)[j]; + sqlite3_free(entry.zString); + } + } + array_cleanup(&item->array); + } + array_cleanup(aMetadataIn); + } + + sqlite3_free(aMetadataIn); + + return rc; +} + +int vec0Filter_fullscan(vec0_vtab *p, vec0_cursor *pCur) { + int rc; + char *zSql; + struct vec0_query_fullscan_data *fullscan_data; + + fullscan_data = sqlite3_malloc(sizeof(*fullscan_data)); + if (!fullscan_data) { + return SQLITE_NOMEM; + } + memset(fullscan_data, 0, sizeof(*fullscan_data)); + + zSql = sqlite3_mprintf(" SELECT rowid " + " FROM " VEC0_SHADOW_ROWIDS_NAME + " ORDER by chunk_id, chunk_offset ", + p->schemaName, p->tableName); + if (!zSql) { + rc = SQLITE_NOMEM; + goto error; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &fullscan_data->rowids_stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + // IMP: V09901_26739 + vtab_set_error(&p->base, "Error preparing rowid scan: %s", + sqlite3_errmsg(p->db)); + goto error; + } + + rc = sqlite3_step(fullscan_data->rowids_stmt); + + // DONE when there's no rowids, ROW when there are, both "success" + if (!(rc == SQLITE_ROW || rc == SQLITE_DONE)) { + goto error; + } + + fullscan_data->done = rc == SQLITE_DONE; + pCur->query_plan = VEC0_QUERY_PLAN_FULLSCAN; + pCur->fullscan_data = fullscan_data; + return SQLITE_OK; + +error: + vec0_query_fullscan_data_clear(fullscan_data); + sqlite3_free(fullscan_data); + return rc; +} + +int vec0Filter_point(vec0_cursor *pCur, vec0_vtab *p, int argc, + sqlite3_value **argv) { + int rc; + assert(argc == 1); + i64 rowid; + struct vec0_query_point_data *point_data = NULL; + + point_data = sqlite3_malloc(sizeof(*point_data)); + if (!point_data) { + rc = SQLITE_NOMEM; + goto error; + } + memset(point_data, 0, sizeof(*point_data)); + + if (p->pkIsText) { + rc = vec0_rowid_from_id(p, argv[0], &rowid); + if (rc == SQLITE_EMPTY) { + goto eof; + } + if (rc != SQLITE_OK) { + goto error; + } + } else { + rowid = sqlite3_value_int64(argv[0]); + } + + for (int i = 0; i < p->numVectorColumns; i++) { + rc = vec0_get_vector_data(p, rowid, i, &point_data->vectors[i], NULL); + if (rc == SQLITE_EMPTY) { + goto eof; + } + if (rc != SQLITE_OK) { + goto error; + } + } + + point_data->rowid = rowid; + point_data->done = 0; + pCur->point_data = point_data; + pCur->query_plan = VEC0_QUERY_PLAN_POINT; + return SQLITE_OK; + +eof: + point_data->rowid = rowid; + point_data->done = 1; + pCur->point_data = point_data; + pCur->query_plan = VEC0_QUERY_PLAN_POINT; + return SQLITE_OK; + +error: + vec0_query_point_data_clear(point_data); + sqlite3_free(point_data); + return rc; +} + +static int vec0Filter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, sqlite3_value **argv) { + vec0_vtab *p = (vec0_vtab *)pVtabCursor->pVtab; + vec0_cursor *pCur = (vec0_cursor *)pVtabCursor; + vec0_cursor_clear(pCur); + + int idxStrLength = strlen(idxStr); + if(idxStrLength <= 0) { + return SQLITE_ERROR; + } + if((idxStrLength-1) % 4 != 0) { + return SQLITE_ERROR; + } + int numValueEntries = (idxStrLength-1) / 4; + if(numValueEntries != argc) { + return SQLITE_ERROR; + } + + char query_plan = idxStr[0]; + switch(query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: + return vec0Filter_fullscan(p, pCur); + case VEC0_QUERY_PLAN_KNN: + return vec0Filter_knn(pCur, p, idxNum, idxStr, argc, argv); + case VEC0_QUERY_PLAN_POINT: + return vec0Filter_point(pCur, p, argc, argv); + default: + vtab_set_error(pVtabCursor->pVtab, "unknown idxStr '%s'", idxStr); + return SQLITE_ERROR; + } +} + +static int vec0Rowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid) { + vec0_cursor *pCur = (vec0_cursor *)cur; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + *pRowid = sqlite3_column_int64(pCur->fullscan_data->rowids_stmt, 0); + return SQLITE_OK; + } + case VEC0_QUERY_PLAN_POINT: { + *pRowid = pCur->point_data->rowid; + return SQLITE_OK; + } + case VEC0_QUERY_PLAN_KNN: { + vtab_set_error(cur->pVtab, + "Internal sqlite-vec error: expected point query plan in " + "vec0Rowid, found %d", + pCur->query_plan); + return SQLITE_ERROR; + } + } + return SQLITE_ERROR; +} + +static int vec0Next(sqlite3_vtab_cursor *cur) { + vec0_cursor *pCur = (vec0_cursor *)cur; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + if (!pCur->fullscan_data) { + return SQLITE_ERROR; + } + int rc = sqlite3_step(pCur->fullscan_data->rowids_stmt); + if (rc == SQLITE_DONE) { + pCur->fullscan_data->done = 1; + return SQLITE_OK; + } + if (rc == SQLITE_ROW) { + return SQLITE_OK; + } + return SQLITE_ERROR; + } + case VEC0_QUERY_PLAN_KNN: { + if (!pCur->knn_data) { + return SQLITE_ERROR; + } + + pCur->knn_data->current_idx++; + return SQLITE_OK; + } + case VEC0_QUERY_PLAN_POINT: { + if (!pCur->point_data) { + return SQLITE_ERROR; + } + pCur->point_data->done = 1; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static int vec0Eof(sqlite3_vtab_cursor *cur) { + vec0_cursor *pCur = (vec0_cursor *)cur; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + if (!pCur->fullscan_data) { + return 1; + } + return pCur->fullscan_data->done; + } + case VEC0_QUERY_PLAN_KNN: { + if (!pCur->knn_data) { + return 1; + } + // return (pCur->knn_data->current_idx >= pCur->knn_data->k) || + // (pCur->knn_data->distances[pCur->knn_data->current_idx] == FLT_MAX); + return (pCur->knn_data->current_idx >= pCur->knn_data->k_used); + } + case VEC0_QUERY_PLAN_POINT: { + if (!pCur->point_data) { + return 1; + } + return pCur->point_data->done; + } + } + return 1; +} + +static int vec0Column_fullscan(vec0_vtab *pVtab, vec0_cursor *pCur, + sqlite3_context *context, int i) { + if (!pCur->fullscan_data) { + sqlite3_result_error( + context, "Internal sqlite-vec error: fullscan_data is NULL.", -1); + return SQLITE_ERROR; + } + i64 rowid = sqlite3_column_int64(pCur->fullscan_data->rowids_stmt, 0); + if (i == VEC0_COLUMN_ID) { + return vec0_result_id(pVtab, context, rowid); + } + else if (vec0_column_idx_is_vector(pVtab, i)) { + void *v; + int sz; + int vector_idx = vec0_column_idx_to_vector_idx(pVtab, i); + int rc = vec0_get_vector_data(pVtab, rowid, vector_idx, &v, &sz); + if (rc != SQLITE_OK) { + return rc; + } + sqlite3_result_blob(context, v, sz, sqlite3_free); + sqlite3_result_subtype(context, + pVtab->vector_columns[vector_idx].element_type); + + } + else if (i == vec0_column_distance_idx(pVtab)) { + sqlite3_result_null(context); + } + else if(vec0_column_idx_is_partition(pVtab, i)) { + int partition_idx = vec0_column_idx_to_partition_idx(pVtab, i); + sqlite3_value * v; + int rc = vec0_get_partition_value_for_rowid(pVtab, rowid, partition_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + else if(vec0_column_idx_is_auxiliary(pVtab, i)) { + int auxiliary_idx = vec0_column_idx_to_auxiliary_idx(pVtab, i); + sqlite3_value * v; + int rc = vec0_get_auxiliary_value_for_rowid(pVtab, rowid, auxiliary_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + + else if(vec0_column_idx_is_metadata(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); + int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); + if(rc != SQLITE_OK) { + // IMP: V15466_32305 + const char * zErr = sqlite3_mprintf( + "Could not extract metadata value for column %.*s at rowid %lld", + pVtab->metadata_columns[metadata_idx].name_length, + pVtab->metadata_columns[metadata_idx].name, rowid + ); + if(zErr) { + sqlite3_result_error(context, zErr, -1); + sqlite3_free((void *) zErr); + }else { + sqlite3_result_error_nomem(context); + } + } + } + + return SQLITE_OK; +} + +static int vec0Column_point(vec0_vtab *pVtab, vec0_cursor *pCur, + sqlite3_context *context, int i) { + if (!pCur->point_data) { + sqlite3_result_error(context, + "Internal sqlite-vec error: point_data is NULL.", -1); + return SQLITE_ERROR; + } + if (i == VEC0_COLUMN_ID) { + return vec0_result_id(pVtab, context, pCur->point_data->rowid); + } + else if (i == vec0_column_distance_idx(pVtab)) { + sqlite3_result_null(context); + return SQLITE_OK; + } + else if (vec0_column_idx_is_vector(pVtab, i)) { + if (sqlite3_vtab_nochange(context)) { + sqlite3_result_null(context); + return SQLITE_OK; + } + int vector_idx = vec0_column_idx_to_vector_idx(pVtab, i); + sqlite3_result_blob( + context, pCur->point_data->vectors[vector_idx], + vector_column_byte_size(pVtab->vector_columns[vector_idx]), + SQLITE_TRANSIENT); + sqlite3_result_subtype(context, + pVtab->vector_columns[vector_idx].element_type); + return SQLITE_OK; + } + else if(vec0_column_idx_is_partition(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + int partition_idx = vec0_column_idx_to_partition_idx(pVtab, i); + i64 rowid = pCur->point_data->rowid; + sqlite3_value * v; + int rc = vec0_get_partition_value_for_rowid(pVtab, rowid, partition_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + else if(vec0_column_idx_is_auxiliary(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + i64 rowid = pCur->point_data->rowid; + int auxiliary_idx = vec0_column_idx_to_auxiliary_idx(pVtab, i); + sqlite3_value * v; + int rc = vec0_get_auxiliary_value_for_rowid(pVtab, rowid, auxiliary_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + + else if(vec0_column_idx_is_metadata(pVtab, i)) { + if(sqlite3_vtab_nochange(context)) { + return SQLITE_OK; + } + i64 rowid = pCur->point_data->rowid; + int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); + int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); + if(rc != SQLITE_OK) { + const char * zErr = sqlite3_mprintf( + "Could not extract metadata value for column %.*s at rowid %lld", + pVtab->metadata_columns[metadata_idx].name_length, + pVtab->metadata_columns[metadata_idx].name, rowid + ); + if(zErr) { + sqlite3_result_error(context, zErr, -1); + sqlite3_free((void *) zErr); + }else { + sqlite3_result_error_nomem(context); + } + } + } + + return SQLITE_OK; +} + +static int vec0Column_knn(vec0_vtab *pVtab, vec0_cursor *pCur, + sqlite3_context *context, int i) { + if (!pCur->knn_data) { + sqlite3_result_error(context, + "Internal sqlite-vec error: knn_data is NULL.", -1); + return SQLITE_ERROR; + } + if (i == VEC0_COLUMN_ID) { + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + return vec0_result_id(pVtab, context, rowid); + } + else if (i == vec0_column_distance_idx(pVtab)) { + sqlite3_result_double( + context, pCur->knn_data->distances[pCur->knn_data->current_idx]); + return SQLITE_OK; + } + else if (vec0_column_idx_is_vector(pVtab, i)) { + void *out; + int sz; + int vector_idx = vec0_column_idx_to_vector_idx(pVtab, i); + int rc = vec0_get_vector_data( + pVtab, pCur->knn_data->rowids[pCur->knn_data->current_idx], vector_idx, + &out, &sz); + if (rc != SQLITE_OK) { + return rc; + } + sqlite3_result_blob(context, out, sz, sqlite3_free); + sqlite3_result_subtype(context, + pVtab->vector_columns[vector_idx].element_type); + return SQLITE_OK; + } + else if(vec0_column_idx_is_partition(pVtab, i)) { + int partition_idx = vec0_column_idx_to_partition_idx(pVtab, i); + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + sqlite3_value * v; + int rc = vec0_get_partition_value_for_rowid(pVtab, rowid, partition_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + else if(vec0_column_idx_is_auxiliary(pVtab, i)) { + int auxiliary_idx = vec0_column_idx_to_auxiliary_idx(pVtab, i); + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + sqlite3_value * v; + int rc = vec0_get_auxiliary_value_for_rowid(pVtab, rowid, auxiliary_idx, &v); + if(rc == SQLITE_OK) { + sqlite3_result_value(context, v); + sqlite3_value_free(v); + }else { + sqlite3_result_error_code(context, rc); + } + } + + else if(vec0_column_idx_is_metadata(pVtab, i)) { + int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); + i64 rowid = pCur->knn_data->rowids[pCur->knn_data->current_idx]; + int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); + if(rc != SQLITE_OK) { + const char * zErr = sqlite3_mprintf( + "Could not extract metadata value for column %.*s at rowid %lld", + pVtab->metadata_columns[metadata_idx].name_length, + pVtab->metadata_columns[metadata_idx].name, rowid + ); + if(zErr) { + sqlite3_result_error(context, zErr, -1); + sqlite3_free((void *) zErr); + }else { + sqlite3_result_error_nomem(context); + } + } + } + + return SQLITE_OK; +} + +static int vec0Column(sqlite3_vtab_cursor *cur, sqlite3_context *context, + int i) { + vec0_cursor *pCur = (vec0_cursor *)cur; + vec0_vtab *pVtab = (vec0_vtab *)cur->pVtab; + switch (pCur->query_plan) { + case VEC0_QUERY_PLAN_FULLSCAN: { + return vec0Column_fullscan(pVtab, pCur, context, i); + } + case VEC0_QUERY_PLAN_KNN: { + return vec0Column_knn(pVtab, pCur, context, i); + } + case VEC0_QUERY_PLAN_POINT: { + return vec0Column_point(pVtab, pCur, context, i); + } + } + return SQLITE_OK; +} + +/** + * @brief Handles the "insert rowid" step of a row insert operation of a vec0 + * table. + * + * This function will insert a new row into the _rowids vec0 shadow table. + * + * @param p: virtual table + * @param idValue: Value containing the inserted rowid/id value. + * @param rowid: Output rowid, will point to the "real" i64 rowid + * value that was inserted + * @return int SQLITE_OK on success, error code on failure + */ +int vec0Update_InsertRowidStep(vec0_vtab *p, sqlite3_value *idValue, + i64 *rowid) { + + /** + * An insert into a vec0 table can happen a few different ways: + * 1) With default INTEGER primary key: With a supplied i64 rowid + * 2) With default INTEGER primary key: WITHOUT a supplied rowid + * 3) With TEXT primary key: supplied text rowid + */ + + int rc; + + // Option 3: vtab has a user-defined TEXT primary key, so ensure a text value + // is provided. + if (p->pkIsText) { + if (sqlite3_value_type(idValue) != SQLITE_TEXT) { + // IMP: V04200_21039 + vtab_set_error(&p->base, + "The %s virtual table was declared with a TEXT primary " + "key, but a non-TEXT value was provided in an INSERT.", + p->tableName); + return SQLITE_ERROR; + } + + return vec0_rowids_insert_id(p, idValue, rowid); + } + + // Option 1: User supplied a i64 rowid + if (sqlite3_value_type(idValue) == SQLITE_INTEGER) { + i64 suppliedRowid = sqlite3_value_int64(idValue); + rc = vec0_rowids_insert_rowid(p, suppliedRowid); + if (rc == SQLITE_OK) { + *rowid = suppliedRowid; + } + return rc; + } + + // Option 2: User did not suppled a rowid + + if (sqlite3_value_type(idValue) != SQLITE_NULL) { + // IMP: V30855_14925 + vtab_set_error(&p->base, + "Only integers are allows for primary key values on %s", + p->tableName); + return SQLITE_ERROR; + } + // NULL to get next auto-incremented value + return vec0_rowids_insert_id(p, NULL, rowid); +} + +/** + * @brief Determines the "next available" chunk position for a newly inserted + * vec0 row. + * + * This operation may insert a new "blank" chunk the _chunks table, if there is + * no more space in previous chunks. + * + * @param p: virtual table + * @param partitionKeyValues: array of partition key column values, to constrain + * against any partition key columns. + * @param chunk_rowid: Output rowid of the chunk in the _chunks virtual table + * that has the avialabiity. + * @param chunk_offset: Output the index of the available space insert the + * chunk, based on the index of the first available validity bit. + * @param pBlobValidity: Output blob of the validity column of the available + * chunk. Will be opened with read/write permissions. + * @param pValidity: Output buffer of the original chunk's validity column. + * Needs to be cleaned up with sqlite3_free(). + * @return int SQLITE_OK on success, error code on failure + */ +int vec0Update_InsertNextAvailableStep( + vec0_vtab *p, + sqlite3_value ** partitionKeyValues, + i64 *chunk_rowid, i64 *chunk_offset, + sqlite3_blob **blobChunksValidity, + const unsigned char **bufferChunksValidity) { + + int rc; + i64 validitySize; + *chunk_offset = -1; + + rc = vec0_get_latest_chunk_rowid(p, chunk_rowid, partitionKeyValues); + if(rc == SQLITE_EMPTY) { + goto done; + } + if (rc != SQLITE_OK) { + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "validity", + *chunk_rowid, 1, blobChunksValidity); + if (rc != SQLITE_OK) { + // IMP: V22053_06123 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not open validity blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + + validitySize = sqlite3_blob_bytes(*blobChunksValidity); + if (validitySize != p->chunk_size / CHAR_BIT) { + // IMP: V29362_13432 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "validity blob size mismatch on " + "%s.%s.%lld, expected %lld but received %lld.", + p->schemaName, p->shadowChunksName, *chunk_rowid, + (i64)(p->chunk_size / CHAR_BIT), validitySize); + rc = SQLITE_ERROR; + goto cleanup; + } + + *bufferChunksValidity = sqlite3_malloc(validitySize); + if (!(*bufferChunksValidity)) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "Could not allocate memory for validity bitmap"); + rc = SQLITE_NOMEM; + goto cleanup; + } + + rc = sqlite3_blob_read(*blobChunksValidity, (void *)*bufferChunksValidity, + validitySize, 0); + + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "Could not read validity bitmap for %s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + + // find the next available offset, ie first `0` in the bitmap. + for (int i = 0; i < validitySize; i++) { + if ((*bufferChunksValidity)[i] == 0b11111111) + continue; + for (int j = 0; j < CHAR_BIT; j++) { + if (((((*bufferChunksValidity)[i] >> j) & 1) == 0)) { + *chunk_offset = (i * CHAR_BIT) + j; + goto done; + } + } + } + +done: + // latest chunk was full, so need to create a new one + if (*chunk_offset == -1) { + rc = vec0_new_chunk(p, partitionKeyValues, chunk_rowid); + if (rc != SQLITE_OK) { + // IMP: V08441_25279 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR "Could not insert a new vector chunk"); + rc = SQLITE_ERROR; // otherwise raises a DatabaseError and not operational + // error? + goto cleanup; + } + *chunk_offset = 0; + + // blobChunksValidity and pValidity are stale, pointing to the previous + // (full) chunk. to re-assign them + rc = sqlite3_blob_close(*blobChunksValidity); + sqlite3_free((void *)*bufferChunksValidity); + *blobChunksValidity = NULL; + *bufferChunksValidity = NULL; + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR + "unknown error, blobChunksValidity could not be closed, " + "please file an issue."); + rc = SQLITE_ERROR; + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, + "validity", *chunk_rowid, 1, blobChunksValidity); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, + VEC_INTERAL_ERROR + "Could not open validity blob for newly created chunk %s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + validitySize = sqlite3_blob_bytes(*blobChunksValidity); + if (validitySize != p->chunk_size / CHAR_BIT) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "validity blob size mismatch for newly created chunk " + "%s.%s.%lld. Exepcted %lld, got %lld", + p->schemaName, p->shadowChunksName, *chunk_rowid, + p->chunk_size / CHAR_BIT, validitySize); + goto cleanup; + } + *bufferChunksValidity = sqlite3_malloc(validitySize); + rc = sqlite3_blob_read(*blobChunksValidity, (void *)*bufferChunksValidity, + validitySize, 0); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not read validity blob newly created chunk " + "%s.%s.%lld", + p->schemaName, p->shadowChunksName, *chunk_rowid); + goto cleanup; + } + } + + rc = SQLITE_OK; + +cleanup: + return rc; +} + +/** + * @brief Write the vector data into the provided vector blob at the given + * offset + * + * @param blobVectors SQLite BLOB to write to + * @param chunk_offset the "offset" (ie validity bitmap position) to write the + * vector to + * @param bVector pointer to the vector containing data + * @param dimensions how many dimensions the vector has + * @param element_type the vector type + * @return result of sqlite3_blob_write, SQLITE_OK on success, otherwise failure + */ +static int +vec0_write_vector_to_vector_blob(sqlite3_blob *blobVectors, i64 chunk_offset, + const void *bVector, size_t dimensions, + enum VectorElementType element_type) { + int n; + int offset; + + switch (element_type) { + case SQLITE_VEC_ELEMENT_TYPE_FLOAT32: + n = dimensions * sizeof(f32); + offset = chunk_offset * dimensions * sizeof(f32); + break; + case SQLITE_VEC_ELEMENT_TYPE_INT8: + n = dimensions * sizeof(i8); + offset = chunk_offset * dimensions * sizeof(i8); + break; + case SQLITE_VEC_ELEMENT_TYPE_BIT: + n = dimensions / CHAR_BIT; + offset = chunk_offset * dimensions / CHAR_BIT; + break; + } + + return sqlite3_blob_write(blobVectors, bVector, n, offset); +} + +/** + * @brief + * + * @param p vec0 virtual table + * @param chunk_rowid: which chunk to write to + * @param chunk_offset: the offset inside the chunk to write the vector to. + * @param rowid: the rowid of the inserting row + * @param vectorDatas: array of the vector data to insert + * @param blobValidity: writeable validity blob of the row's assigned chunk. + * @param validity: snapshot buffer of the valdity column from the row's + * assigned chunk. + * @return int SQLITE_OK on success, error code on failure + */ +int vec0Update_InsertWriteFinalStep(vec0_vtab *p, i64 chunk_rowid, + i64 chunk_offset, i64 rowid, + void *vectorDatas[], + sqlite3_blob *blobChunksValidity, + const unsigned char *bufferChunksValidity) { + int rc, brc; + sqlite3_blob *blobChunksRowids = NULL; + + // mark the validity bit for this row in the chunk's validity bitmap + // Get the byte offset of the bitmap + char unsigned bx = bufferChunksValidity[chunk_offset / CHAR_BIT]; + // set the bit at the chunk_offset position inside that byte + bx = bx | (1 << (chunk_offset % CHAR_BIT)); + // write that 1 byte + rc = sqlite3_blob_write(blobChunksValidity, &bx, 1, chunk_offset / CHAR_BIT); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, VEC_INTERAL_ERROR "could not mark validity bit "); + return rc; + } + + // Go insert the vector data into the vector chunk shadow tables + for (int i = 0; i < p->numVectorColumns; i++) { + sqlite3_blob *blobVectors; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowVectorChunksNames[i], + "vectors", chunk_rowid, 1, &blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "Error opening vector blob at %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid); + goto cleanup; + } + + i64 expected = + p->chunk_size * vector_column_byte_size(p->vector_columns[i]); + i64 actual = sqlite3_blob_bytes(blobVectors); + + if (actual != expected) { + // IMP: V16386_00456 + vtab_set_error( + &p->base, + VEC_INTERAL_ERROR + "vector blob size mismatch on %s.%s.%lld. Expected %lld, actual %lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid, expected, + actual); + rc = SQLITE_ERROR; + // already error, can ignore result code + sqlite3_blob_close(blobVectors); + goto cleanup; + }; + + rc = vec0_write_vector_to_vector_blob( + blobVectors, chunk_offset, vectorDatas[i], + p->vector_columns[i].dimensions, p->vector_columns[i].element_type); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not write vector blob on %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid); + rc = SQLITE_ERROR; + // already error, can ignore result code + sqlite3_blob_close(blobVectors); + goto cleanup; + } + rc = sqlite3_blob_close(blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR + "could not close vector blob on %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + } + + // write the new rowid to the rowids column of the _chunks table + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "rowids", + chunk_rowid, 1, &blobChunksRowids); + if (rc != SQLITE_OK) { + // IMP: V09221_26060 + vtab_set_error(&p->base, + VEC_INTERAL_ERROR "could not open rowids blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_rowid); + goto cleanup; + } + i64 expected = p->chunk_size * sizeof(i64); + i64 actual = sqlite3_blob_bytes(blobChunksRowids); + if (expected != actual) { + // IMP: V12779_29618 + vtab_set_error( + &p->base, + VEC_INTERAL_ERROR + "rowids blob size mismatch on %s.%s.%lld. Expected %lld, actual %lld", + p->schemaName, p->shadowChunksName, chunk_rowid, expected, actual); + rc = SQLITE_ERROR; + goto cleanup; + } + rc = sqlite3_blob_write(blobChunksRowids, &rowid, sizeof(i64), + chunk_offset * sizeof(i64)); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR "could not write rowids blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_rowid); + rc = SQLITE_ERROR; + goto cleanup; + } + + // Now with all the vectors inserted, go back and update the _rowids table + // with the new chunk_rowid/chunk_offset values + rc = vec0_rowids_update_position(p, rowid, chunk_rowid, chunk_offset); + +cleanup: + brc = sqlite3_blob_close(blobChunksRowids); + if ((rc == SQLITE_OK) && (brc != SQLITE_OK)) { + vtab_set_error( + &p->base, VEC_INTERAL_ERROR "could not close rowids blob on %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_rowid); + return brc; + } + return rc; +} + +int vec0_write_metadata_value(vec0_vtab *p, int metadata_column_idx, i64 rowid, i64 chunk_id, i64 chunk_offset, sqlite3_value * v, int isupdate) { + int rc; + struct Vec0MetadataColumnDefinition * metadata_column = &p->metadata_columns[metadata_column_idx]; + vec0_metadata_column_kind kind = metadata_column->kind; + + // verify input value matches column type + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + if(sqlite3_value_type(v) != SQLITE_INTEGER || ((sqlite3_value_int(v) != 0) && (sqlite3_value_int(v) != 1))) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected 0 or 1 for BOOLEAN metadata column %.*s", metadata_column->name_length, metadata_column->name); + goto done; + } + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + if(sqlite3_value_type(v) != SQLITE_INTEGER) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected integer for INTEGER metadata column %.*s, received %s", metadata_column->name_length, metadata_column->name, type_name(sqlite3_value_type(v))); + goto done; + } + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + if(sqlite3_value_type(v) != SQLITE_FLOAT) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected float for FLOAT metadata column %.*s, received %s", metadata_column->name_length, metadata_column->name, type_name(sqlite3_value_type(v))); + goto done; + } + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + if(sqlite3_value_type(v) != SQLITE_TEXT) { + rc = SQLITE_ERROR; + vtab_set_error(&p->base, "Expected text for TEXT metadata column %.*s, received %s", metadata_column->name_length, metadata_column->name, type_name(sqlite3_value_type(v))); + goto done; + } + break; + } + } + + sqlite3_blob * blobValue = NULL; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_column_idx], "data", chunk_id, 1, &blobValue); + if(rc != SQLITE_OK) { + goto done; + } + + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + u8 block; + int value = sqlite3_value_int(v); + rc = sqlite3_blob_read(blobValue, &block, sizeof(u8), (int) (chunk_offset / CHAR_BIT)); + if(rc != SQLITE_OK) { + goto done; + } + + if (value) { + block |= 1 << (chunk_offset % CHAR_BIT); + } else { + block &= ~(1 << (chunk_offset % CHAR_BIT)); + } + + rc = sqlite3_blob_write(blobValue, &block, sizeof(u8), chunk_offset / CHAR_BIT); + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 value = sqlite3_value_int64(v); + rc = sqlite3_blob_write(blobValue, &value, sizeof(value), chunk_offset * sizeof(i64)); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double value = sqlite3_value_double(v); + rc = sqlite3_blob_write(blobValue, &value, sizeof(value), chunk_offset * sizeof(double)); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + int prev_n; + rc = sqlite3_blob_read(blobValue, &prev_n, sizeof(int), chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + + const char * s = (const char *) sqlite3_value_text(v); + int n = sqlite3_value_bytes(v); + u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + memset(view, 0, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + memcpy(view, &n, sizeof(int)); + memcpy(view+4, s, min(n, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH-4)); + + rc = sqlite3_blob_write(blobValue, &view, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH, chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + const char * zSql; + + if(isupdate && (prev_n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH)) { + zSql = sqlite3_mprintf("UPDATE " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " SET data = ?2 WHERE rowid = ?1", p->schemaName, p->tableName, metadata_column_idx); + }else { + zSql = sqlite3_mprintf("INSERT INTO " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " (rowid, data) VALUES (?1, ?2)", p->schemaName, p->tableName, metadata_column_idx); + } + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + sqlite3_stmt * stmt; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + sqlite3_bind_text(stmt, 2, s, n, SQLITE_STATIC); + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + if(rc != SQLITE_DONE) { + rc = SQLITE_ERROR; + goto done; + } + } + else if(prev_n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + const char * zSql = sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_column_idx); + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + sqlite3_stmt * stmt; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + if(rc != SQLITE_DONE) { + rc = SQLITE_ERROR; + goto done; + } + } + break; + } + } + + if(rc != SQLITE_OK) { + + } + rc = sqlite3_blob_close(blobValue); + if(rc != SQLITE_OK) { + goto done; + } + + done: + return rc; +} + + +/** + * @brief Handles INSERT INTO operations on a vec0 table. + * + * @return int SQLITE_OK on success, otherwise error code on failure + */ +int vec0Update_Insert(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv, + sqlite_int64 *pRowid) { + UNUSED_PARAMETER(argc); + vec0_vtab *p = (vec0_vtab *)pVTab; + int rc; + // Rowid for the inserted row, deterimined by the inserted ID + _rowids shadow + // table + i64 rowid; + + // Array to hold the vector data of the inserted row. Individual elements will + // have a lifetime bound to the argv[..] values. + void *vectorDatas[VEC0_MAX_VECTOR_COLUMNS]; + // Array to hold cleanup functions for vectorDatas[] + vector_cleanup cleanups[VEC0_MAX_VECTOR_COLUMNS]; + + sqlite3_value * partitionKeyValues[VEC0_MAX_PARTITION_COLUMNS]; + + // Rowid of the chunk in the _chunks shadow table that the row will be a part + // of. + i64 chunk_rowid; + // offset within the chunk where the rowid belongs + i64 chunk_offset; + + // a write-able blob of the validity column for the given chunk. Used to mark + // validity bit + sqlite3_blob *blobChunksValidity = NULL; + // buffer for the valididty column for the given chunk. Maybe not needed here? + const unsigned char *bufferChunksValidity = NULL; + int numReadVectors = 0; + + // Read all provided partition key values into partitionKeyValues + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_PARTITION) { + continue; + } + int partition_key_idx = p->user_column_idxs[i]; + partitionKeyValues[partition_key_idx] = argv[2+VEC0_COLUMN_USERN_START + i]; + + int new_value_type = sqlite3_value_type(partitionKeyValues[partition_key_idx]); + if((new_value_type != SQLITE_NULL) && (new_value_type != p->paritition_columns[partition_key_idx].type)) { + // IMP: V11454_28292 + vtab_set_error( + pVTab, + "Parition key type mismatch: The partition key column %.*s has type %s, but %s was provided.", + p->paritition_columns[partition_key_idx].name_length, + p->paritition_columns[partition_key_idx].name, + type_name(p->paritition_columns[partition_key_idx].type), + type_name(new_value_type) + ); + rc = SQLITE_ERROR; + goto cleanup; + } + } + + // read all the inserted vectors into vectorDatas, validate their lengths. + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_VECTOR) { + continue; + } + int vector_column_idx = p->user_column_idxs[i]; + sqlite3_value *valueVector = argv[2 + VEC0_COLUMN_USERN_START + i]; + size_t dimensions; + + char *pzError; + enum VectorElementType elementType; + rc = vector_from_value(valueVector, &vectorDatas[vector_column_idx], &dimensions, + &elementType, &cleanups[vector_column_idx], &pzError); + if (rc != SQLITE_OK) { + // IMP: V06519_23358 + vtab_set_error( + pVTab, "Inserted vector for the \"%.*s\" column is invalid: %z", + p->vector_columns[vector_column_idx].name_length, p->vector_columns[vector_column_idx].name, pzError); + rc = SQLITE_ERROR; + goto cleanup; + } + + numReadVectors++; + if (elementType != p->vector_columns[vector_column_idx].element_type) { + // IMP: V08221_25059 + vtab_set_error( + pVTab, + "Inserted vector for the \"%.*s\" column is expected to be of type " + "%s, but a %s vector was provided.", + p->vector_columns[i].name_length, p->vector_columns[i].name, + vector_subtype_name(p->vector_columns[i].element_type), + vector_subtype_name(elementType)); + rc = SQLITE_ERROR; + goto cleanup; + } + + if (dimensions != p->vector_columns[vector_column_idx].dimensions) { + // IMP: V01145_17984 + vtab_set_error( + pVTab, + "Dimension mismatch for inserted vector for the \"%.*s\" column. " + "Expected %d dimensions but received %d.", + p->vector_columns[vector_column_idx].name_length, p->vector_columns[vector_column_idx].name, + p->vector_columns[vector_column_idx].dimensions, dimensions); + rc = SQLITE_ERROR; + goto cleanup; + } + } + + // Cannot insert a value in the hidden "distance" column + if (sqlite3_value_type(argv[2 + vec0_column_distance_idx(p)]) != + SQLITE_NULL) { + // IMP: V24228_08298 + vtab_set_error(pVTab, + "A value was provided for the hidden \"distance\" column."); + rc = SQLITE_ERROR; + goto cleanup; + } + // Cannot insert a value in the hidden "k" column + if (sqlite3_value_type(argv[2 + vec0_column_k_idx(p)]) != SQLITE_NULL) { + // IMP: V11875_28713 + vtab_set_error(pVTab, "A value was provided for the hidden \"k\" column."); + rc = SQLITE_ERROR; + goto cleanup; + } + + // Step #1: Insert/get a rowid for this row, from the _rowids table. + rc = vec0Update_InsertRowidStep(p, argv[2 + VEC0_COLUMN_ID], &rowid); + if (rc != SQLITE_OK) { + goto cleanup; + } + + // Step #2: Find the next "available" position in the _chunks table for this + // row. + rc = vec0Update_InsertNextAvailableStep(p, partitionKeyValues, + &chunk_rowid, &chunk_offset, + &blobChunksValidity, + &bufferChunksValidity); + if (rc != SQLITE_OK) { + goto cleanup; + } + + // Step #3: With the next available chunk position, write out all the vectors + // to their specified location. + rc = vec0Update_InsertWriteFinalStep(p, chunk_rowid, chunk_offset, rowid, + vectorDatas, blobChunksValidity, + bufferChunksValidity); + if (rc != SQLITE_OK) { + goto cleanup; + } + + if(p->numAuxiliaryColumns > 0) { + sqlite3_stmt *stmt; + sqlite3_str * s = sqlite3_str_new(NULL); + sqlite3_str_appendf(s, "INSERT INTO " VEC0_SHADOW_AUXILIARY_NAME "(rowid ", p->schemaName, p->tableName); + for(int i = 0; i < p->numAuxiliaryColumns; i++) { + sqlite3_str_appendf(s, ", value%02d", i); + } + sqlite3_str_appendall(s, ") VALUES (? "); + for(int i = 0; i < p->numAuxiliaryColumns; i++) { + sqlite3_str_appendall(s, ", ?"); + } + sqlite3_str_appendall(s, ")"); + char * zSql = sqlite3_str_finish(s); + // TODO double check error handling ehre + if(!zSql) { + rc = SQLITE_NOMEM; + goto cleanup; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_int64(stmt, 1, rowid); + + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY) { + continue; + } + int auxiliary_key_idx = p->user_column_idxs[i]; + sqlite3_value * v = argv[2+VEC0_COLUMN_USERN_START + i]; + int v_type = sqlite3_value_type(v); + if(v_type != SQLITE_NULL && (v_type != p->auxiliary_columns[auxiliary_key_idx].type)) { + sqlite3_finalize(stmt); + rc = SQLITE_CONSTRAINT; + vtab_set_error( + pVTab, + "Auxiliary column type mismatch: The auxiliary column %.*s has type %s, but %s was provided.", + p->auxiliary_columns[auxiliary_key_idx].name_length, + p->auxiliary_columns[auxiliary_key_idx].name, + type_name(p->auxiliary_columns[auxiliary_key_idx].type), + type_name(v_type) + ); + goto cleanup; + } + // first 1 is for 1-based indexing on sqlite3_bind_*, second 1 is to account for initial rowid parameter + sqlite3_bind_value(stmt, 1 + 1 + auxiliary_key_idx, v); + } + + rc = sqlite3_step(stmt); + if(rc != SQLITE_DONE) { + sqlite3_finalize(stmt); + rc = SQLITE_ERROR; + goto cleanup; + } + sqlite3_finalize(stmt); + } + + + for(int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_METADATA) { + continue; + } + int metadata_idx = p->user_column_idxs[i]; + sqlite3_value *v = argv[2 + VEC0_COLUMN_USERN_START + i]; + rc = vec0_write_metadata_value(p, metadata_idx, rowid, chunk_rowid, chunk_offset, v, 0); + if(rc != SQLITE_OK) { + goto cleanup; + } + } + + *pRowid = rowid; + rc = SQLITE_OK; + +cleanup: + for (int i = 0; i < numReadVectors; i++) { + cleanups[i](vectorDatas[i]); + } + sqlite3_free((void *)bufferChunksValidity); + int brc = sqlite3_blob_close(blobChunksValidity); + if ((rc == SQLITE_OK) && (brc != SQLITE_OK)) { + vtab_set_error(&p->base, + VEC_INTERAL_ERROR "unknown error, blobChunksValidity could " + "not be closed, please file an issue"); + return brc; + } + return rc; +} + +int vec0Update_Delete_ClearValidity(vec0_vtab *p, i64 chunk_id, + u64 chunk_offset) { + int rc, brc; + sqlite3_blob *blobChunksValidity = NULL; + char unsigned bx; + int validityOffset = chunk_offset / CHAR_BIT; + + // 2. ensure chunks.validity bit is 1, then set to 0 + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName, "validity", + chunk_id, 1, &blobChunksValidity); + if (rc != SQLITE_OK) { + // IMP: V26002_10073 + vtab_set_error(&p->base, "could not open validity blob for %s.%s.%lld", + p->schemaName, p->shadowChunksName, chunk_id); + return SQLITE_ERROR; + } + // will skip the sqlite3_blob_bytes(blobChunksValidity) check for now, + // the read below would catch it + + rc = sqlite3_blob_read(blobChunksValidity, &bx, sizeof(bx), validityOffset); + if (rc != SQLITE_OK) { + // IMP: V21193_05263 + vtab_set_error( + &p->base, "could not read validity blob for %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, validityOffset); + goto cleanup; + } + if (!(bx >> (chunk_offset % CHAR_BIT))) { + // IMP: V21193_05263 + rc = SQLITE_ERROR; + vtab_set_error( + &p->base, + "vec0 deletion error: validity bit is not set for %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, validityOffset); + goto cleanup; + } + char unsigned mask = ~(1 << (chunk_offset % CHAR_BIT)); + char result = bx & mask; + rc = sqlite3_blob_write(blobChunksValidity, &result, sizeof(bx), + validityOffset); + if (rc != SQLITE_OK) { + vtab_set_error( + &p->base, "could not write to validity blob for %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, validityOffset); + goto cleanup; + } + +cleanup: + + brc = sqlite3_blob_close(blobChunksValidity); + if (rc != SQLITE_OK) + return rc; + if (brc != SQLITE_OK) { + vtab_set_error(&p->base, + "vec0 deletion error: Error commiting validity blob " + "transaction on %s.%s.%lld at %d", + p->schemaName, p->shadowChunksName, chunk_id, + validityOffset); + return brc; + } + return SQLITE_OK; +} + +int vec0Update_Delete_DeleteRowids(vec0_vtab *p, i64 rowid) { + int rc; + sqlite3_stmt *stmt = NULL; + + char *zSql = + sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_ROWIDS_NAME " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + return SQLITE_NOMEM; + } + + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmt); + return rc; +} + +int vec0Update_Delete_DeleteAux(vec0_vtab *p, i64 rowid) { + int rc; + sqlite3_stmt *stmt = NULL; + + char *zSql = + sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_AUXILIARY_NAME " WHERE rowid = ?", + p->schemaName, p->tableName); + if (!zSql) { + return SQLITE_NOMEM; + } + + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + sqlite3_free(zSql); + if (rc != SQLITE_OK) { + goto cleanup; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + goto cleanup; + } + rc = SQLITE_OK; + +cleanup: + sqlite3_finalize(stmt); + return rc; +} + +int vec0Update_Delete_ClearMetadata(vec0_vtab *p, int metadata_idx, i64 rowid, i64 chunk_id, + u64 chunk_offset) { + int rc; + sqlite3_blob * blobValue; + vec0_metadata_column_kind kind = p->metadata_columns[metadata_idx].kind; + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 1, &blobValue); + if(rc != SQLITE_OK) { + return rc; + } + + switch(kind) { + case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { + u8 block; + rc = sqlite3_blob_read(blobValue, &block, sizeof(u8), (int) (chunk_offset / CHAR_BIT)); + if(rc != SQLITE_OK) { + goto done; + } + + block &= ~(1 << (chunk_offset % CHAR_BIT)); + rc = sqlite3_blob_write(blobValue, &block, sizeof(u8), chunk_offset / CHAR_BIT); + break; + } + case VEC0_METADATA_COLUMN_KIND_INTEGER: { + i64 v = 0; + rc = sqlite3_blob_write(blobValue, &v, sizeof(v), chunk_offset * sizeof(i64)); + break; + } + case VEC0_METADATA_COLUMN_KIND_FLOAT: { + double v = 0; + rc = sqlite3_blob_write(blobValue, &v, sizeof(v), chunk_offset * sizeof(double)); + break; + } + case VEC0_METADATA_COLUMN_KIND_TEXT: { + int n; + rc = sqlite3_blob_read(blobValue, &n, sizeof(int), chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + + u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; + memset(view, 0, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + rc = sqlite3_blob_write(blobValue, &view, sizeof(view), chunk_offset * VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); + if(rc != SQLITE_OK) { + goto done; + } + + if(n > VEC0_METADATA_TEXT_VIEW_DATA_LENGTH) { + const char * zSql = sqlite3_mprintf("DELETE FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_idx); + if(!zSql) { + rc = SQLITE_NOMEM; + goto done; + } + sqlite3_stmt * stmt; + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + goto done; + } + sqlite3_bind_int64(stmt, 1, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_DONE) { + rc = SQLITE_ERROR; + goto done; + } + sqlite3_finalize(stmt); + } + break; + } + } + int rc2; + done: + rc2 = sqlite3_blob_close(blobValue); + if(rc == SQLITE_OK) { + return rc2; + } + return rc; +} + +int vec0Update_Delete(sqlite3_vtab *pVTab, sqlite3_value *idValue) { + vec0_vtab *p = (vec0_vtab *)pVTab; + int rc; + i64 rowid; + i64 chunk_id; + i64 chunk_offset; + + if (p->pkIsText) { + rc = vec0_rowid_from_id(p, idValue, &rowid); + if (rc != SQLITE_OK) { + return rc; + } + } else { + rowid = sqlite3_value_int64(idValue); + } + + // 1. Find chunk position for given rowid + // 2. Ensure that validity bit for position is 1, then set to 0 + // 3. Zero out rowid in chunks.rowid + // 4. Zero out vector data in all vector column chunks + // 5. Delete value in _rowids table + + // 1. get chunk_id and chunk_offset from _rowids + rc = vec0_get_chunk_position(p, rowid, NULL, &chunk_id, &chunk_offset); + if (rc != SQLITE_OK) { + return rc; + } + + rc = vec0Update_Delete_ClearValidity(p, chunk_id, chunk_offset); + if (rc != SQLITE_OK) { + return rc; + } + + // 3. zero out rowid in chunks.rowids + // https://github.com/asg017/sqlite-vec/issues/54 + + // 4. zero out any data in vector chunks tables + // https://github.com/asg017/sqlite-vec/issues/54 + + // 5. delete from _rowids table + rc = vec0Update_Delete_DeleteRowids(p, rowid); + if (rc != SQLITE_OK) { + return rc; + } + + // 6. delete any auxiliary rows + if(p->numAuxiliaryColumns > 0) { + rc = vec0Update_Delete_DeleteAux(p, rowid); + if (rc != SQLITE_OK) { + return rc; + } + } + + // 6. delete metadata + for(int i = 0; i < p->numMetadataColumns; i++) { + rc = vec0Update_Delete_ClearMetadata(p, i, rowid, chunk_id, chunk_offset); + } + + return SQLITE_OK; +} + +int vec0Update_UpdateAuxColumn(vec0_vtab *p, int auxiliary_column_idx, sqlite3_value * value, i64 rowid) { + int rc; + sqlite3_stmt *stmt; + const char * zSql = sqlite3_mprintf("UPDATE " VEC0_SHADOW_AUXILIARY_NAME " SET value%02d = ? WHERE rowid = ?", p->schemaName, p->tableName, auxiliary_column_idx); + if(!zSql) { + return SQLITE_NOMEM; + } + rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); + if(rc != SQLITE_OK) { + return rc; + } + sqlite3_bind_value(stmt, 1, value); + sqlite3_bind_int64(stmt, 2, rowid); + rc = sqlite3_step(stmt); + if(rc != SQLITE_DONE) { + sqlite3_finalize(stmt); + return SQLITE_ERROR; + } + sqlite3_finalize(stmt); + return SQLITE_OK; +} + +int vec0Update_UpdateVectorColumn(vec0_vtab *p, i64 chunk_id, i64 chunk_offset, + int i, sqlite3_value *valueVector) { + int rc; + + sqlite3_blob *blobVectors = NULL; + + char *pzError; + size_t dimensions; + enum VectorElementType elementType; + void *vector; + vector_cleanup cleanup = vector_cleanup_noop; + // https://github.com/asg017/sqlite-vec/issues/53 + rc = vector_from_value(valueVector, &vector, &dimensions, &elementType, + &cleanup, &pzError); + if (rc != SQLITE_OK) { + // IMP: V15203_32042 + vtab_set_error( + &p->base, "Updated vector for the \"%.*s\" column is invalid: %z", + p->vector_columns[i].name_length, p->vector_columns[i].name, pzError); + rc = SQLITE_ERROR; + goto cleanup; + } + if (elementType != p->vector_columns[i].element_type) { + // IMP: V03643_20481 + vtab_set_error( + &p->base, + "Updated vector for the \"%.*s\" column is expected to be of type " + "%s, but a %s vector was provided.", + p->vector_columns[i].name_length, p->vector_columns[i].name, + vector_subtype_name(p->vector_columns[i].element_type), + vector_subtype_name(elementType)); + rc = SQLITE_ERROR; + goto cleanup; + } + if (dimensions != p->vector_columns[i].dimensions) { + // IMP: V25739_09810 + vtab_set_error( + &p->base, + "Dimension mismatch for new updated vector for the \"%.*s\" column. " + "Expected %d dimensions but received %d.", + p->vector_columns[i].name_length, p->vector_columns[i].name, + p->vector_columns[i].dimensions, dimensions); + rc = SQLITE_ERROR; + goto cleanup; + } + + rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowVectorChunksNames[i], + "vectors", chunk_id, 1, &blobVectors); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "Could not open vectors blob for %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_id); + goto cleanup; + } + rc = vec0_write_vector_to_vector_blob(blobVectors, chunk_offset, vector, + p->vector_columns[i].dimensions, + p->vector_columns[i].element_type); + if (rc != SQLITE_OK) { + vtab_set_error(&p->base, "Could not write to vectors blob for %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_id); + goto cleanup; + } + +cleanup: + cleanup(vector); + int brc = sqlite3_blob_close(blobVectors); + if (rc != SQLITE_OK) { + return rc; + } + if (brc != SQLITE_OK) { + vtab_set_error( + &p->base, + "Could not commit blob transaction for vectors blob for %s.%s.%lld", + p->schemaName, p->shadowVectorChunksNames[i], chunk_id); + return brc; + } + return SQLITE_OK; +} + +int vec0Update_Update(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv) { + UNUSED_PARAMETER(argc); + vec0_vtab *p = (vec0_vtab *)pVTab; + int rc; + i64 chunk_id; + i64 chunk_offset; + + i64 rowid; + if (p->pkIsText) { + const char *a = (const char *)sqlite3_value_text(argv[0]); + const char *b = (const char *)sqlite3_value_text(argv[1]); + // IMP: V08886_25725 + if ((sqlite3_value_bytes(argv[0]) != sqlite3_value_bytes(argv[1])) || + strncmp(a, b, sqlite3_value_bytes(argv[0])) != 0) { + vtab_set_error(pVTab, + "UPDATEs on vec0 primary key values are not allowed."); + return SQLITE_ERROR; + } + rc = vec0_rowid_from_id(p, argv[0], &rowid); + if (rc != SQLITE_OK) { + return rc; + } + } else { + rowid = sqlite3_value_int64(argv[0]); + } + + // 1) get chunk_id and chunk_offset from _rowids + rc = vec0_get_chunk_position(p, rowid, NULL, &chunk_id, &chunk_offset); + if (rc != SQLITE_OK) { + return rc; + } + + // 2) update any partition key values + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_PARTITION) { + continue; + } + sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; + if(sqlite3_value_nochange(value)) { + continue; + } + vtab_set_error(pVTab, "UPDATE on partition key columns are not supported yet. "); + return SQLITE_ERROR; + } + + // 3) handle auxiliary column updates + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_AUXILIARY) { + continue; + } + int auxiliary_column_idx = p->user_column_idxs[i]; + sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; + if(sqlite3_value_nochange(value)) { + continue; + } + rc = vec0Update_UpdateAuxColumn(p, auxiliary_column_idx, value, rowid); + if(rc != SQLITE_OK) { + return SQLITE_ERROR; + } + } + + // 4) handle metadata column updates + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_METADATA) { + continue; + } + int metadata_column_idx = p->user_column_idxs[i]; + sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; + if(sqlite3_value_nochange(value)) { + continue; + } + rc = vec0_write_metadata_value(p, metadata_column_idx, rowid, chunk_id, chunk_offset, value, 1); + if(rc != SQLITE_OK) { + return rc; + } + } + + // 5) iterate over all new vectors, update the vectors + for (int i = 0; i < vec0_num_defined_user_columns(p); i++) { + if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_VECTOR) { + continue; + } + int vector_idx = p->user_column_idxs[i]; + sqlite3_value *valueVector = argv[2 + VEC0_COLUMN_USERN_START + i]; + // in vec0Column, we check sqlite3_vtab_nochange() on vector columns. + // If the vector column isn't being changed, we return NULL; + // That's not great, that means vector columns can never be NULLABLE + // (bc we cant distinguish if an updated vector is truly NULL or nochange). + // Also it means that if someone tries to run `UPDATE v SET X = NULL`, + // we can't effectively detect and raise an error. + // A better solution would be to use a custom result_type for "empty", + // but subtypes don't appear to survive xColumn -> xUpdate, it's always 0. + // So for now, we'll just use NULL and warn people to not SET X = NULL + // in the docs. + if (sqlite3_value_type(valueVector) == SQLITE_NULL) { + continue; + } + + rc = vec0Update_UpdateVectorColumn(p, chunk_id, chunk_offset, vector_idx, + valueVector); + if (rc != SQLITE_OK) { + return SQLITE_ERROR; + } + } + + return SQLITE_OK; +} + +static int vec0Update(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv, + sqlite_int64 *pRowid) { + // DELETE operation + if (argc == 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return vec0Update_Delete(pVTab, argv[0]); + } + // INSERT operation + else if (argc > 1 && sqlite3_value_type(argv[0]) == SQLITE_NULL) { + return vec0Update_Insert(pVTab, argc, argv, pRowid); + } + // UPDATE operation + else if (argc > 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return vec0Update_Update(pVTab, argc, argv); + } else { + vtab_set_error(pVTab, "Unrecognized xUpdate operation provided for vec0."); + return SQLITE_ERROR; + } +} + +static int vec0ShadowName(const char *zName) { + static const char *azName[] = { + "rowids", "chunks", "auxiliary", "info", + + // Up to VEC0_MAX_METADATA_COLUMNS + // TODO be smarter about this man + "metadatachunks00", + "metadatachunks01", + "metadatachunks02", + "metadatachunks03", + "metadatachunks04", + "metadatachunks05", + "metadatachunks06", + "metadatachunks07", + "metadatachunks08", + "metadatachunks09", + "metadatachunks10", + "metadatachunks11", + "metadatachunks12", + "metadatachunks13", + "metadatachunks14", + "metadatachunks15", + + // Up to + "metadatatext00", + "metadatatext01", + "metadatatext02", + "metadatatext03", + "metadatatext04", + "metadatatext05", + "metadatatext06", + "metadatatext07", + "metadatatext08", + "metadatatext09", + "metadatatext10", + "metadatatext11", + "metadatatext12", + "metadatatext13", + "metadatatext14", + "metadatatext15", + }; + + for (size_t i = 0; i < sizeof(azName) / sizeof(azName[0]); i++) { + if (sqlite3_stricmp(zName, azName[i]) == 0) + return 1; + } + //for(size_t i = 0; i < )"vector_chunks", "metadatachunks" + return 0; +} + +static int vec0Begin(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + return SQLITE_OK; +} +static int vec0Sync(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + vec0_vtab *p = (vec0_vtab *)pVTab; + if (p->stmtLatestChunk) { + sqlite3_finalize(p->stmtLatestChunk); + p->stmtLatestChunk = NULL; + } + if (p->stmtRowidsInsertRowid) { + sqlite3_finalize(p->stmtRowidsInsertRowid); + p->stmtRowidsInsertRowid = NULL; + } + if (p->stmtRowidsInsertId) { + sqlite3_finalize(p->stmtRowidsInsertId); + p->stmtRowidsInsertId = NULL; + } + if (p->stmtRowidsUpdatePosition) { + sqlite3_finalize(p->stmtRowidsUpdatePosition); + p->stmtRowidsUpdatePosition = NULL; + } + if (p->stmtRowidsGetChunkPosition) { + sqlite3_finalize(p->stmtRowidsGetChunkPosition); + p->stmtRowidsGetChunkPosition = NULL; + } + return SQLITE_OK; +} +static int vec0Commit(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + return SQLITE_OK; +} +static int vec0Rollback(sqlite3_vtab *pVTab) { + UNUSED_PARAMETER(pVTab); + return SQLITE_OK; +} + +static sqlite3_module vec0Module = { + /* iVersion */ 3, + /* xCreate */ vec0Create, + /* xConnect */ vec0Connect, + /* xBestIndex */ vec0BestIndex, + /* xDisconnect */ vec0Disconnect, + /* xDestroy */ vec0Destroy, + /* xOpen */ vec0Open, + /* xClose */ vec0Close, + /* xFilter */ vec0Filter, + /* xNext */ vec0Next, + /* xEof */ vec0Eof, + /* xColumn */ vec0Column, + /* xRowid */ vec0Rowid, + /* xUpdate */ vec0Update, + /* xBegin */ vec0Begin, + /* xSync */ vec0Sync, + /* xCommit */ vec0Commit, + /* xRollback */ vec0Rollback, + /* xFindFunction */ 0, + /* xRename */ 0, // https://github.com/asg017/sqlite-vec/issues/43 + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ vec0ShadowName, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0, // https://github.com/asg017/sqlite-vec/issues/44 +#endif +}; +#pragma endregion + +static char *POINTER_NAME_STATIC_BLOB_DEF = "vec0-static_blob_def"; +struct static_blob_definition { + void *p; + size_t dimensions; + size_t nvectors; + enum VectorElementType element_type; +}; +static void vec_static_blob_from_raw(sqlite3_context *context, int argc, + sqlite3_value **argv) { + + assert(argc == 4); + struct static_blob_definition *p; + p = sqlite3_malloc(sizeof(*p)); + if (!p) { + sqlite3_result_error_nomem(context); + return; + } + memset(p, 0, sizeof(*p)); + p->p = (void *)sqlite3_value_int64(argv[0]); + p->element_type = SQLITE_VEC_ELEMENT_TYPE_FLOAT32; + p->dimensions = sqlite3_value_int64(argv[2]); + p->nvectors = sqlite3_value_int64(argv[3]); + sqlite3_result_pointer(context, p, POINTER_NAME_STATIC_BLOB_DEF, + sqlite3_free); +} +#pragma region vec_static_blobs() table function + +#define MAX_STATIC_BLOBS 16 + +typedef struct static_blob static_blob; +struct static_blob { + char *name; + void *p; + size_t dimensions; + size_t nvectors; + enum VectorElementType element_type; +}; + +typedef struct vec_static_blob_data vec_static_blob_data; +struct vec_static_blob_data { + static_blob static_blobs[MAX_STATIC_BLOBS]; +}; + +typedef struct vec_static_blobs_vtab vec_static_blobs_vtab; +struct vec_static_blobs_vtab { + sqlite3_vtab base; + vec_static_blob_data *data; +}; + +typedef struct vec_static_blobs_cursor vec_static_blobs_cursor; +struct vec_static_blobs_cursor { + sqlite3_vtab_cursor base; + sqlite3_int64 iRowid; +}; + +static int vec_static_blobsConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr) { + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + + vec_static_blobs_vtab *pNew; +#define VEC_STATIC_BLOBS_NAME 0 +#define VEC_STATIC_BLOBS_DATA 1 +#define VEC_STATIC_BLOBS_DIMENSIONS 2 +#define VEC_STATIC_BLOBS_COUNT 3 + int rc = sqlite3_declare_vtab( + db, "CREATE TABLE x(name, data, dimensions hidden, count hidden)"); + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->data = pAux; + } + return rc; +} + +static int vec_static_blobsDisconnect(sqlite3_vtab *pVtab) { + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_static_blobsUpdate(sqlite3_vtab *pVTab, int argc, + sqlite3_value **argv, sqlite_int64 *pRowid) { + UNUSED_PARAMETER(pRowid); + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)pVTab; + // DELETE operation + if (argc == 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return SQLITE_ERROR; + } + // INSERT operation + else if (argc > 1 && sqlite3_value_type(argv[0]) == SQLITE_NULL) { + const char *key = + (const char *)sqlite3_value_text(argv[2 + VEC_STATIC_BLOBS_NAME]); + int idx = -1; + for (int i = 0; i < MAX_STATIC_BLOBS; i++) { + if (!p->data->static_blobs[i].name) { + p->data->static_blobs[i].name = sqlite3_mprintf("%s", key); + idx = i; + break; + } + } + if (idx < 0) + abort(); + struct static_blob_definition *def = sqlite3_value_pointer( + argv[2 + VEC_STATIC_BLOBS_DATA], POINTER_NAME_STATIC_BLOB_DEF); + p->data->static_blobs[idx].p = def->p; + p->data->static_blobs[idx].dimensions = def->dimensions; + p->data->static_blobs[idx].nvectors = def->nvectors; + p->data->static_blobs[idx].element_type = def->element_type; + + return SQLITE_OK; + } + // UPDATE operation + else if (argc > 1 && sqlite3_value_type(argv[0]) != SQLITE_NULL) { + return SQLITE_ERROR; + } + return SQLITE_ERROR; +} + +static int vec_static_blobsOpen(sqlite3_vtab *p, + sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_static_blobs_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_static_blobsClose(sqlite3_vtab_cursor *cur) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_static_blobsBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + UNUSED_PARAMETER(pVTab); + pIdxInfo->idxNum = 1; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; +} + +static int vec_static_blobsNext(sqlite3_vtab_cursor *cur); +static int vec_static_blobsFilter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, + const char *idxStr, int argc, + sqlite3_value **argv) { + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)pVtabCursor; + pCur->iRowid = -1; + vec_static_blobsNext(pVtabCursor); + return SQLITE_OK; +} + +static int vec_static_blobsRowid(sqlite3_vtab_cursor *cur, + sqlite_int64 *pRowid) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +static int vec_static_blobsNext(sqlite3_vtab_cursor *cur) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)pCur->base.pVtab; + pCur->iRowid++; + while (pCur->iRowid < MAX_STATIC_BLOBS) { + if (p->data->static_blobs[pCur->iRowid].name) { + return SQLITE_OK; + } + pCur->iRowid++; + } + return SQLITE_OK; +} + +static int vec_static_blobsEof(sqlite3_vtab_cursor *cur) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + return pCur->iRowid >= MAX_STATIC_BLOBS; +} + +static int vec_static_blobsColumn(sqlite3_vtab_cursor *cur, + sqlite3_context *context, int i) { + vec_static_blobs_cursor *pCur = (vec_static_blobs_cursor *)cur; + vec_static_blobs_vtab *p = (vec_static_blobs_vtab *)cur->pVtab; + switch (i) { + case VEC_STATIC_BLOBS_NAME: + sqlite3_result_text(context, p->data->static_blobs[pCur->iRowid].name, -1, + SQLITE_TRANSIENT); + break; + case VEC_STATIC_BLOBS_DATA: + sqlite3_result_null(context); + break; + case VEC_STATIC_BLOBS_DIMENSIONS: + sqlite3_result_int64(context, + p->data->static_blobs[pCur->iRowid].dimensions); + break; + case VEC_STATIC_BLOBS_COUNT: + sqlite3_result_int64(context, p->data->static_blobs[pCur->iRowid].nvectors); + break; + } + return SQLITE_OK; +} + +static sqlite3_module vec_static_blobsModule = { + /* iVersion */ 3, + /* xCreate */ 0, + /* xConnect */ vec_static_blobsConnect, + /* xBestIndex */ vec_static_blobsBestIndex, + /* xDisconnect */ vec_static_blobsDisconnect, + /* xDestroy */ 0, + /* xOpen */ vec_static_blobsOpen, + /* xClose */ vec_static_blobsClose, + /* xFilter */ vec_static_blobsFilter, + /* xNext */ vec_static_blobsNext, + /* xEof */ vec_static_blobsEof, + /* xColumn */ vec_static_blobsColumn, + /* xRowid */ vec_static_blobsRowid, + /* xUpdate */ vec_static_blobsUpdate, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0 +#endif +}; +#pragma endregion + +#pragma region vec_static_blob_entries() table function + +typedef struct vec_static_blob_entries_vtab vec_static_blob_entries_vtab; +struct vec_static_blob_entries_vtab { + sqlite3_vtab base; + static_blob *blob; +}; +typedef enum { + VEC_SBE__QUERYPLAN_FULLSCAN = 1, + VEC_SBE__QUERYPLAN_KNN = 2 +} vec_sbe_query_plan; + +struct sbe_query_knn_data { + i64 k; + i64 k_used; + // Array of rowids of size k. Must be freed with sqlite3_free(). + i32 *rowids; + // Array of distances of size k. Must be freed with sqlite3_free(). + f32 *distances; + i64 current_idx; +}; +void sbe_query_knn_data_clear(struct sbe_query_knn_data *knn_data) { + if (!knn_data) + return; + + if (knn_data->rowids) { + sqlite3_free(knn_data->rowids); + knn_data->rowids = NULL; + } + if (knn_data->distances) { + sqlite3_free(knn_data->distances); + knn_data->distances = NULL; + } +} + +typedef struct vec_static_blob_entries_cursor vec_static_blob_entries_cursor; +struct vec_static_blob_entries_cursor { + sqlite3_vtab_cursor base; + sqlite3_int64 iRowid; + vec_sbe_query_plan query_plan; + struct sbe_query_knn_data *knn_data; +}; + +static int vec_static_blob_entriesConnect(sqlite3 *db, void *pAux, int argc, + const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr) { + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + UNUSED_PARAMETER(pzErr); + vec_static_blob_data *blob_data = pAux; + int idx = -1; + for (int i = 0; i < MAX_STATIC_BLOBS; i++) { + if (!blob_data->static_blobs[i].name) + continue; + if (strncmp(blob_data->static_blobs[i].name, argv[3], + strlen(blob_data->static_blobs[i].name)) == 0) { + idx = i; + break; + } + } + if (idx < 0) + abort(); + vec_static_blob_entries_vtab *pNew; +#define VEC_STATIC_BLOB_ENTRIES_VECTOR 0 +#define VEC_STATIC_BLOB_ENTRIES_DISTANCE 1 +#define VEC_STATIC_BLOB_ENTRIES_K 2 + int rc = sqlite3_declare_vtab( + db, "CREATE TABLE x(vector, distance hidden, k hidden)"); + if (rc == SQLITE_OK) { + pNew = sqlite3_malloc(sizeof(*pNew)); + *ppVtab = (sqlite3_vtab *)pNew; + if (pNew == 0) + return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->blob = &blob_data->static_blobs[idx]; + } + return rc; +} + +static int vec_static_blob_entriesCreate(sqlite3 *db, void *pAux, int argc, + const char *const *argv, + sqlite3_vtab **ppVtab, char **pzErr) { + return vec_static_blob_entriesConnect(db, pAux, argc, argv, ppVtab, pzErr); +} + +static int vec_static_blob_entriesDisconnect(sqlite3_vtab *pVtab) { + vec_static_blob_entries_vtab *p = (vec_static_blob_entries_vtab *)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +static int vec_static_blob_entriesOpen(sqlite3_vtab *p, + sqlite3_vtab_cursor **ppCursor) { + UNUSED_PARAMETER(p); + vec_static_blob_entries_cursor *pCur; + pCur = sqlite3_malloc(sizeof(*pCur)); + if (pCur == 0) + return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +static int vec_static_blob_entriesClose(sqlite3_vtab_cursor *cur) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + sqlite3_free(pCur->knn_data); + sqlite3_free(pCur); + return SQLITE_OK; +} + +static int vec_static_blob_entriesBestIndex(sqlite3_vtab *pVTab, + sqlite3_index_info *pIdxInfo) { + vec_static_blob_entries_vtab *p = (vec_static_blob_entries_vtab *)pVTab; + int iMatchTerm = -1; + int iLimitTerm = -1; + // int iRowidTerm = -1; // https://github.com/asg017/sqlite-vec/issues/47 + int iKTerm = -1; + + for (int i = 0; i < pIdxInfo->nConstraint; i++) { + if (!pIdxInfo->aConstraint[i].usable) + continue; + + int iColumn = pIdxInfo->aConstraint[i].iColumn; + int op = pIdxInfo->aConstraint[i].op; + if (op == SQLITE_INDEX_CONSTRAINT_MATCH && + iColumn == VEC_STATIC_BLOB_ENTRIES_VECTOR) { + if (iMatchTerm > -1) { + // https://github.com/asg017/sqlite-vec/issues/51 + return SQLITE_ERROR; + } + iMatchTerm = i; + } + if (op == SQLITE_INDEX_CONSTRAINT_LIMIT) { + iLimitTerm = i; + } + if (op == SQLITE_INDEX_CONSTRAINT_EQ && + iColumn == VEC_STATIC_BLOB_ENTRIES_K) { + iKTerm = i; + } + } + if (iMatchTerm >= 0) { + if (iLimitTerm < 0 && iKTerm < 0) { + // https://github.com/asg017/sqlite-vec/issues/51 + return SQLITE_ERROR; + } + if (iLimitTerm >= 0 && iKTerm >= 0) { + return SQLITE_ERROR; // limit or k, not both + } + if (pIdxInfo->nOrderBy < 1) { + vtab_set_error(pVTab, "ORDER BY distance required"); + return SQLITE_CONSTRAINT; + } + if (pIdxInfo->nOrderBy > 1) { + // https://github.com/asg017/sqlite-vec/issues/51 + vtab_set_error(pVTab, "more than 1 ORDER BY clause provided"); + return SQLITE_CONSTRAINT; + } + if (pIdxInfo->aOrderBy[0].iColumn != VEC_STATIC_BLOB_ENTRIES_DISTANCE) { + vtab_set_error(pVTab, "ORDER BY must be on the distance column"); + return SQLITE_CONSTRAINT; + } + if (pIdxInfo->aOrderBy[0].desc) { + vtab_set_error(pVTab, + "Only ascending in ORDER BY distance clause is supported, " + "DESC is not supported yet."); + return SQLITE_CONSTRAINT; + } + + pIdxInfo->idxNum = VEC_SBE__QUERYPLAN_KNN; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + + pIdxInfo->orderByConsumed = 1; + pIdxInfo->aConstraintUsage[iMatchTerm].argvIndex = 1; + pIdxInfo->aConstraintUsage[iMatchTerm].omit = 1; + if (iLimitTerm >= 0) { + pIdxInfo->aConstraintUsage[iLimitTerm].argvIndex = 2; + pIdxInfo->aConstraintUsage[iLimitTerm].omit = 1; + } else { + pIdxInfo->aConstraintUsage[iKTerm].argvIndex = 2; + pIdxInfo->aConstraintUsage[iKTerm].omit = 1; + } + + } else { + pIdxInfo->idxNum = VEC_SBE__QUERYPLAN_FULLSCAN; + pIdxInfo->estimatedCost = (double)p->blob->nvectors; + pIdxInfo->estimatedRows = p->blob->nvectors; + } + return SQLITE_OK; +} + +static int vec_static_blob_entriesFilter(sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv) { + UNUSED_PARAMETER(idxStr); + assert(argc >= 0 && argc <= 3); + vec_static_blob_entries_cursor *pCur = + (vec_static_blob_entries_cursor *)pVtabCursor; + vec_static_blob_entries_vtab *p = + (vec_static_blob_entries_vtab *)pCur->base.pVtab; + + if (idxNum == VEC_SBE__QUERYPLAN_KNN) { + assert(argc == 2); + pCur->query_plan = VEC_SBE__QUERYPLAN_KNN; + struct sbe_query_knn_data *knn_data; + knn_data = sqlite3_malloc(sizeof(*knn_data)); + if (!knn_data) { + return SQLITE_NOMEM; + } + memset(knn_data, 0, sizeof(*knn_data)); + + void *queryVector; + size_t dimensions; + enum VectorElementType elementType; + vector_cleanup cleanup; + char *err; + int rc = vector_from_value(argv[0], &queryVector, &dimensions, &elementType, + &cleanup, &err); + if (rc != SQLITE_OK) { + return SQLITE_ERROR; + } + if (elementType != p->blob->element_type) { + return SQLITE_ERROR; + } + if (dimensions != p->blob->dimensions) { + return SQLITE_ERROR; + } + + i64 k = min(sqlite3_value_int64(argv[1]), (i64)p->blob->nvectors); + if (k < 0) { + // HANDLE https://github.com/asg017/sqlite-vec/issues/55 + return SQLITE_ERROR; + } + if (k == 0) { + knn_data->k = 0; + pCur->knn_data = knn_data; + return SQLITE_OK; + } + + size_t bsize = (p->blob->nvectors + 7) & ~7; + + i32 *topk_rowids = sqlite3_malloc(k * sizeof(i32)); + if (!topk_rowids) { + // HANDLE https://github.com/asg017/sqlite-vec/issues/55 + return SQLITE_ERROR; + } + f32 *distances = sqlite3_malloc(bsize * sizeof(f32)); + if (!distances) { + // HANDLE https://github.com/asg017/sqlite-vec/issues/55 + return SQLITE_ERROR; + } + + for (size_t i = 0; i < p->blob->nvectors; i++) { + // https://github.com/asg017/sqlite-vec/issues/52 + float *v = ((float *)p->blob->p) + (i * p->blob->dimensions); + distances[i] = + distance_l2_sqr_float(v, (float *)queryVector, &p->blob->dimensions); + } + u8 *candidates = bitmap_new(bsize); + assert(candidates); + + u8 *taken = bitmap_new(bsize); + assert(taken); + + bitmap_fill(candidates, bsize); + for (size_t i = bsize; i >= p->blob->nvectors; i--) { + bitmap_set(candidates, i, 0); + } + i32 k_used = 0; + min_idx(distances, bsize, candidates, topk_rowids, k, taken, &k_used); + knn_data->current_idx = 0; + knn_data->distances = distances; + knn_data->k = k; + knn_data->rowids = topk_rowids; + + pCur->knn_data = knn_data; + } else { + pCur->query_plan = VEC_SBE__QUERYPLAN_FULLSCAN; + pCur->iRowid = 0; + } + + return SQLITE_OK; +} + +static int vec_static_blob_entriesRowid(sqlite3_vtab_cursor *cur, + sqlite_int64 *pRowid) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + *pRowid = pCur->iRowid; + return SQLITE_OK; + } + case VEC_SBE__QUERYPLAN_KNN: { + i32 rowid = ((i32 *)pCur->knn_data->rowids)[pCur->knn_data->current_idx]; + *pRowid = (sqlite3_int64)rowid; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static int vec_static_blob_entriesNext(sqlite3_vtab_cursor *cur) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + pCur->iRowid++; + return SQLITE_OK; + } + case VEC_SBE__QUERYPLAN_KNN: { + pCur->knn_data->current_idx++; + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static int vec_static_blob_entriesEof(sqlite3_vtab_cursor *cur) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + vec_static_blob_entries_vtab *p = + (vec_static_blob_entries_vtab *)pCur->base.pVtab; + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + return (size_t)pCur->iRowid >= p->blob->nvectors; + } + case VEC_SBE__QUERYPLAN_KNN: { + return pCur->knn_data->current_idx >= pCur->knn_data->k; + } + } + return SQLITE_ERROR; +} + +static int vec_static_blob_entriesColumn(sqlite3_vtab_cursor *cur, + sqlite3_context *context, int i) { + vec_static_blob_entries_cursor *pCur = (vec_static_blob_entries_cursor *)cur; + vec_static_blob_entries_vtab *p = (vec_static_blob_entries_vtab *)cur->pVtab; + + switch (pCur->query_plan) { + case VEC_SBE__QUERYPLAN_FULLSCAN: { + switch (i) { + case VEC_STATIC_BLOB_ENTRIES_VECTOR: + + sqlite3_result_blob( + context, + ((unsigned char *)p->blob->p) + + (pCur->iRowid * p->blob->dimensions * sizeof(float)), + p->blob->dimensions * sizeof(float), SQLITE_TRANSIENT); + sqlite3_result_subtype(context, p->blob->element_type); + break; + } + return SQLITE_OK; + } + case VEC_SBE__QUERYPLAN_KNN: { + switch (i) { + case VEC_STATIC_BLOB_ENTRIES_VECTOR: { + i32 rowid = ((i32 *)pCur->knn_data->rowids)[pCur->knn_data->current_idx]; + sqlite3_result_blob(context, + ((unsigned char *)p->blob->p) + + (rowid * p->blob->dimensions * sizeof(float)), + p->blob->dimensions * sizeof(float), + SQLITE_TRANSIENT); + sqlite3_result_subtype(context, p->blob->element_type); + break; + } + } + return SQLITE_OK; + } + } + return SQLITE_ERROR; +} + +static sqlite3_module vec_static_blob_entriesModule = { + /* iVersion */ 3, + /* xCreate */ + vec_static_blob_entriesCreate, // handle rm? + // https://github.com/asg017/sqlite-vec/issues/55 + /* xConnect */ vec_static_blob_entriesConnect, + /* xBestIndex */ vec_static_blob_entriesBestIndex, + /* xDisconnect */ vec_static_blob_entriesDisconnect, + /* xDestroy */ vec_static_blob_entriesDisconnect, + /* xOpen */ vec_static_blob_entriesOpen, + /* xClose */ vec_static_blob_entriesClose, + /* xFilter */ vec_static_blob_entriesFilter, + /* xNext */ vec_static_blob_entriesNext, + /* xEof */ vec_static_blob_entriesEof, + /* xColumn */ vec_static_blob_entriesColumn, + /* xRowid */ vec_static_blob_entriesRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0, +#if SQLITE_VERSION_NUMBER >= 3044000 + /* xIntegrity */ 0 +#endif +}; +#pragma endregion + +#ifdef SQLITE_VEC_ENABLE_AVX +#define SQLITE_VEC_DEBUG_BUILD_AVX "avx" +#else +#define SQLITE_VEC_DEBUG_BUILD_AVX "" +#endif +#ifdef SQLITE_VEC_ENABLE_NEON +#define SQLITE_VEC_DEBUG_BUILD_NEON "neon" +#else +#define SQLITE_VEC_DEBUG_BUILD_NEON "" +#endif + +#define SQLITE_VEC_DEBUG_BUILD \ + SQLITE_VEC_DEBUG_BUILD_AVX " " SQLITE_VEC_DEBUG_BUILD_NEON + +#define SQLITE_VEC_DEBUG_STRING \ + "Version: " SQLITE_VEC_VERSION "\n" \ + "Date: " SQLITE_VEC_DATE "\n" \ + "Commit: " SQLITE_VEC_SOURCE "\n" \ + "Build flags: " SQLITE_VEC_DEBUG_BUILD + +SQLITE_VEC_API int sqlite3_vec_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi) { +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT2(pApi); +#endif + int rc = SQLITE_OK; + +#define DEFAULT_FLAGS (SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC) + + rc = sqlite3_create_function_v2(db, "vec_version", 0, DEFAULT_FLAGS, + SQLITE_VEC_VERSION, _static_text_func, NULL, + NULL, NULL); + if (rc != SQLITE_OK) { + return rc; + } + rc = sqlite3_create_function_v2(db, "vec_debug", 0, DEFAULT_FLAGS, + SQLITE_VEC_DEBUG_STRING, _static_text_func, + NULL, NULL, NULL); + if (rc != SQLITE_OK) { + return rc; + } + static struct { + const char *zFName; + void (*xFunc)(sqlite3_context *, int, sqlite3_value **); + int nArg; + int flags; + } aFunc[] = { + // clang-format off + //{"vec_version", _static_text_func, 0, DEFAULT_FLAGS, (void *) SQLITE_VEC_VERSION }, + //{"vec_debug", _static_text_func, 0, DEFAULT_FLAGS, (void *) SQLITE_VEC_DEBUG_STRING }, + {"vec_distance_l2", vec_distance_l2, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_distance_l1", vec_distance_l1, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_distance_hamming",vec_distance_hamming, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_distance_cosine", vec_distance_cosine, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_length", vec_length, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE, }, + {"vec_type", vec_type, 1, DEFAULT_FLAGS, }, + {"vec_to_json", vec_to_json, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_add", vec_add, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_sub", vec_sub, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_slice", vec_slice, 3, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_normalize", vec_normalize, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_f32", vec_f32, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_bit", vec_bit, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_int8", vec_int8, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_quantize_int8", vec_quantize_int8, 2, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + {"vec_quantize_binary", vec_quantize_binary, 1, DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, }, + // clang-format on + }; + + static struct { + char *name; + const sqlite3_module *module; + void *p; + void (*xDestroy)(void *); + } aMod[] = { + // clang-format off + {"vec0", &vec0Module, NULL, NULL}, + {"vec_each", &vec_eachModule, NULL, NULL}, + // clang-format on + }; + + for (unsigned long i = 0; i < countof(aFunc) && rc == SQLITE_OK; i++) { + rc = sqlite3_create_function_v2(db, aFunc[i].zFName, aFunc[i].nArg, + aFunc[i].flags, NULL, aFunc[i].xFunc, NULL, + NULL, NULL); + if (rc != SQLITE_OK) { + *pzErrMsg = sqlite3_mprintf("Error creating function %s: %s", + aFunc[i].zFName, sqlite3_errmsg(db)); + return rc; + } + } + + for (unsigned long i = 0; i < countof(aMod) && rc == SQLITE_OK; i++) { + rc = sqlite3_create_module_v2(db, aMod[i].name, aMod[i].module, NULL, NULL); + if (rc != SQLITE_OK) { + *pzErrMsg = sqlite3_mprintf("Error creating module %s: %s", aMod[i].name, + sqlite3_errmsg(db)); + return rc; + } + } + + return SQLITE_OK; +} + +#ifndef SQLITE_VEC_OMIT_FS +SQLITE_VEC_API int sqlite3_vec_numpy_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi) { + UNUSED_PARAMETER(pzErrMsg); +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT2(pApi); +#endif + int rc = SQLITE_OK; + rc = sqlite3_create_function_v2(db, "vec_npy_file", 1, SQLITE_RESULT_SUBTYPE, + NULL, vec_npy_file, NULL, NULL, NULL); + if(rc != SQLITE_OK) { + return rc; + } + rc = sqlite3_create_module_v2(db, "vec_npy_each", &vec_npy_eachModule, NULL, NULL); + return rc; +} +#endif + +SQLITE_VEC_API int +sqlite3_vec_static_blobs_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi) { + UNUSED_PARAMETER(pzErrMsg); +#ifndef SQLITE_CORE + SQLITE_EXTENSION_INIT2(pApi); +#endif + + int rc = SQLITE_OK; + vec_static_blob_data *static_blob_data; + static_blob_data = sqlite3_malloc(sizeof(*static_blob_data)); + if (!static_blob_data) { + return SQLITE_NOMEM; + } + memset(static_blob_data, 0, sizeof(*static_blob_data)); + + rc = sqlite3_create_function_v2( + db, "vec_static_blob_from_raw", 4, + DEFAULT_FLAGS | SQLITE_SUBTYPE | SQLITE_RESULT_SUBTYPE, NULL, + vec_static_blob_from_raw, NULL, NULL, NULL); + if (rc != SQLITE_OK) + return rc; + + rc = sqlite3_create_module_v2(db, "vec_static_blobs", &vec_static_blobsModule, + static_blob_data, sqlite3_free); + if (rc != SQLITE_OK) + return rc; + rc = sqlite3_create_module_v2(db, "vec_static_blob_entries", + &vec_static_blob_entriesModule, + static_blob_data, NULL); + if (rc != SQLITE_OK) + return rc; + return rc; +} diff --git a/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h new file mode 100644 index 00000000000..084035db693 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/sqlite-vec.h @@ -0,0 +1,41 @@ +#ifndef SQLITE_VEC_H +#define SQLITE_VEC_H + +#ifndef SQLITE_CORE +#include "sqlite3ext.h" +#else +#include "sqlite3.h" +#endif + +#ifdef SQLITE_VEC_STATIC + #define SQLITE_VEC_API +#else + #ifdef _WIN32 + #define SQLITE_VEC_API __declspec(dllexport) + #else + #define SQLITE_VEC_API + #endif +#endif + +#define SQLITE_VEC_VERSION "v0.1.7-alpha.2" +// TODO rm +#define SQLITE_VEC_DATE "2025-01-10T23:18:50Z+0000" +#define SQLITE_VEC_SOURCE "bdc336d1cf2a2222b6227784bd30c6631603279b" + + +#define SQLITE_VEC_VERSION_MAJOR 0 +#define SQLITE_VEC_VERSION_MINOR 1 +#define SQLITE_VEC_VERSION_PATCH 7 + +#ifdef __cplusplus +extern "C" { +#endif + +SQLITE_VEC_API int sqlite3_vec_init(sqlite3 *db, char **pzErrMsg, + const sqlite3_api_routines *pApi); + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef SQLITE_VEC_H */ diff --git a/third_party/sqlite3/ext/sqlite-vec/vendor.sh b/third_party/sqlite3/ext/sqlite-vec/vendor.sh new file mode 100644 index 00000000000..98b5faf1e52 --- /dev/null +++ b/third_party/sqlite3/ext/sqlite-vec/vendor.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# IMPORTANT: use `./mach vendor third_party/sqlite3/ext-sqlite-vec.yaml`, +# don't invoke this script directly. + +# Script to download header from sqlite-vec extension amalgamation. + +set -e + +# Retrieve latest version value. +echo "" +echo "Get extension version." +version=`cat VERSION.txt` +echo "Github version: $version"; + +# Retrieve files and update sources. + +echo "" +echo "Retrieving amalgamation..." +amalgamation_url=""https://github.com/asg017/sqlite-vec/releases/download/v$version/sqlite-vec-$version-amalgamation.zip"" +wget -t 3 --retry-connrefused -w 5 --random-wait $amalgamation_url -qO amalgamation.zip +echo "Unpacking source files..." +unzip -p "amalgamation.zip" "sqlite-vec.h" > "sqlite-vec.h" +rm -f "amalgamation.zip" + +echo "" +echo "Update complete, please commit and check in your changes." +echo "" diff --git a/third_party/sqlite3/readme.txt b/third_party/sqlite3/readme.txt new file mode 100644 index 00000000000..91b38b92ee8 --- /dev/null +++ b/third_party/sqlite3/readme.txt @@ -0,0 +1,11 @@ +To vendor a new version of SQLite: + + ./mach vendor third_party/sqlite3/moz.yaml + +To vendor new versions of SQLite extensions, check for moz.yaml +files in ext/ subfolders. For example, to vendor sqlite-vec: + + ./mach vendor third_party/sqlite3/ext/sqlite-vec/moz.yaml + +Vendoring tracks GitHub tags, specific tags can be targeted +using the --revision option. diff --git a/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs b/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs index 547427767db..34d755bafe8 100644 --- a/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs +++ b/toolkit/actors/UserCharacteristicsCanvasRenderingChild.sys.mjs @@ -75,7 +75,9 @@ export class UserCharacteristicsCanvasRenderingChild extends JSWindowActorChild }; } - return sha1(canvas.toDataURL("image/png", 1)).catch(stringifyError); + return sha1Uint8Array( + ctx.getImageData(0, 0, canvas.width, canvas.height).data + ).catch(stringifyError); }; const errors = []; @@ -360,9 +362,8 @@ ChromeUtils.defineLazyGetter(lazy, "recipes", () => { }; }); -async function sha1(message) { - const msgUint8 = new TextEncoder().encode(message); - const hashBuffer = await crypto.subtle.digest("SHA-1", msgUint8); +async function sha1Uint8Array(bytes) { + const hashBuffer = await crypto.subtle.digest("SHA-1", bytes); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); return hashHex; diff --git a/toolkit/components/antitracking/test/browser/browser.toml b/toolkit/components/antitracking/test/browser/browser.toml index 10d63f781bd..77888171d77 100644 --- a/toolkit/components/antitracking/test/browser/browser.toml +++ b/toolkit/components/antitracking/test/browser/browser.toml @@ -219,6 +219,9 @@ support-files = [ "!/browser/components/originattributes/test/browser/file_thirdPartyChild.worker.xhr.html", "!/browser/components/originattributes/test/browser/file_thirdPartyChild.xhr.html", ] +skip-if = [ + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && debug", # Bug 1775745 +] ["browser_staticPartition_network.js"] diff --git a/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml b/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml index aa238969fd3..3b2b4500596 100644 --- a/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml +++ b/toolkit/components/backgroundhangmonitor/tests/xpcshell.toml @@ -9,6 +9,7 @@ skip-if = [ "os == 'mac' && os_version == '10.15' && processor == 'x86_64' && opt", # Bug 1417723 "os == 'mac' && os_version == '11.20' && arch == 'aarch64' && opt", # Bug 1417723 "os == 'mac' && os_version == '14.70' && processor == 'x86_64' && opt", # Bug 1417723 + "os == 'mac' && os_version == '15.30' && arch == 'aarch64' && opt", # Bug 1417723 "os == 'win' && msix", "release_or_beta", "win11_2009 && bits == 32", # Bug 1760134 diff --git a/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs b/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs index 38c64ff4f40..5109074b2b0 100644 --- a/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs +++ b/toolkit/components/credentialmanagement/CredentialChooserService.sys.mjs @@ -39,7 +39,9 @@ XPCOMUtils.defineLazyPreferenceGetter( */ async function setIconToFavicon(icon, origin) { try { - let iconData = await lazy.PlacesUtils.promiseFaviconData(origin); + let iconData = await lazy.PlacesUtils.favicons.getFaviconForPage( + lazy.PlacesUtils.toURI(origin) + ); icon.src = iconData.uri.spec; } catch { icon.src = "chrome://global/skin/icons/defaultFavicon.svg"; diff --git a/browser/components/doh/DoHConfig.sys.mjs b/toolkit/components/doh/DoHConfig.sys.mjs similarity index 94% rename from browser/components/doh/DoHConfig.sys.mjs rename to toolkit/components/doh/DoHConfig.sys.mjs index 4eb82546119..f0d8e631a2f 100644 --- a/browser/components/doh/DoHConfig.sys.mjs +++ b/toolkit/components/doh/DoHConfig.sys.mjs @@ -262,20 +262,22 @@ export const DoHConfigController = { observe(subject, topic, data) { switch (topic) { case kPrefChangedTopic: - let allowedPrefs = Object.getOwnPropertyNames(kConfigPrefs).map( - k => kConfigPrefs[k] - ); - if ( - !allowedPrefs.some(pref => - [ - `${regionPrefBranch()}.${pref}`, - `${kGlobalPrefBranch}.${pref}`, - ].includes(data) - ) - ) { - break; + { + let allowedPrefs = Object.getOwnPropertyNames(kConfigPrefs).map( + k => kConfigPrefs[k] + ); + if ( + !allowedPrefs.some(pref => + [ + `${regionPrefBranch()}.${pref}`, + `${kGlobalPrefBranch}.${pref}`, + ].includes(data) + ) + ) { + break; + } + this.notifyNewConfig(); } - this.notifyNewConfig(); break; case "idle-daily": if ( @@ -331,7 +333,11 @@ export const DoHConfigController = { return; } - if (localConfig.rolloutEnabled) { + let isAndroid = Services.appinfo.OS === "Android"; + if ( + (isAndroid && localConfig.androidRolloutEnabled) || + (!isAndroid && localConfig.rolloutEnabled) + ) { newConfig.enabled = true; } diff --git a/browser/components/doh/DoHController.sys.mjs b/toolkit/components/doh/DoHController.sys.mjs similarity index 99% rename from browser/components/doh/DoHController.sys.mjs rename to toolkit/components/doh/DoHController.sys.mjs index 2892ffd91e9..017de747c84 100644 --- a/browser/components/doh/DoHController.sys.mjs +++ b/toolkit/components/doh/DoHController.sys.mjs @@ -14,9 +14,9 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { AsyncShutdown: "resource://gre/modules/AsyncShutdown.sys.mjs", ClientID: "resource://gre/modules/ClientID.sys.mjs", - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs", - Heuristics: "resource:///modules/DoHHeuristics.sys.mjs", + Heuristics: "resource://gre/modules/DoHHeuristics.sys.mjs", NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs", Preferences: "resource://gre/modules/Preferences.sys.mjs", clearTimeout: "resource://gre/modules/Timer.sys.mjs", @@ -589,7 +589,7 @@ export const DoHController = { // Importing the module here saves us from having to do it at startup, and // ensures tests have time to set prefs before the module initializes. let { TRRRacer } = ChromeUtils.importESModule( - "resource:///modules/TRRPerformance.sys.mjs" + "resource://gre/modules/TRRPerformance.sys.mjs" ); await new Promise(resolve => { let trrList = diff --git a/browser/components/doh/DoHHeuristics.sys.mjs b/toolkit/components/doh/DoHHeuristics.sys.mjs similarity index 98% rename from browser/components/doh/DoHHeuristics.sys.mjs rename to toolkit/components/doh/DoHHeuristics.sys.mjs index ecbc0f5b779..fd39a9be17c 100644 --- a/browser/components/doh/DoHHeuristics.sys.mjs +++ b/toolkit/components/doh/DoHHeuristics.sys.mjs @@ -26,7 +26,7 @@ XPCOMUtils.defineLazyServiceGetter( ); ChromeUtils.defineESModuleGetters(lazy, { - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", }); const GLOBAL_CANARY = "use-application-dns.net."; @@ -279,6 +279,10 @@ async function thirdPartyRoots() { } async function enterprisePolicy() { + if (!Services.policies) { + return "no_policy_set"; + } + if (Services.policies.status === Services.policies.ACTIVE) { let policies = Services.policies.getActivePolicies(); diff --git a/browser/components/doh/DoHTestUtils.sys.mjs b/toolkit/components/doh/DoHTestUtils.sys.mjs similarity index 100% rename from browser/components/doh/DoHTestUtils.sys.mjs rename to toolkit/components/doh/DoHTestUtils.sys.mjs diff --git a/browser/components/doh/TRRPerformance.sys.mjs b/toolkit/components/doh/TRRPerformance.sys.mjs similarity index 99% rename from browser/components/doh/TRRPerformance.sys.mjs rename to toolkit/components/doh/TRRPerformance.sys.mjs index 370a94471bd..ac18209606f 100644 --- a/browser/components/doh/TRRPerformance.sys.mjs +++ b/toolkit/components/doh/TRRPerformance.sys.mjs @@ -77,6 +77,9 @@ function getRandomSubdomain() { // callback. The wrapper attempts the lookup 3 times before passing on a failure. // If a false-y `domain` is supplied, a random subdomain will be used. Each retry // will use a different random subdomain to ensure we bypass chached responses. +/** + * + */ export class DNSLookup { constructor(domain, trrServer, callback) { this._domain = domain; @@ -120,6 +123,9 @@ DNSLookup.prototype.QueryInterface = ChromeUtils.generateQI(["nsIDNSListener"]); // A wrapper around a single set of measurements. The required lookups are // triggered and the results aggregated before telemetry is sent. If aborted, // any aggregated results are discarded. +/** + * + */ export class LookupAggregator { constructor(onCompleteCallback, trrList) { this.onCompleteCallback = onCompleteCallback; @@ -221,6 +227,9 @@ export class LookupAggregator { // When the network goes down, an ongoing aggregator is aborted and a new one // spawned next time we get a link, up to 5 times. On the fifth time, we just // let the aggegator complete and mark it as tainted. +/** + * + */ export class TRRRacer { constructor(onCompleteCallback, trrList) { this._aggregator = null; diff --git a/browser/components/doh/metrics.yaml b/toolkit/components/doh/metrics.yaml similarity index 100% rename from browser/components/doh/metrics.yaml rename to toolkit/components/doh/metrics.yaml diff --git a/browser/components/doh/moz.build b/toolkit/components/doh/moz.build similarity index 92% rename from browser/components/doh/moz.build rename to toolkit/components/doh/moz.build index 05030b09ab7..3dbc9ac2171 100644 --- a/browser/components/doh/moz.build +++ b/toolkit/components/doh/moz.build @@ -5,7 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. with Files("**"): - BUG_COMPONENT = ("Firefox", "Security") + BUG_COMPONENT = ("Core", "Networking: DNS") EXTRA_JS_MODULES += [ "DoHConfig.sys.mjs", diff --git a/browser/components/doh/test/browser/browser.toml b/toolkit/components/doh/test/browser/browser.toml similarity index 86% rename from browser/components/doh/test/browser/browser.toml rename to toolkit/components/doh/test/browser/browser.toml index a8df8bea0c7..5124955ef16 100644 --- a/browser/components/doh/test/browser/browser.toml +++ b/toolkit/components/doh/test/browser/browser.toml @@ -1,5 +1,6 @@ [DEFAULT] head = "head.js" +skip-if = ["os == 'android'"] # browser-chrome tests don't work on android ["browser_cleanFlow.js"] diff --git a/browser/components/doh/test/browser/browser_cleanFlow.js b/toolkit/components/doh/test/browser/browser_cleanFlow.js similarity index 100% rename from browser/components/doh/test/browser/browser_cleanFlow.js rename to toolkit/components/doh/test/browser/browser_cleanFlow.js diff --git a/browser/components/doh/test/browser/browser_dirtyEnable.js b/toolkit/components/doh/test/browser/browser_dirtyEnable.js similarity index 100% rename from browser/components/doh/test/browser/browser_dirtyEnable.js rename to toolkit/components/doh/test/browser/browser_dirtyEnable.js diff --git a/browser/components/doh/test/browser/browser_doh_region.js b/toolkit/components/doh/test/browser/browser_doh_region.js similarity index 100% rename from browser/components/doh/test/browser/browser_doh_region.js rename to toolkit/components/doh/test/browser/browser_doh_region.js diff --git a/browser/components/doh/test/browser/browser_doorhangerUserReject.js b/toolkit/components/doh/test/browser/browser_doorhangerUserReject.js similarity index 100% rename from browser/components/doh/test/browser/browser_doorhangerUserReject.js rename to toolkit/components/doh/test/browser/browser_doorhangerUserReject.js diff --git a/browser/components/doh/test/browser/browser_platformDetection.js b/toolkit/components/doh/test/browser/browser_platformDetection.js similarity index 98% rename from browser/components/doh/test/browser/browser_platformDetection.js rename to toolkit/components/doh/test/browser/browser_platformDetection.js index 025546ae9ec..4d7dd6f6432 100644 --- a/browser/components/doh/test/browser/browser_platformDetection.js +++ b/toolkit/components/doh/test/browser/browser_platformDetection.js @@ -5,7 +5,7 @@ "use strict"; ChromeUtils.defineESModuleGetters(this, { - Heuristics: "resource:///modules/DoHHeuristics.sys.mjs", + Heuristics: "resource://gre/modules/DoHHeuristics.sys.mjs", }); add_task(setup); diff --git a/browser/components/doh/test/browser/browser_policyOverride.js b/toolkit/components/doh/test/browser/browser_policyOverride.js similarity index 100% rename from browser/components/doh/test/browser/browser_policyOverride.js rename to toolkit/components/doh/test/browser/browser_policyOverride.js diff --git a/browser/components/doh/test/browser/browser_providerSteering.js b/toolkit/components/doh/test/browser/browser_providerSteering.js similarity index 100% rename from browser/components/doh/test/browser/browser_providerSteering.js rename to toolkit/components/doh/test/browser/browser_providerSteering.js diff --git a/browser/components/doh/test/browser/browser_remoteSettings_newProfile.js b/toolkit/components/doh/test/browser/browser_remoteSettings_newProfile.js similarity index 100% rename from browser/components/doh/test/browser/browser_remoteSettings_newProfile.js rename to toolkit/components/doh/test/browser/browser_remoteSettings_newProfile.js diff --git a/browser/components/doh/test/browser/browser_remoteSettings_rollout.js b/toolkit/components/doh/test/browser/browser_remoteSettings_rollout.js similarity index 100% rename from browser/components/doh/test/browser/browser_remoteSettings_rollout.js rename to toolkit/components/doh/test/browser/browser_remoteSettings_rollout.js diff --git a/browser/components/doh/test/browser/browser_rollback.js b/toolkit/components/doh/test/browser/browser_rollback.js similarity index 100% rename from browser/components/doh/test/browser/browser_rollback.js rename to toolkit/components/doh/test/browser/browser_rollback.js diff --git a/browser/components/doh/test/browser/browser_throttle_heuristics.js b/toolkit/components/doh/test/browser/browser_throttle_heuristics.js similarity index 100% rename from browser/components/doh/test/browser/browser_throttle_heuristics.js rename to toolkit/components/doh/test/browser/browser_throttle_heuristics.js diff --git a/browser/components/doh/test/browser/browser_trrSelect.js b/toolkit/components/doh/test/browser/browser_trrSelect.js similarity index 100% rename from browser/components/doh/test/browser/browser_trrSelect.js rename to toolkit/components/doh/test/browser/browser_trrSelect.js diff --git a/browser/components/doh/test/browser/browser_trrSelection_disable.js b/toolkit/components/doh/test/browser/browser_trrSelection_disable.js similarity index 100% rename from browser/components/doh/test/browser/browser_trrSelection_disable.js rename to toolkit/components/doh/test/browser/browser_trrSelection_disable.js diff --git a/browser/components/doh/test/browser/browser_userInterference.js b/toolkit/components/doh/test/browser/browser_userInterference.js similarity index 100% rename from browser/components/doh/test/browser/browser_userInterference.js rename to toolkit/components/doh/test/browser/browser_userInterference.js diff --git a/browser/components/doh/test/browser/head.js b/toolkit/components/doh/test/browser/head.js similarity index 98% rename from browser/components/doh/test/browser/head.js rename to toolkit/components/doh/test/browser/head.js index 236680d8d09..53c56d1750d 100644 --- a/browser/components/doh/test/browser/head.js +++ b/toolkit/components/doh/test/browser/head.js @@ -2,10 +2,10 @@ ChromeUtils.defineESModuleGetters(this, { ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs", - DoHConfigController: "resource:///modules/DoHConfig.sys.mjs", - DoHController: "resource:///modules/DoHController.sys.mjs", + DoHConfigController: "resource://gre/modules/DoHConfig.sys.mjs", + DoHController: "resource://gre/modules/DoHController.sys.mjs", DoHTestUtils: "resource://testing-common/DoHTestUtils.sys.mjs", - Heuristics: "resource:///modules/DoHHeuristics.sys.mjs", + Heuristics: "resource://gre/modules/DoHHeuristics.sys.mjs", Preferences: "resource://gre/modules/Preferences.sys.mjs", Region: "resource://gre/modules/Region.sys.mjs", RegionTestUtils: "resource://testing-common/RegionTestUtils.sys.mjs", diff --git a/browser/components/doh/test/unit/head.js b/toolkit/components/doh/test/unit/head.js similarity index 90% rename from browser/components/doh/test/unit/head.js rename to toolkit/components/doh/test/unit/head.js index 3c8010cba3c..c2f949b51b3 100644 --- a/browser/components/doh/test/unit/head.js +++ b/toolkit/components/doh/test/unit/head.js @@ -33,14 +33,13 @@ function addCertFromFile(certdb, filename, trustString) { certdb.addCertFromBase64(pem, trustString); } -function ensureNoTelemetry() { +async function ensureNoTelemetry() { let events = - Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent || []; - events = events.filter(e => e[1] == "security.doh.trrPerformance"); - Assert.ok(!events.length); + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + Assert.ok( + !events || + !events.filter(e => e.category == "security.doh.trr_performance").length + ); } function setup() { @@ -80,7 +79,7 @@ function setup() { ); let TRRPerformance = ChromeUtils.importESModule( - "resource:///modules/TRRPerformance.sys.mjs" + "resource://gre/modules/TRRPerformance.sys.mjs" ); DNSLookup = TRRPerformance.DNSLookup; diff --git a/browser/components/doh/test/unit/test_DNSLookup.js b/toolkit/components/doh/test/unit/test_DNSLookup.js similarity index 100% rename from browser/components/doh/test/unit/test_DNSLookup.js rename to toolkit/components/doh/test/unit/test_DNSLookup.js diff --git a/browser/components/doh/test/unit/test_LookupAggregator.js b/toolkit/components/doh/test/unit/test_LookupAggregator.js similarity index 88% rename from browser/components/doh/test/unit/test_LookupAggregator.js rename to toolkit/components/doh/test/unit/test_LookupAggregator.js index e63920ee351..269d4d19418 100644 --- a/browser/components/doh/test/unit/test_LookupAggregator.js +++ b/toolkit/components/doh/test/unit/test_LookupAggregator.js @@ -14,6 +14,7 @@ async function helper_SuccessfulLookupAggregator( networkUnstable = false, captivePortal = false ) { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let aggregator = new LookupAggregator(() => deferred.resolve(), trrList); // The aggregator's domain list should correctly reflect our set @@ -38,24 +39,23 @@ async function helper_SuccessfulLookupAggregator( Assert.equal(aggregator.captivePortal, captivePortal); Assert.equal(aggregator.results.length, aggregator.totalLookups); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + info(events); + + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, aggregator.totalLookups); for (let event of events) { info(JSON.stringify(event)); - Assert.equal(event[1], "security.doh.trrPerformance"); - Assert.equal(event[2], "resolved"); - Assert.equal(event[3], "record"); - Assert.equal(event[4], "success"); + Assert.equal(event.category, "security.doh.trr_performance"); + Assert.equal(event.name, "resolved_record"); + Assert.equal(event.extra.value, "success"); } // We only need to check the payload of each event from here on. - events = events.map(e => e[5]); + events = events.map(e => e.extra); for (let trr of [trrServer1, trrServer2]) { // There should be two results for random subdomains. @@ -114,7 +114,7 @@ async function helper_SuccessfulLookupAggregator( } } - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); } add_task(async function test_SuccessfulLookupAggregator() { @@ -125,6 +125,7 @@ add_task(async function test_SuccessfulLookupAggregator() { }); add_task(async function test_AbortedLookupAggregator() { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let aggregator = new LookupAggregator(() => deferred.resolve(), trrList); // The aggregator's domain list should correctly reflect our set @@ -152,11 +153,7 @@ add_task(async function test_AbortedLookupAggregator() { Assert.ok(!aggregator.captivePortal); // Ensure we send no telemetry for an aborted run! - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok( - !events || !events.filter(e => e[1] == "security.doh.trrPerformance").length - ); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + Assert.ok(!events || !events.length); }); diff --git a/browser/components/doh/test/unit/test_TRRRacer.js b/toolkit/components/doh/test/unit/test_TRRRacer.js similarity index 87% rename from browser/components/doh/test/unit/test_TRRRacer.js rename to toolkit/components/doh/test/unit/test_TRRRacer.js index 9ad38f3981a..c43e284099c 100644 --- a/browser/components/doh/test/unit/test_TRRRacer.js +++ b/toolkit/components/doh/test/unit/test_TRRRacer.js @@ -7,6 +7,7 @@ add_task(setup); add_task(async function test_TRRRacer_cleanRun() { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let racer = new TRRRacer(() => { deferred.resolve(); @@ -17,15 +18,12 @@ add_task(async function test_TRRRacer_cleanRun() { await deferred.promise; Assert.equal(racer._retryCount, 1); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, racer._aggregator.totalLookups); - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); // Simulate network changes and ensure no re-runs since it's already complete. async function testNetworkChange(captivePortal = false) { @@ -44,7 +42,7 @@ add_task(async function test_TRRRacer_cleanRun() { } Assert.equal(racer._retryCount, 1); - ensureNoTelemetry(); + await ensureNoTelemetry(); if (captivePortal) { Services.obs.notifyObservers(null, "captive-portal-login-abort"); @@ -56,6 +54,7 @@ add_task(async function test_TRRRacer_cleanRun() { }); async function test_TRRRacer_networkFlux_helper(captivePortal = false) { + Services.fog.testResetFOG(); let deferred = Promise.withResolvers(); let racer = new TRRRacer(() => { deferred.resolve(); @@ -70,7 +69,7 @@ async function test_TRRRacer_networkFlux_helper(captivePortal = false) { } Assert.ok(racer._aggregator.aborted); - ensureNoTelemetry(); + await ensureNoTelemetry(); Assert.equal(racer._retryCount, 1); Assert.ok(!deferred.resolved); @@ -85,15 +84,12 @@ async function test_TRRRacer_networkFlux_helper(captivePortal = false) { Assert.equal(racer._retryCount, 2); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, racer._aggregator.totalLookups); - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); if (captivePortal) { Services.obs.notifyObservers(null, "captive-portal-login-abort"); } @@ -123,7 +119,7 @@ async function test_TRRRacer_maxRetries_helper(captivePortal = false) { info("notified observers"); Assert.ok(racer._aggregator.aborted); - ensureNoTelemetry(); + await ensureNoTelemetry(); Assert.equal(racer._retryCount, i); Assert.ok(!deferred.resolved); @@ -145,15 +141,12 @@ async function test_TRRRacer_maxRetries_helper(captivePortal = false) { await deferred.promise; Assert.equal(racer._retryCount, 5); - let events = Services.telemetry.snapshotEvents( - Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, - true - ).parent; - Assert.ok(events); - events = events.filter(e => e[1] == "security.doh.trrPerformance"); + let events = + await Glean.securityDohTrrPerformance.resolvedRecord.testGetValue(); + events = events.filter(e => e.category == "security.doh.trr_performance"); Assert.equal(events.length, racer._aggregator.totalLookups); - Services.telemetry.clearEvents(); + Services.fog.testResetFOG(); if (captivePortal) { Services.obs.notifyObservers(null, "captive-portal-login-abort"); } diff --git a/browser/components/doh/test/unit/test_heuristics.js b/toolkit/components/doh/test/unit/test_heuristics.js similarity index 97% rename from browser/components/doh/test/unit/test_heuristics.js rename to toolkit/components/doh/test/unit/test_heuristics.js index a6a6c9b6c9c..cc487b46272 100644 --- a/browser/components/doh/test/unit/test_heuristics.js +++ b/toolkit/components/doh/test/unit/test_heuristics.js @@ -35,7 +35,7 @@ add_task(setup); add_task(async function test_parentalControls() { let DoHHeuristics = ChromeUtils.importESModule( - "resource:///modules/DoHHeuristics.sys.mjs" + "resource://gre/modules/DoHHeuristics.sys.mjs" ); let parentalControls = DoHHeuristics.parentalControls; diff --git a/browser/components/doh/test/unit/xpcshell.toml b/toolkit/components/doh/test/unit/xpcshell.toml similarity index 100% rename from browser/components/doh/test/unit/xpcshell.toml rename to toolkit/components/doh/test/unit/xpcshell.toml diff --git a/toolkit/components/formautofill/FormAutofillChild.sys.mjs b/toolkit/components/formautofill/FormAutofillChild.sys.mjs index 062c0b0dae4..d17cdc759be 100644 --- a/toolkit/components/formautofill/FormAutofillChild.sys.mjs +++ b/toolkit/components/formautofill/FormAutofillChild.sys.mjs @@ -528,6 +528,7 @@ export class FormAutofillChild extends JSWindowActorChild { * - NODES_REMOVED: HTMLElement[] - nodes removed * - ELEMENT_VISIBLE: HTMLElement[] - elements that became visible * - ELEMENT_INVISIBLE: HTMLElement[] - elements that became invisible + * - SELECT_OPTIONS_CHANGED: HTMLSelectElement[] - select elements with modified options * A form-change event is single-reasoned for visibility changes and can be multi-reasoned for mutations. */ async onFormChange(form, changes) { @@ -619,14 +620,17 @@ export class FormAutofillChild extends JSWindowActorChild { const currentFields = lazy.FormAutofillHandler.collectFormFieldDetails(currentForm); + const changedSelectElements = + changes[lazy.FORM_CHANGE_REASON.SELECT_OPTIONS_CHANGED]; if ( currentFields.length == handler.fieldDetails.length && currentFields.every( (field, idx) => field.element === handler.fieldDetails[idx].element - ) + ) && + !changedSelectElements.length ) { - // The detected form fields remain unchanged, - // so we don't notify the parent and the subtree children + // All detected fields (including options from detected