diff --git a/README.md b/README.md
index 80b6ce539..bfa013976 100644
--- a/README.md
+++ b/README.md
@@ -43,16 +43,17 @@ from a Photos library on a Linux machine.
Tested on macOS Sierra (10.12.6) through macOS Sonoma (14.1). Tested on both x86 and Apple silicon (M1).
-| macOS Version | macOS name | Photos.app version |
-| ----------------- |------------|:-------------------|
-| 14.0 - 14.3 | Sonoma | 9.0 ✅ |
-| 13.0 - 13.6 | Ventura | 8.0 ✅ |
-| 12.0 - 12.7 | Monterey | 7.0 ✅ |
-| 10.16, 11.0-11.7 | Big Sur | 6.0 ✅ |
-| 10.15.1 - 10.15.7 | Catalina | 5.0 ✅ |
-| 10.14.5, 10.14.6 | Mojave | 4.0 ✅ |
-| 10.13.6 | High Sierra| 3.0 ✅ |
-| 10.12.6 | Sierra | 2.0 ✅ |
+| macOS Version | macOS name | Photos.app version |
+| ----------------- |------------|:--------------------|
+| 15.0 dev preview | Sequoia | 10.0 (alpha support)|
+| 14.0 - 14.3 | Sonoma | 9.0 ✅ |
+| 13.0 - 13.6 | Ventura | 8.0 ✅ |
+| 12.0 - 12.7 | Monterey | 7.0 ✅ |
+| 10.16, 11.0-11.7 | Big Sur | 6.0 ✅ |
+| 10.15.1 - 10.15.7 | Catalina | 5.0 ✅ |
+| 10.14.5, 10.14.6 | Mojave | 4.0 ✅ |
+| 10.13.6 | High Sierra| 3.0 ✅ |
+| 10.12.6 | Sierra | 2.0 ✅ |
Limited support is also provided for exporting photos and metadata from iPhoto libraries. Only iPhoto 9.6.1 (the final release) has been tested.
@@ -60,6 +61,8 @@ This package will read Photos databases for any supported version on any support
Requires python >= `3.9`, <= `3.12`. Reading iPhoto libraries requires python >= `3.10`.
+For macOS 15.0 / Sequoia developer preview, alpha support is provided (very preliminary, not guaranteed to work). Not all features of osxphotos have been tested and some features may not work. If you encounter issues, please open an issue on GitHub.
+
## Installation
If you are new to python, I recommend you install osxphotos using pipx. See other options below.
@@ -114,10 +117,10 @@ If you want to work on osxphotos code or contribute to the project, you can inst
> [!NOTE]
> The git repo for this project is very large (> 3GB) because it contains multiple Photos libraries used for testing on different versions of macOS.
>
-> If you just want to use the osxphotos package in your own code, I recommend you install the latest version from [PyPI](https://pypi.org/project/osxphotos/) which does not include all the test libraries. If you just want to use the command line utility, you can download a pre-built executable of the latest [release](https://github.com/RhetTbull/osxphotos/releases) or you can install via `pip` which also installs the command line app. If you aren't comfortable with running python on your Mac, start with the pre-built executable or `pipx` as described above.
+> If you just want to use the osxphotos package in your own code, I recommend you install the latest version from [PyPI](https://pypi.org/project/osxphotos/) which does not include all the test libraries. If you just want to use the command line utility, you can download a pre-built executable of the latest [release](https://github.com/RhetTbull/osxphotos/releases) or you can install via `pip` which also installs the command line app. If you aren't comfortable with running python on your Mac, start with the pre-built executable or `pipx` as described above.
>
> Alternatively, to clone the repository without the test data:
->
+>
> git clone --filter=blob:none --no-checkout --sparse https://github.com/RhetTbull/osxphotos.git
> cd osxphotos
> git sparse-checkout set --no-cone '/*' '!tests'
@@ -331,7 +334,7 @@ If your photos are organized in folders and albums in Photos you can preserve th
`osxphotos export /path/to/export --directory "{folder_album}"`
-Photos can belong to more than one album. In this case, the template field `{folder_album}` will expand to all the album names that the photo belongs to. For example, if a photo belongs to the albums `Vacation` and `Travel`, the template field `{folder_album}` would expand to `Vacation`, `Travel`. If the photo belongs to no albums, the template field `{folder_album}` would expand to "_" (the default value).
+Photos can belong to more than one album. In this case, the template field `{folder_album}` will expand to all the album names that the photo belongs to. For example, if a photo belongs to the albums `Vacation` and `Travel`, the template field `{folder_album}` would expand to `Vacation`, `Travel`. If the photo belongs to no albums, the template field `{folder_album}` would expand to "_" (the default value).
All template fields including `{folder_album}` can be further filtered using a number of different filters. To convert all directory names to lower case for example, use the `lower` filter:
@@ -352,8 +355,8 @@ By default, osxphotos will use the original filename of the photo when exporting
The above command will export photos using the title. Note that you don't need to specify the extension as part of the `--filename` template as osxphotos will automatically add the correct file extension. Some photos might not have a title so in this case, you could use the default value feature to specify a different name for these photos. For example, to use the title as the filename, but if no title is specified, use the original filename instead:
osxphotos export /path/to/export --filename "{title,{original_name}}"
- │ ││ │
- │ ││ │
+ │ ││ │
+ │ ││ │
Use photo's title as the filename <──────┘ ││ │
││ │
Value after comma will be used <───────┘│ │
@@ -367,8 +370,8 @@ The above command will export photos using the title. Note that you don't need
The osxphotos template system also allows for limited conditional logic of the type "If a condition is true then do one thing, otherwise, do a different thing". For example, you can use the `--filename` option to name files that are marked as "Favorites" in Photos differently than other files. For example, to add a "#" to the name of every photo that's a favorite:
osxphotos export /path/to/export --filename "{original_name}{favorite?#,}"
- │ │ │││
- │ │ │││
+ │ │ │││
+ │ │ │││
Use photo's original name as filename <──┘ │ │││
│ │││
'favorite' is True if photo is a Favorite, <───────┘ │││
@@ -424,7 +427,7 @@ All the above commands operate on the default Photos library. Most users only u
#### Missing photos
-osxphotos works by copying photos out of the Photos library folder to export them. You may see osxphotos report that one or more photos are missing and thus could not be exported. One possible reason for this is that you are using iCloud to synch your Photos library and Photos either hasn't yet synched the cloud library to the local Mac or you have Photos configured to "Optimize Mac Storage" in Photos Preferences. Another reason is that even if you have Photos configured to download originals to the Mac, Photos does not always download photos from shared albums or original screenshots to the Mac.
+osxphotos works by copying photos out of the Photos library folder to export them. You may see osxphotos report that one or more photos are missing and thus could not be exported. One possible reason for this is that you are using iCloud to synch your Photos library and Photos either hasn't yet synched the cloud library to the local Mac or you have Photos configured to "Optimize Mac Storage" in Photos Preferences. Another reason is that even if you have Photos configured to download originals to the Mac, Photos does not always download photos from shared albums or original screenshots to the Mac.
If you encounter missing photos you can tell osxphotos to download the missing photos from iCloud using the `--download-missing` option. `--download-missing` uses AppleScript to communicate with Photos and tell it to download the missing photos. Photos' AppleScript interface is somewhat buggy and you may find that Photos crashes. In this case, osxphotos will attempt to restart Photos to resume the download process. There's also an experimental `--use-photokit` option that will communicate with Photos using a different "PhotoKit" interface. This option must be used together with `--download-missing`:
@@ -454,12 +457,12 @@ This will write basic metadata such as keywords, persons, and GPS location to th
osxphotos export /path/to/export --exiftool --keyword-template "{folder_album(>)}"
│ │
- │ │
- folder_album results in the folder(s) <──┘ │
- and album a photo is contained in │
- │
- The value in () is used as the path separator <───────┘
- for joining the folders and albums. For example,
+ │ │
+ folder_album results in the folder(s) <──┘ │
+ and album a photo is contained in │
+ │
+ The value in () is used as the path separator <───────┘
+ for joining the folders and albums. For example,
if photo is in Folder1/Folder2/Album, (>) produces
"Folder1>Folder2>Album" which some programs, such as
Lightroom Classic, treat as hierarchical keywords
@@ -488,7 +491,7 @@ Another way to export metadata about your photos is through the use of sidecar f
`osxphotos export /path/to/export --sidecar XMP`
-Unlike `--exiftool`, you do not need to install exiftool to use the `--sidecar` feature. Many of the same configuration options that apply to `--exiftool` to modify metadata, for example, `--keyword-template` can also be used with `--sidecar`.
+Unlike `--exiftool`, you do not need to install exiftool to use the `--sidecar` feature. Many of the same configuration options that apply to `--exiftool` to modify metadata, for example, `--keyword-template` can also be used with `--sidecar`.
Sidecar files are named "photoname.ext.sidecar_ext". For example, if the photo is named `IMG_1234.JPG` and the sidecar format is XMP, the sidecar would be named `IMG_1234.JPG.XMP`. Some applications expect the sidecar in this case to be named `IMG_1234.XMP`. You can use the `-sidecar-drop-ext` option to force osxphotos to name the sidecar files in this manner:
@@ -595,21 +598,21 @@ In the template string above, `{newline}` instructs osxphotos to insert a new li
Explanation of the template string:
{title,}{title?{descr?{newline},},}{descr,}
- │ │ │ │ │ │ │
- │ │ │ │ │ │ │
- └──> insert title (or nothing if no title)
+ │ │ │ │ │ │ │
+ │ │ │ │ │ │ │
+ └──> insert title (or nothing if no title)
│ │ │ │ │ │
└───> is there a title?
│ │ │ │ │
- └───> if so, is there a description?
+ └───> if so, is there a description?
│ │ │ │
- └───> if so, insert new line
+ └───> if so, insert new line
│ │ │
└───> if descr is blank, insert nothing
- │ │
+ │ │
└───> if title is blank, insert nothing
│
- └───> finally, insert description
+ └───> finally, insert description
(or nothing if no description)
In this example, `title?` demonstrates use of the boolean (True/False) feature of the template system. `title?` is read as "Is the title True (or not blank/empty)? If so, then the value immediately following the `?` is used in place of `title`. If `title` is blank, then the value immediately following the comma is used instead. The format for boolean fields is `field?value if true,value if false`. Either `value if true` or `value if false` may be blank, in which case a blank string ("") is used for the value and both may also be an entirely new template string as seen in the above example. Using this format, template strings may be nested inside each other to form complex `if-then-else` statements.
@@ -634,13 +637,13 @@ The configuration file is a plain text file in [TOML](https://toml.io/en/) forma
#### Run commands on exported photos for post-processing
-You can use the `--post-command` option to run one or more commands against exported files. The `--post-command` option takes two arguments: CATEGORY and COMMAND. CATEGORY is a string that describes which category of file to run the command against. The available categories are described in the help text available via: `osxphotos help export`. For example, the `exported` category includes all exported photos and the `skipped` category includes all photos that were skipped when running export with `--update`. COMMAND is an osxphotos template string which will be rendered then passed to the shell for execution.
+You can use the `--post-command` option to run one or more commands against exported files. The `--post-command` option takes two arguments: CATEGORY and COMMAND. CATEGORY is a string that describes which category of file to run the command against. The available categories are described in the help text available via: `osxphotos help export`. For example, the `exported` category includes all exported photos and the `skipped` category includes all photos that were skipped when running export with `--update`. COMMAND is an osxphotos template string which will be rendered then passed to the shell for execution.
For example, the following command generates a log of all exported files and their associated keywords:
`osxphotos export /path/to/export --post-command exported "echo {shell_quote,{filepath}{comma}{,+keyword,}} >> {shell_quote,{export_dir}/exported.txt}"`
-The special template field `{shell_quote}` ensures a string is properly quoted for execution in the shell. For example, it's possible that a file path or keyword in this example has a space in the value and if not properly quoted, this would cause an error in the execution of the command. When running commands, the template `{filepath}` is set to the full path of the exported file and `{export_dir}` is set to the full path of the base export directory.
+The special template field `{shell_quote}` ensures a string is properly quoted for execution in the shell. For example, it's possible that a file path or keyword in this example has a space in the value and if not properly quoted, this would cause an error in the execution of the command. When running commands, the template `{filepath}` is set to the full path of the exported file and `{export_dir}` is set to the full path of the base export directory.
Explanation of the template string:
@@ -651,7 +654,7 @@ Explanation of the template string:
│ │ │ │
└───> filepath of the exported file
│ │ │
- └───> insert a comma
+ └───> insert a comma
│ │
└───> join the list of keywords together with a ","
│
@@ -1630,7 +1633,7 @@ Options:
depending on system dark mode setting.
-h, --help Show this message and exit.
- Export
+ Export
When exporting photos, osxphotos creates a database in the top-level export
folder called '.osxphotos_export.db'. This database preserves state
@@ -1662,7 +1665,7 @@ option to re-export the entire library thus rebuilding the
'.osxphotos_export.db' database.
- Extended Attributes
+ Extended Attributes
Some options (currently '--finder-tag-template', '--finder-tag-keywords',
'-xattr-template') write additional metadata accessible by Spotlight
@@ -1730,300 +1733,300 @@ For additional information on extended attributes see: https://developer.apple
_keys
- Templating System
+ Templating System
-The templating system converts one or template statements, written in
-osxphotos metadata templating language, to one or more rendered values using
-information from the photo being processed.
+The templating system converts one or template statements, written in
+osxphotos metadata templating language, to one or more rendered values using
+information from the photo being processed.
-In its simplest form, a template statement has the form: "{template_field}",
-for example "{title}" which would resolve to the title of the photo.
+In its simplest form, a template statement has the form: "{template_field}",
+for example "{title}" which would resolve to the title of the photo.
-Template statements may contain one or more modifiers. The full syntax is:
+Template statements may contain one or more modifiers. The full syntax is:
-"pretext{delim+template_field:subfield(field_arg)|filter[find,replace]
-conditional&combine_value?bool_value,default}posttext"
+"pretext{delim+template_field:subfield(field_arg)|filter[find,replace]
+conditional&combine_value?bool_value,default}posttext"
-Template statements are white-space sensitive meaning that white space
-(spaces, tabs) changes the meaning of the template statement.
+Template statements are white-space sensitive meaning that white space
+(spaces, tabs) changes the meaning of the template statement.
-pretext and posttext are free form text. For example, if a photo has title
-"My Photo Title" the template statement "The title of the photo is {title}",
-resolves to "The title of the photo is My Photo Title". The pretext in this
-example is "The title if the photo is " and the template_field is {title}.
+pretext and posttext are free form text. For example, if a photo has title
+"My Photo Title" the template statement "The title of the photo is {title}",
+resolves to "The title of the photo is My Photo Title". The pretext in this
+example is "The title if the photo is " and the template_field is {title}.
-delim: optional delimiter string to use when expanding multi-valued template
-values in-place
+delim: optional delimiter string to use when expanding multi-valued template
+values in-place
-+: If present before template name, expands the template in place. If delim
-not provided, values are joined with no delimiter.
++: If present before template name, expands the template in place. If delim
+not provided, values are joined with no delimiter.
-e.g. if Photo keywords are ["foo","bar"]:
+e.g. if Photo keywords are ["foo","bar"]:
- • "{keyword}" renders to "foo", "bar"
- • "{,+keyword}" renders to: "foo,bar"
- • "{; +keyword}" renders to: "foo; bar"
- • "{+keyword}" renders to "foobar"
+ • "{keyword}" renders to "foo", "bar"
+ • "{,+keyword}" renders to: "foo,bar"
+ • "{; +keyword}" renders to: "foo; bar"
+ • "{+keyword}" renders to "foobar"
template_field: The template field to resolve. See Template Substitutions for
-full list of template fields.
+full list of template fields.
-:subfield: Some templates have sub-fields, For example, {exiftool:IPTC:Make};
-the template_field is exiftool and the sub-field is IPTC:Make.
+:subfield: Some templates have sub-fields, For example, {exiftool:IPTC:Make};
+the template_field is exiftool and the sub-field is IPTC:Make.
-(field_arg): optional arguments to pass to the field; for example, with
-{folder_album} this is used to pass the path separator used for joining
-folders and albums when rendering the field (default is "/" for
-{folder_album}).
+(field_arg): optional arguments to pass to the field; for example, with
+{folder_album} this is used to pass the path separator used for joining
+folders and albums when rendering the field (default is "/" for
+{folder_album}).
-|filter: You may optionally append one or more filter commands to the end of
-the template field using the vertical pipe ('|') symbol. Filters may be
-combined, separated by '|' as in: {keyword|capitalize|parens}.
+|filter: You may optionally append one or more filter commands to the end of
+the template field using the vertical pipe ('|') symbol. Filters may be
+combined, separated by '|' as in: {keyword|capitalize|parens}.
-Valid filters are:
+Valid filters are:
- • lower: Convert value to lower case, e.g. 'Value' => 'value'.
- • upper: Convert value to upper case, e.g. 'Value' => 'VALUE'.
- • strip: Strip whitespace from beginning/end of value, e.g. ' Value ' =>
- 'Value'.
- • titlecase: Convert value to title case, e.g. 'my value' => 'My Value'.
+ • lower: Convert value to lower case, e.g. 'Value' => 'value'.
+ • upper: Convert value to upper case, e.g. 'Value' => 'VALUE'.
+ • strip: Strip whitespace from beginning/end of value, e.g. ' Value ' =>
+ 'Value'.
+ • titlecase: Convert value to title case, e.g. 'my value' => 'My Value'.
• capitalize: Capitalize first word of value and convert other words to lower
- case, e.g. 'MY VALUE' => 'My value'.
- • braces: Enclose value in curly braces, e.g. 'value => '{value}'.
- • parens: Enclose value in parentheses, e.g. 'value' => '(value')
- • brackets: Enclose value in brackets, e.g. 'value' => '[value]'
- • shell_quote: Quotes the value for safe usage in the shell, e.g. My
- file.jpeg => 'My file.jpeg'; only adds quotes if needed.
- • function: Run custom python function to filter value; use in format
- 'function:/path/to/file.py::function_name'. See example at
+ case, e.g. 'MY VALUE' => 'My value'.
+ • braces: Enclose value in curly braces, e.g. 'value => '{value}'.
+ • parens: Enclose value in parentheses, e.g. 'value' => '(value')
+ • brackets: Enclose value in brackets, e.g. 'value' => '[value]'
+ • shell_quote: Quotes the value for safe usage in the shell, e.g. My
+ file.jpeg => 'My file.jpeg'; only adds quotes if needed.
+ • function: Run custom python function to filter value; use in format
+ 'function:/path/to/file.py::function_name'. See example at
https://github.com/RhetTbull/osxphotos/blob/master/examples/template_filter
- .py
- • split(x): Split value into a list of values using x as delimiter, e.g.
- 'value1;value2' => ['value1', 'value2'] if used with split(;).
- • autosplit: Automatically split delimited string into separate values; will
+ .py
+ • split(x): Split value into a list of values using x as delimiter, e.g.
+ 'value1;value2' => ['value1', 'value2'] if used with split(;).
+ • autosplit: Automatically split delimited string into separate values; will
split strings delimited by comma, semicolon, or space, e.g. 'value1,value2'
- => ['value1', 'value2'].
+ => ['value1', 'value2'].
• chop(x): Remove x characters off the end of value, e.g. chop(1): 'Value' =>
'Valu'; when applied to a list, chops characters from each list value, e.g.
- chop(1): ['travel', 'beach']=> ['trave', 'beac'].
- • chomp(x): Remove x characters from the beginning of value, e.g. chomp(1):
+ chop(1): ['travel', 'beach']=> ['trave', 'beac'].
+ • chomp(x): Remove x characters from the beginning of value, e.g. chomp(1):
['Value'] => ['alue']; when applied to a list, removes characters from each
- list value, e.g. chomp(1): ['travel', 'beach']=> ['ravel', 'each'].
- • sort: Sort list of values, e.g. ['c', 'b', 'a'] => ['a', 'b', 'c'].
- • rsort: Sort list of values in reverse order, e.g. ['a', 'b', 'c'] => ['c',
- 'b', 'a'].
- • reverse: Reverse order of values, e.g. ['a', 'b', 'c'] => ['c', 'b', 'a'].
+ list value, e.g. chomp(1): ['travel', 'beach']=> ['ravel', 'each'].
+ • sort: Sort list of values, e.g. ['c', 'b', 'a'] => ['a', 'b', 'c'].
+ • rsort: Sort list of values in reverse order, e.g. ['a', 'b', 'c'] => ['c',
+ 'b', 'a'].
+ • reverse: Reverse order of values, e.g. ['a', 'b', 'c'] => ['c', 'b', 'a'].
• uniq: Remove duplicate values, e.g. ['a', 'b', 'c', 'b', 'a'] => ['a', 'b',
- 'c'].
- • join(x): Join list of values with delimiter x, e.g. join(,): ['a', 'b',
- 'c'] => 'a,b,c'; the DELIM option functions similar to join(x) but with
- DELIM, the join happens before being passed to any filters.May optionally
- be used without an argument, that is 'join()' which joins values together
- with no delimiter. e.g. join(): ['a', 'b', 'c'] => 'abc'.
- • append(x): Append x to list of values, e.g. append(d): ['a', 'b', 'c'] =>
- ['a', 'b', 'c', 'd'].
- • prepend(x): Prepend x to list of values, e.g. prepend(d): ['a', 'b', 'c']
- => ['d', 'a', 'b', 'c'].
- • appends(x): Append s[tring] Append x to each value of list of values, e.g.
- appends(d): ['a', 'b', 'c'] => ['ad', 'bd', 'cd'].
- • prepends(x): Prepend s[tring] x to each value of list of values, e.g.
- prepends(d): ['a', 'b', 'c'] => ['da', 'db', 'dc'].
+ 'c'].
+ • join(x): Join list of values with delimiter x, e.g. join(,): ['a', 'b',
+ 'c'] => 'a,b,c'; the DELIM option functions similar to join(x) but with
+ DELIM, the join happens before being passed to any filters.May optionally
+ be used without an argument, that is 'join()' which joins values together
+ with no delimiter. e.g. join(): ['a', 'b', 'c'] => 'abc'.
+ • append(x): Append x to list of values, e.g. append(d): ['a', 'b', 'c'] =>
+ ['a', 'b', 'c', 'd'].
+ • prepend(x): Prepend x to list of values, e.g. prepend(d): ['a', 'b', 'c']
+ => ['d', 'a', 'b', 'c'].
+ • appends(x): Append s[tring] Append x to each value of list of values, e.g.
+ appends(d): ['a', 'b', 'c'] => ['ad', 'bd', 'cd'].
+ • prepends(x): Prepend s[tring] x to each value of list of values, e.g.
+ prepends(d): ['a', 'b', 'c'] => ['da', 'db', 'dc'].
• remove(x): Remove x from list of values, e.g. remove(b): ['a', 'b', 'c'] =>
- ['a', 'c'].
- • slice(start:stop:step): Slice list using same semantics as Python's list
+ ['a', 'c'].
+ • slice(start:stop:step): Slice list using same semantics as Python's list
slicing, e.g. slice(1:3): ['a', 'b', 'c', 'd'] => ['b', 'c']; slice(1:4:2):
- ['a', 'b', 'c', 'd'] => ['b', 'd']; slice(1:): ['a', 'b', 'c', 'd'] =>
- ['b', 'c', 'd']; slice(:-1): ['a', 'b', 'c', 'd'] => ['a', 'b', 'c'];
- slice(::-1): ['a', 'b', 'c', 'd'] => ['d', 'c', 'b', 'a']. See also
- sslice().
+ ['a', 'b', 'c', 'd'] => ['b', 'd']; slice(1:): ['a', 'b', 'c', 'd'] =>
+ ['b', 'c', 'd']; slice(:-1): ['a', 'b', 'c', 'd'] => ['a', 'b', 'c'];
+ slice(::-1): ['a', 'b', 'c', 'd'] => ['d', 'c', 'b', 'a']. See also
+ sslice().
• sslice(start:stop:step): [s(tring) slice] Slice values in a list using same
- semantics as Python's string slicing, e.g. sslice(1:3):'abcd => 'bc';
- sslice(1:4:2): 'abcd' => 'bd', etc. See also slice().
- • filter(x): Filter list of values using predicate x; for example,
- {folder_album|filter(contains Events)} returns only folders/albums
- containing the word 'Events' in their path.
- • int: Convert values in list to integer, e.g. 1.0 => 1. If value cannot be
- converted to integer, remove value from list. ['1.1', 'x'] => ['1']. See
- also float.
- • float: Convert values in list to floating point number, e.g. 1 => 1.0. If
- value cannot be converted to float, remove value from list. ['1', 'x'] =>
- ['1.0']. See also int.
-
-e.g. if Photo keywords are ["FOO","bar"]:
-
- • "{keyword|lower}" renders to "foo", "bar"
- • "{keyword|upper}" renders to: "FOO", "BAR"
- • "{keyword|capitalize}" renders to: "Foo", "Bar"
- • "{keyword|lower|parens}" renders to: "(foo)", "(bar)"
-
-e.g. if Photo description is "my description":
-
- • "{descr|titlecase}" renders to: "My Description"
-
-e.g. If Photo is in Album1 in Folder1:
-
- • "{folder_album}" renders to ["Folder1/Album1"]
- • "{folder_album(>)}" renders to ["Folder1>Album1"]
- • "{folder_album()}" renders to ["Folder1Album1"]
-
-[find,replace]: optional text replacement to perform on rendered template
-value. For example, to replace "/" in an album name, you could use the
-template "{album[/,-]}". Multiple replacements can be made by appending "|"
-and adding another find|replace pair. e.g. to replace both "/" and ":" in
-album name: "{album[/,-|:,-]}". find/replace pairs are not limited to single
-characters. The "|" character cannot be used in a find/replace pair.
-
-conditional: optional conditional expression that is evaluated as boolean
-(True/False) for use with the ?bool_value modifier. Conditional expressions
-take the form 'not operator value' where not is an optional modifier that
-negates the operator. Note: the space before the conditional expression is
+ semantics as Python's string slicing, e.g. sslice(1:3):'abcd => 'bc';
+ sslice(1:4:2): 'abcd' => 'bd', etc. See also slice().
+ • filter(x): Filter list of values using predicate x; for example,
+ {folder_album|filter(contains Events)} returns only folders/albums
+ containing the word 'Events' in their path.
+ • int: Convert values in list to integer, e.g. 1.0 => 1. If value cannot be
+ converted to integer, remove value from list. ['1.1', 'x'] => ['1']. See
+ also float.
+ • float: Convert values in list to floating point number, e.g. 1 => 1.0. If
+ value cannot be converted to float, remove value from list. ['1', 'x'] =>
+ ['1.0']. See also int.
+
+e.g. if Photo keywords are ["FOO","bar"]:
+
+ • "{keyword|lower}" renders to "foo", "bar"
+ • "{keyword|upper}" renders to: "FOO", "BAR"
+ • "{keyword|capitalize}" renders to: "Foo", "Bar"
+ • "{keyword|lower|parens}" renders to: "(foo)", "(bar)"
+
+e.g. if Photo description is "my description":
+
+ • "{descr|titlecase}" renders to: "My Description"
+
+e.g. If Photo is in Album1 in Folder1:
+
+ • "{folder_album}" renders to ["Folder1/Album1"]
+ • "{folder_album(>)}" renders to ["Folder1>Album1"]
+ • "{folder_album()}" renders to ["Folder1Album1"]
+
+[find,replace]: optional text replacement to perform on rendered template
+value. For example, to replace "/" in an album name, you could use the
+template "{album[/,-]}". Multiple replacements can be made by appending "|"
+and adding another find|replace pair. e.g. to replace both "/" and ":" in
+album name: "{album[/,-|:,-]}". find/replace pairs are not limited to single
+characters. The "|" character cannot be used in a find/replace pair.
+
+conditional: optional conditional expression that is evaluated as boolean
+(True/False) for use with the ?bool_value modifier. Conditional expressions
+take the form 'not operator value' where not is an optional modifier that
+negates the operator. Note: the space before the conditional expression is
required if you use a conditional expression. Valid comparison operators are:
- • contains: template field contains value, similar to python's in
- • matches: template field contains exactly value, unlike contains: does not
- match partial matches
- • startswith: template field starts with value
- • endswith: template field ends with value
- • <=: template field is less than or equal to value
- • >=: template field is greater than or equal to value
- • <: template field is less than value
- • >: template field is greater than value
- • ==: template field equals value
- • !=: template field does not equal value
-
-The value part of the conditional expression is treated as a bare (unquoted)
-word/phrase. Multiple values may be separated by '|' (the pipe symbol).
-value is itself a template statement so you can use one or more template
-fields in value which will be resolved before the comparison occurs.
-
-For example:
-
- • {keyword matches Beach} resolves to True if 'Beach' is a keyword. It would
- not match keyword 'BeachDay'.
- • {keyword contains Beach} resolves to True if any keyword contains the word
- 'Beach' so it would match both 'Beach' and 'BeachDay'.
- • {photo.score.overall > 0.7} resolves to True if the photo's overall
- aesthetic score is greater than 0.7.
- • {keyword|lower contains beach} uses the lower case filter to do
- case-insensitive matching to match any keyword that contains the word
- 'beach'.
- • {keyword|lower not contains beach} uses the not modifier to negate the
- comparison so this resolves to True if there is no keyword that matches
- 'beach'.
-
-Examples: to export photos that contain certain keywords with the osxphotos
-export command's --directory option:
-
---directory "{keyword|lower matches
-travel|vacation?Travel-Photos,Not-Travel-Photos}"
-
-This exports any photo that has keywords 'travel' or 'vacation' into a
-directory 'Travel-Photos' and all other photos into directory
-'Not-Travel-Photos'.
-
-This can be used to rename files as well, for example: --filename
-"{favorite?Favorite-{original_name},{original_name}}"
-
-This renames any photo that is a favorite as 'Favorite-ImageName.jpg' (where
-'ImageName.jpg' is the original name of the photo) and all other photos with
-the unmodified original name.
-
-&combine_value: Template fields may be combined with another template
-statement to return multiple values. The combine_value is another template
-statement. For example, the template {created.year&{folder_album,}} would
-resolve to ["1999", "Vacation"] if the photo was created in 1999 and was in
-the album Vacation. Because the combine_value is a template statement,
-multiple templates may be combined together by nesting the combine operator:
-{template1&{template2&{template3,},},}. In this example, a null default value
-is used to prevent the default value from being combined if any of the nested
-templates does not resolve to a value
-
-?bool_value: Template fields may be evaluated as boolean (True/False) by
-appending "?" after the field name (and following "(field_arg)" or
+ • contains: template field contains value, similar to python's in
+ • matches: template field contains exactly value, unlike contains: does not
+ match partial matches
+ • startswith: template field starts with value
+ • endswith: template field ends with value
+ • <=: template field is less than or equal to value
+ • >=: template field is greater than or equal to value
+ • <: template field is less than value
+ • >: template field is greater than value
+ • ==: template field equals value
+ • !=: template field does not equal value
+
+The value part of the conditional expression is treated as a bare (unquoted)
+word/phrase. Multiple values may be separated by '|' (the pipe symbol).
+value is itself a template statement so you can use one or more template
+fields in value which will be resolved before the comparison occurs.
+
+For example:
+
+ • {keyword matches Beach} resolves to True if 'Beach' is a keyword. It would
+ not match keyword 'BeachDay'.
+ • {keyword contains Beach} resolves to True if any keyword contains the word
+ 'Beach' so it would match both 'Beach' and 'BeachDay'.
+ • {photo.score.overall > 0.7} resolves to True if the photo's overall
+ aesthetic score is greater than 0.7.
+ • {keyword|lower contains beach} uses the lower case filter to do
+ case-insensitive matching to match any keyword that contains the word
+ 'beach'.
+ • {keyword|lower not contains beach} uses the not modifier to negate the
+ comparison so this resolves to True if there is no keyword that matches
+ 'beach'.
+
+Examples: to export photos that contain certain keywords with the osxphotos
+export command's --directory option:
+
+--directory "{keyword|lower matches
+travel|vacation?Travel-Photos,Not-Travel-Photos}"
+
+This exports any photo that has keywords 'travel' or 'vacation' into a
+directory 'Travel-Photos' and all other photos into directory
+'Not-Travel-Photos'.
+
+This can be used to rename files as well, for example: --filename
+"{favorite?Favorite-{original_name},{original_name}}"
+
+This renames any photo that is a favorite as 'Favorite-ImageName.jpg' (where
+'ImageName.jpg' is the original name of the photo) and all other photos with
+the unmodified original name.
+
+&combine_value: Template fields may be combined with another template
+statement to return multiple values. The combine_value is another template
+statement. For example, the template {created.year&{folder_album,}} would
+resolve to ["1999", "Vacation"] if the photo was created in 1999 and was in
+the album Vacation. Because the combine_value is a template statement,
+multiple templates may be combined together by nesting the combine operator:
+{template1&{template2&{template3,},},}. In this example, a null default value
+is used to prevent the default value from being combined if any of the nested
+templates does not resolve to a value
+
+?bool_value: Template fields may be evaluated as boolean (True/False) by
+appending "?" after the field name (and following "(field_arg)" or
"[find/replace]". If a field is True (e.g. photo is HDR and field is "{hdr}")
-or has any value, the value following the "?" will be used to render the
-template instead of the actual field value. If the template field evaluates
+or has any value, the value following the "?" will be used to render the
+template instead of the actual field value. If the template field evaluates
to False (e.g. in above example, photo is not HDR) or has no value (e.g. photo
-has no title and field is "{title}") then the default value following a ","
-will be used.
+has no title and field is "{title}") then the default value following a ","
+will be used.
-e.g. if photo is an HDR image,
+e.g. if photo is an HDR image,
- • "{hdr?ISHDR,NOTHDR}" renders to "ISHDR"
+ • "{hdr?ISHDR,NOTHDR}" renders to "ISHDR"
-and if it is not an HDR image,
+and if it is not an HDR image,
- • "{hdr?ISHDR,NOTHDR}" renders to "NOTHDR"
+ • "{hdr?ISHDR,NOTHDR}" renders to "NOTHDR"
-,default: optional default value to use if the template name has no value.
+,default: optional default value to use if the template name has no value.
This modifier is also used for the value if False for boolean-type fields (see
-above) as well as to hold a sub-template for values like {created.strftime}.
-If no default value provided, "_" is used.
+above) as well as to hold a sub-template for values like {created.strftime}.
+If no default value provided, "_" is used.
-e.g., if photo has no title set,
+e.g., if photo has no title set,
- • "{title}" renders to "_"
- • "{title,I have no title}" renders to "I have no title"
+ • "{title}" renders to "_"
+ • "{title,I have no title}" renders to "I have no title"
-Template fields such as created.strftime use the default value to pass the
-template to use for strftime.
+Template fields such as created.strftime use the default value to pass the
+template to use for strftime.
-e.g., if photo date is 4 February 2020, 19:07:38,
+e.g., if photo date is 4 February 2020, 19:07:38,
- • "{created.strftime,%Y-%m-%d-%H%M%S}" renders to "2020-02-04-190738"
+ • "{created.strftime,%Y-%m-%d-%H%M%S}" renders to "2020-02-04-190738"
-Some template fields such as "{media_type}" use the default value to allow
-customization of the output. For example, "{media_type}" resolves to the
-special media type of the photo such as panorama or selfie. You may use the
-default value to override these in form:
-"{media_type,video=vidéo;time_lapse=vidéo_accélérée}". In this example, if
-photo was a time_lapse photo, media_type would resolve to vidéo_accélérée
-instead of time_lapse.
+Some template fields such as "{media_type}" use the default value to allow
+customization of the output. For example, "{media_type}" resolves to the
+special media type of the photo such as panorama or selfie. You may use the
+default value to override these in form:
+"{media_type,video=vidéo;time_lapse=vidéo_accélérée}". In this example, if
+photo was a time_lapse photo, media_type would resolve to vidéo_accélérée
+instead of time_lapse.
-Either or both bool_value or default (False value) may be empty which would
-result in empty string "" when rendered.
+Either or both bool_value or default (False value) may be empty which would
+result in empty string "" when rendered.
-If you want to include "{" or "}" in the output, use "{openbrace}" or
-"{closebrace}" template substitution.
+If you want to include "{" or "}" in the output, use "{openbrace}" or
+"{closebrace}" template substitution.
-e.g. "{created.year}/{openbrace}{title}{closebrace}" would result in
-"2020/{Photo Title}".
+e.g. "{created.year}/{openbrace}{title}{closebrace}" would result in
+"2020/{Photo Title}".
-Variables
+Variables
You can define variables for later use in the template string using the format
-{var:NAME,VALUE} where VALUE is a template statement. Variables may then be
-referenced using the format %NAME. For example: {var:foo,bar} defines the
-variable %foo to have value bar. This can be useful if you want to re-use a
-complex template value in multiple places within your template string or for
-allowing the use of characters that would otherwise be prohibited in a
-template string. For example, the "pipe" (|) character is not allowed in a
-find/replace pair but you can get around this limitation like so:
-{var:pipe,{pipe}}{title[-,%pipe]} which replaces the - character with | (the
-value of %pipe).
-
-Another use case for variables is filtering combined template values. For
-example, using the &combine_value mechanism to combine two template values
-that might result in duplicate values, you could do the following:
+{var:NAME,VALUE} where VALUE is a template statement. Variables may then be
+referenced using the format %NAME. For example: {var:foo,bar} defines the
+variable %foo to have value bar. This can be useful if you want to re-use a
+complex template value in multiple places within your template string or for
+allowing the use of characters that would otherwise be prohibited in a
+template string. For example, the "pipe" (|) character is not allowed in a
+find/replace pair but you can get around this limitation like so:
+{var:pipe,{pipe}}{title[-,%pipe]} which replaces the - character with | (the
+value of %pipe).
+
+Another use case for variables is filtering combined template values. For
+example, using the &combine_value mechanism to combine two template values
+that might result in duplicate values, you could do the following:
{var:myvar,{template1&{template2,},}}{%myvar|uniq} which allows the use of the
-uniq filter against the combined template values.
+uniq filter against the combined template values.
-Variables can also be referenced as fields in the template string, for
-example: {var:year,{created.year}}{original_name}-{%year}. In some cases, use
-of variables can make your template string more readable. Variables can be
-used as template fields, as values for filters, as values for conditional
+Variables can also be referenced as fields in the template string, for
+example: {var:year,{created.year}}{original_name}-{%year}. In some cases, use
+of variables can make your template string more readable. Variables can be
+used as template fields, as values for filters, as values for conditional
operations, or as default values. When used as a conditional value or default
value, variables should be treated like any other field and enclosed in braces
-as conditional and default values are evaluated as template strings. For
-example: {var:name,Katie}{person contains {%name}?{%name},Not-{%name}}.
+as conditional and default values are evaluated as template strings. For
+example: {var:name,Katie}{person contains {%name}?{%name},Not-{%name}}.
-If you need to use a % (percent sign character), you can escape the percent
-sign by using %%. You can also use the {percent} template field where a
-template field is required. For example:
+If you need to use a % (percent sign character), you can escape the percent
+sign by using %%. You can also use the {percent} template field where a
+template field is required. For example:
-{title[:,%%]} replaces the : with % and {title contains
-Foo?{title}{percent},{title}} adds % to the title if it contains Foo.
+{title[:,%%]} replaces the : with % and {title contains
+Foo?{title}{percent},{title}} adds % to the title if it contains Foo.
With the --directory and --filename options you may specify a template for the
export directory or filename, respectively. The directory will be appended to
@@ -2045,7 +2048,7 @@ corresponding value from the table below. Invalid substitutions will result
in a an error and the script will abort.
- Template Substitutions
+ Template Substitutions
Substitution Description
{name} Current filename of the photo
@@ -2474,7 +2477,7 @@ Substitution Description
{filepath} The full path to the exported file
- Post Command
+ Post Command
You can run commands on the exported photos for post-processing using the '--
post-command' option. '--post-command' is passed a CATEGORY and a COMMAND.
@@ -2539,7 +2542,7 @@ first to ensure your commands are as expected. This will not actually run the
commands but will print out the exact command string which would be executed.
- Post Function
+ Post Function
You can run your own python functions on the exported photos for post-
processing using the '--post-function' option. '--post-function' is passed the
diff --git a/osxphotos/_constants.py b/osxphotos/_constants.py
index d04cb8dc6..2cf3ac199 100644
--- a/osxphotos/_constants.py
+++ b/osxphotos/_constants.py
@@ -53,6 +53,7 @@
_PHOTOS_7_MODEL_VERSION = [15000, 15999] # Dev preview: 15134, 12.1: 15331
_PHOTOS_8_MODEL_VERSION = [16000, 16999] # Ventura dev preview: 16119
_PHOTOS_9_MODEL_VERSION = [17000, 17999] # Sonoma dev preview: 17120
+_PHOTOS_10_MODEL_VERSION = [18000, 18999] # Sequoia dev preview: 18164
# the preview versions of 12.0.0 had a difference schema for syndication info so need to check model version before processing
_PHOTOS_SYNDICATION_MODEL_VERSION = 15323 # 12.0.1
@@ -75,6 +76,8 @@
"HDR_TYPE": "ZCUSTOMRENDEREDVALUE",
"DETECTED_FACE_PERSON_FK": "ZDETECTEDFACE.ZPERSON",
"DETECTED_FACE_ASSET_FK": "ZDETECTEDFACE.ZASSET",
+ "MASTER_FINGERPRINT": "ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT",
+ "HAS_ADJUSTMENTS": "ZGENERICASSET.ZHASADJUSTMENTS",
},
6: {
"ASSET": "ZASSET",
@@ -89,6 +92,8 @@
"HDR_TYPE": "ZCUSTOMRENDEREDVALUE",
"DETECTED_FACE_PERSON_FK": "ZDETECTEDFACE.ZPERSON",
"DETECTED_FACE_ASSET_FK": "ZDETECTEDFACE.ZASSET",
+ "MASTER_FINGERPRINT": "ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT",
+ "HAS_ADJUSTMENTS": "ZASSET.ZHASADJUSTMENTS",
},
7: {
"ASSET": "ZASSET",
@@ -103,6 +108,8 @@
"HDR_TYPE": "ZHDRTYPE",
"DETECTED_FACE_PERSON_FK": "ZDETECTEDFACE.ZPERSON",
"DETECTED_FACE_ASSET_FK": "ZDETECTEDFACE.ZASSET",
+ "MASTER_FINGERPRINT": "ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT",
+ "HAS_ADJUSTMENTS": "ZASSET.ZHASADJUSTMENTS",
},
8: {
"ASSET": "ZASSET",
@@ -117,6 +124,8 @@
"HDR_TYPE": "ZHDRTYPE",
"DETECTED_FACE_PERSON_FK": "ZDETECTEDFACE.ZPERSON",
"DETECTED_FACE_ASSET_FK": "ZDETECTEDFACE.ZASSET",
+ "MASTER_FINGERPRINT": "ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT",
+ "HAS_ADJUSTMENTS": "ZASSET.ZHASADJUSTMENTS",
},
9: {
"ASSET": "ZASSET",
@@ -131,6 +140,24 @@
"HDR_TYPE": "ZHDRTYPE",
"DETECTED_FACE_PERSON_FK": "ZDETECTEDFACE.ZPERSONFORFACE",
"DETECTED_FACE_ASSET_FK": "ZDETECTEDFACE.ZASSETFORFACE",
+ "MASTER_FINGERPRINT": "ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT",
+ "HAS_ADJUSTMENTS": "ZASSET.ZHASADJUSTMENTS",
+ },
+ 10: {
+ "ASSET": "ZASSET",
+ "KEYWORD_JOIN": "Z_1KEYWORDS.Z_48KEYWORDS",
+ "ALBUM_JOIN": "Z_31ASSETS.Z_3ASSETS",
+ "ALBUM_SORT_ORDER": "Z_31ASSETS.Z_FOK_3ASSETS",
+ "IMPORT_FOK": "null",
+ "DEPTH_STATE": "ZASSET.ZDEPTHTYPE",
+ "UTI_ORIGINAL": "ZINTERNALRESOURCE.ZCOMPACTUTI",
+ "ASSET_ALBUM_JOIN": "Z_31ASSETS.Z_31ALBUMS",
+ "ASSET_ALBUM_TABLE": "Z_31ASSETS",
+ "HDR_TYPE": "ZHDRTYPE",
+ "DETECTED_FACE_PERSON_FK": "ZDETECTEDFACE.ZPERSONFORFACE",
+ "DETECTED_FACE_ASSET_FK": "ZDETECTEDFACE.ZASSETFORFACE",
+ "MASTER_FINGERPRINT": "ZADDITIONALASSETATTRIBUTES.ZORIGINALSTABLEHASH",
+ "HAS_ADJUSTMENTS": "ZASSET.ZADJUSTMENTSSTATE",
},
}
diff --git a/osxphotos/photosdb/photosdb.py b/osxphotos/photosdb/photosdb.py
index 9b68ebe57..0129bbc8b 100644
--- a/osxphotos/photosdb/photosdb.py
+++ b/osxphotos/photosdb/photosdb.py
@@ -1714,6 +1714,8 @@ def _process_database5(self):
depth_state = _DB_TABLE_NAMES[photos_ver]["DEPTH_STATE"]
uti_original_column = _DB_TABLE_NAMES[photos_ver]["UTI_ORIGINAL"]
hdr_type_column = _DB_TABLE_NAMES[photos_ver]["HDR_TYPE"]
+ master_fingerprint = _DB_TABLE_NAMES[photos_ver]["MASTER_FINGERPRINT"]
+ has_adjustments = _DB_TABLE_NAMES[photos_ver]["HAS_ADJUSTMENTS"]
# Look for all combinations of persons and pictures
logger.debug(f"Getting information about persons")
@@ -1971,7 +1973,7 @@ def _process_database5(self):
verbose("Processing photo details.")
c.execute(
f"""SELECT {asset_table}.ZUUID,
- ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT,
+ {master_fingerprint},
ZADDITIONALASSETATTRIBUTES.ZTITLE,
ZADDITIONALASSETATTRIBUTES.ZORIGINALFILENAME,
{asset_table}.ZMODIFICATIONDATE,
@@ -1985,7 +1987,7 @@ def _process_database5(self):
{asset_table}.ZFILENAME,
{asset_table}.ZLATITUDE,
{asset_table}.ZLONGITUDE,
- {asset_table}.ZHASADJUSTMENTS,
+ {has_adjustments},
{asset_table}.ZCLOUDBATCHPUBLISHDATE,
{asset_table}.ZKIND,
{asset_table}.ZUNIFORMTYPEIDENTIFIER,
@@ -2354,7 +2356,7 @@ def _process_database5(self):
# get information about adjusted/edited photos
c.execute(
f"""SELECT {asset_table}.ZUUID,
- {asset_table}.ZHASADJUSTMENTS,
+ {has_adjustments},
ZUNMANAGEDADJUSTMENT.ZADJUSTMENTFORMATIDENTIFIER
FROM {asset_table}, ZUNMANAGEDADJUSTMENT
JOIN ZADDITIONALASSETATTRIBUTES ON ZADDITIONALASSETATTRIBUTES.ZASSET = {asset_table}.Z_PK
@@ -2432,7 +2434,7 @@ def _process_database5(self):
ZINTERNALRESOURCE.ZREMOTEAVAILABILITY
FROM {asset_table}
JOIN ZADDITIONALASSETATTRIBUTES ON ZADDITIONALASSETATTRIBUTES.ZASSET = {asset_table}.Z_PK
- JOIN ZINTERNALRESOURCE ON ZINTERNALRESOURCE.ZFINGERPRINT = ZADDITIONALASSETATTRIBUTES.ZMASTERFINGERPRINT """
+ JOIN ZINTERNALRESOURCE ON ZINTERNALRESOURCE.ZFINGERPRINT = {master_fingerprint} """
)
for row in c:
diff --git a/osxphotos/photosdb/photosdb_utils.py b/osxphotos/photosdb/photosdb_utils.py
index 6f6ff1db4..1c49e6eeb 100644
--- a/osxphotos/photosdb/photosdb_utils.py
+++ b/osxphotos/photosdb/photosdb_utils.py
@@ -17,6 +17,7 @@
_PHOTOS_7_MODEL_VERSION,
_PHOTOS_8_MODEL_VERSION,
_PHOTOS_9_MODEL_VERSION,
+ _PHOTOS_10_MODEL_VERSION,
_TESTED_DB_VERSIONS,
)
from ..sqlite_utils import sqlite_open_ro
@@ -135,10 +136,12 @@ def get_photos_version_from_model(db_file: str) -> int:
return 8
if _PHOTOS_9_MODEL_VERSION[0] <= model_ver <= _PHOTOS_9_MODEL_VERSION[1]:
return 9
+ if _PHOTOS_10_MODEL_VERSION[0] <= model_ver <= _PHOTOS_10_MODEL_VERSION[1]:
+ return 10
logger.warning(
f"Unknown db / model version for {db_file}: model_ver={model_ver}; assuming latest version"
)
- return 9
+ return 10
def get_photos_library_version(library_path: str | pathlib.Path) -> int:
diff --git a/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite b/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite
index 1b81795f1..a66cf31a0 100644
Binary files a/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite and b/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite differ
diff --git a/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-shm b/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-shm
index 514583c86..fe9ac2845 100644
Binary files a/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-shm and b/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-shm differ
diff --git a/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-wal b/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-wal
index 8d1100f53..e69de29bb 100644
Binary files a/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-wal and b/tests/Test-14.0.0.photoslibrary/database/Photos.sqlite-wal differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/DataModelVersion.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/DataModelVersion.plist
new file mode 100644
index 000000000..be9740fe2
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/DataModelVersion.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ LibrarySchemaVersion
+ 5001
+ MetaSchemaVersion
+ 3
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite
new file mode 100644
index 000000000..0bb31dd82
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite-shm
new file mode 100644
index 000000000..60ed0e342
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite-wal
new file mode 100644
index 000000000..075d5ba1f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite-wal differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite.lock b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite.lock
new file mode 100644
index 000000000..0663dd4d9
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/Photos.sqlite.lock
@@ -0,0 +1,16 @@
+
+
+
+
+ hostname
+ Turals-Macbook-Pro.local
+ hostuuid
+ 5E17AD36-A1D3-512D-ADB3-179E948B2295
+ pid
+ 1128
+ processname
+ photolibraryd
+ uid
+ 501
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/metaSchema.db b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/metaSchema.db
new file mode 100644
index 000000000..2d75bd40e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/metaSchema.db differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/photos.db b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/photos.db
new file mode 100644
index 000000000..2d75bd40e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/photos.db differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/protection b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/protection
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/.store.db b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/.store.db
new file mode 100644
index 000000000..8ab5a6785
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/.store.db differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.directoryStoreFile b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.directoryStoreFile
new file mode 100644
index 000000000..d9d6b0dd1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.directoryStoreFile differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.directoryStoreFile.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.directoryStoreFile.shadow
new file mode 100644
index 000000000..bdd9ca6e3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.directoryStoreFile.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexArrays b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexArrays
new file mode 100644
index 000000000..a4877c4d3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexArrays differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexBigDates b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexBigDates
new file mode 100644
index 000000000..593f4708d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexBigDates differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexCompactDirectory b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexCompactDirectory
new file mode 100644
index 000000000..20d5cb86e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexCompactDirectory differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexDirectory b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexDirectory
new file mode 100644
index 000000000..e7d5db3d6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexDirectory differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexGroups b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexGroups
new file mode 100644
index 000000000..08e7df176
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexGroups differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexHead b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexHead
new file mode 100644
index 000000000..b843060f3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexHead differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexIds b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexIds
new file mode 100644
index 000000000..1b1cb4d44
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexIds differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPositionTable b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPositionTable
new file mode 100644
index 000000000..1b1cb4d44
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPositionTable differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPositions b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPositions
new file mode 100644
index 000000000..08e7df176
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPositions differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPostings b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPostings
new file mode 100644
index 000000000..08e7df176
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexPostings differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexScores b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexScores
new file mode 100644
index 000000000..12f3be4dd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexScores differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexTermIds b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexTermIds
new file mode 100644
index 000000000..1b1cb4d44
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexTermIds differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexUpdates b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexUpdates
new file mode 100644
index 000000000..46c118624
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.indexUpdates differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.shadowIndexGroups b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.shadowIndexGroups
new file mode 100644
index 000000000..f76dd238a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.shadowIndexGroups differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.shadowIndexHead b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.shadowIndexHead
new file mode 100644
index 000000000..fae755b37
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/0.shadowIndexHead differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/clientstatesmetafile b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/clientstatesmetafile
new file mode 100644
index 000000000..ce5df26e5
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/clientstatesmetafile
@@ -0,0 +1,10 @@
+
+
+
+
+ journalSerialNumber
+ 1
+ version
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.buckets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.buckets
new file mode 100644
index 000000000..deb724168
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.buckets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.data
new file mode 100644
index 000000000..f0db1f02f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.header b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.header
new file mode 100644
index 000000000..c31209e46
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.header differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.header.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.header.shadow
new file mode 100644
index 000000000..22b55a1dd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.header.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.offsets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.offsets
new file mode 100644
index 000000000..160f3ddfc
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-1.map.offsets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.buckets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.buckets
new file mode 100644
index 000000000..c589ee57e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.buckets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.data
new file mode 100644
index 000000000..6d6c7d673
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.header b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.header
new file mode 100644
index 000000000..10ed3fd55
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.header differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.header.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.header.shadow
new file mode 100644
index 000000000..dcdb69c13
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.header.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.offsets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.offsets
new file mode 100644
index 000000000..69c3cd671
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-2.map.offsets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.buckets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.buckets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.buckets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.data
new file mode 100644
index 000000000..8ccd86ee6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.header b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.header
new file mode 100644
index 000000000..c481abde3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.header differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.header.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.header.shadow
new file mode 100644
index 000000000..0eb08eb9f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.header.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.offsets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.offsets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-3.map.offsets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.buckets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.buckets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.buckets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.data
new file mode 100644
index 000000000..8ccd86ee6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.header b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.header
new file mode 100644
index 000000000..c481abde3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.header differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.header.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.header.shadow
new file mode 100644
index 000000000..0eb08eb9f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.header.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.offsets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.offsets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-4.map.offsets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.buckets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.buckets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.buckets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.data
new file mode 100644
index 000000000..8ccd86ee6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.header b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.header
new file mode 100644
index 000000000..c481abde3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.header differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.header.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.header.shadow
new file mode 100644
index 000000000..0eb08eb9f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.header.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.offsets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.offsets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-5.map.offsets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.buckets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.buckets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.buckets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.data
new file mode 100644
index 000000000..8ccd86ee6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.header b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.header
new file mode 100644
index 000000000..033bbdb2b
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.header differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.header.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.header.shadow
new file mode 100644
index 000000000..d4cfc30e3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.header.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.offsets b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.offsets
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/dbStr-6.map.offsets differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/hot.1718062498671010.Pe74sW b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/hot.1718062498671010.Pe74sW
new file mode 100644
index 000000000..5142c798f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/hot.1718062498671010.Pe74sW differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/indexState b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/indexState
new file mode 100644
index 000000000..4e3bdd54b
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/indexState differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/journalAttr.1 b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/journalAttr.1
new file mode 100644
index 000000000..65150de11
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/journalAttr.1 differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.directoryStoreFile b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.directoryStoreFile
new file mode 100644
index 000000000..d9d6b0dd1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.directoryStoreFile differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.directoryStoreFile.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.directoryStoreFile.shadow
new file mode 100644
index 000000000..bdd9ca6e3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.directoryStoreFile.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexArrays b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexArrays
new file mode 100644
index 000000000..7765e0577
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexArrays differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexBigDates b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexBigDates
new file mode 100644
index 000000000..294f4016d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexBigDates differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexCompactDirectory b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexCompactDirectory
new file mode 100644
index 000000000..c45a6485e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexCompactDirectory differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexDirectory b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexDirectory
new file mode 100644
index 000000000..fb31f6e09
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexDirectory differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexGroups b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexGroups
new file mode 100644
index 000000000..08e7df176
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexGroups differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexHead b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexHead
new file mode 100644
index 000000000..eb8543bf1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexHead differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexIds b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexIds
new file mode 100644
index 000000000..12f3be4dd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexIds differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPositionTable b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPositionTable
new file mode 100644
index 000000000..6d17cf9d1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPositionTable differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPositions b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPositions
new file mode 100644
index 000000000..08e7df176
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPositions differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPostings b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPostings
new file mode 100644
index 000000000..08e7df176
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexPostings differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexScores b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexScores
new file mode 100644
index 000000000..12f3be4dd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexScores differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexTermIds b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexTermIds
new file mode 100644
index 000000000..6d17cf9d1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexTermIds differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexUpdates b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.indexUpdates
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexArrays b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexArrays
new file mode 100644
index 000000000..7765e0577
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexArrays differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexCompactDirectory b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexCompactDirectory
new file mode 100644
index 000000000..20d5cb86e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexCompactDirectory differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexDirectory b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexDirectory
new file mode 100644
index 000000000..e7d5db3d6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexDirectory differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexGroups b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexGroups
new file mode 100644
index 000000000..f76dd238a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexGroups differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexHead b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexHead
new file mode 100644
index 000000000..ff2a716e2
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexHead differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexPositionTable b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexPositionTable
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexTermIds b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/live.0.shadowIndexTermIds
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseDirectoryStore b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseDirectoryStore
new file mode 100644
index 000000000..f16994532
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseDirectoryStore differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseDirectoryStore.shadow b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseDirectoryStore.shadow
new file mode 100644
index 000000000..b7726315a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseDirectoryStore.shadow differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseStore.updates b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseStore.updates
new file mode 100644
index 000000000..35a038769
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/reverseStore.updates differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/store.db b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/store.db
new file mode 100644
index 000000000..8ab5a6785
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/store.db differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/store.updates b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/store.updates
new file mode 100644
index 000000000..12db4781e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/store.updates differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/tmp.spotlight.state b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/tmp.spotlight.state
new file mode 100644
index 000000000..7438bc593
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/NSFileProtectionCompleteUntilFirstUserAuthentication/index.spotlightV3/tmp.spotlight.state differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/heartbeat.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/heartbeat.plist
new file mode 100644
index 000000000..ef4bfff82
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/heartbeat.plist
@@ -0,0 +1,68 @@
+
+
+
+
+ build
+ 24A5264n
+ heartbeat_age
+ 1718062498
+ lastSent
+ -1
+ parentDirectory_age
+ 1718062498
+ pcA_age
+ -1
+ pcA_obj_count
+ -1
+ pcA_wipes
+ 0
+ pcA_wipes_aggregate
+ 0
+ pcB_age
+ -1
+ pcB_obj_count
+ -1
+ pcB_wipes
+ 0
+ pcB_wipes_aggregate
+ 0
+ pcCX_age
+ -1
+ pcCX_obj_count
+ -1
+ pcCX_wipes
+ 0
+ pcCX_wipes_aggregate
+ 0
+ pcC_age
+ 1718062498
+ pcC_obj_count
+ 1
+ pcC_wipes
+ 0
+ pcC_wipes_aggregate
+ 0
+ pcPriority_age
+ -1
+ pcPriority_obj_count
+ -1
+ pcPriority_wipes
+ 0
+ pcPriority_wipes_aggregate
+ 0
+ previousbuild
+ unknown
+ previousspotlightversion
+ unknown
+ rootsinstalled
+
+ spotlightversion
+ 2305.1.5
+ timesinceboot
+ 1718056899
+ timesinceupdate
+ -1
+ vectorindexon
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/indexOpenRecord.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/indexOpenRecord.plist
new file mode 100644
index 000000000..51a4de3c8
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/Spotlight/indexOpenRecord.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ pcA_lastAnalytics
+ -1
+ pcA_lastOpen
+ -1
+ pcB_lastAnalytics
+ -1
+ pcB_lastOpen
+ -1
+ pcCX_lastAnalytics
+ -1
+ pcCX_lastOpen
+ -1
+ pcC_lastAnalytics
+ -1
+ pcC_lastOpen
+ 1718062498
+ pcPriority_lastAnalytics
+ -1
+ pcPriority_lastOpen
+ -1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/graphDataProgress.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/graphDataProgress.plist
new file mode 100644
index 000000000..c4e5e427a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/graphDataProgress.plist differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite
new file mode 100644
index 000000000..592296162
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/psi.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchMetadata.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchMetadata.plist
new file mode 100644
index 000000000..5f9011c0f
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchMetadata.plist
@@ -0,0 +1,19 @@
+
+
+
+
+ BlacklistedMeaningsByMeaning
+
+ SceneWhitelist
+
+ Art
+ Flower
+ Food
+ Jewelry
+ Lake
+ Shore
+ Sport
+ Vehicle
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchProgress.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchProgress.plist
new file mode 100644
index 000000000..d243cc993
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchProgress.plist
@@ -0,0 +1,28 @@
+
+
+
+
+ insertAlbum
+
+ insertAsset
+
+ insertHighlight
+
+ insertMemory
+
+ insertMoment
+
+ removeAlbum
+
+ removeAsset
+
+ removeHighlight
+
+ removeMemory
+
+ removeMoment
+
+ renamePerson
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchSystemInfo.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchSystemInfo.plist
new file mode 100644
index 000000000..1f72c67e8
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/searchSystemInfo.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ embeddingVersion
+ 1
+ featureFlags
+ 319
+ featuredContentAllowed
+ 1
+ localeIdentifier
+ en_US
+ sceneTaxonomySHA
+ 64d078bafc0035e1ec26dfa565c2ac0479fcbab329fda1c16cd17e0fdbf2f4c0,4afa5d3c45c08a664cf73cff957aaeeae3a325d2970aada51268407b9ad0f03e
+ searchIndexVersion
+ 16025
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/synonymsProcess.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/synonymsProcess.plist
new file mode 100644
index 000000000..f660dee38
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/synonymsProcess.plist differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/zeroKeywords.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/zeroKeywords.data
new file mode 100644
index 000000000..ea7c3a0c3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/database/search/zeroKeywords.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/1/1EB2B765-0765-43BA-A90C-0D0580E6172C.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/1/1EB2B765-0765-43BA-A90C-0D0580E6172C.jpeg
new file mode 100644
index 000000000..136dfe8d1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/1/1EB2B765-0765-43BA-A90C-0D0580E6172C.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907.jpeg
new file mode 100644
index 000000000..ca03f665a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/4/4D521201-92AC-43E5-8F7C-59BC41C37A96.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/4/4D521201-92AC-43E5-8F7C-59BC41C37A96.jpeg
new file mode 100755
index 000000000..143e9532e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/4/4D521201-92AC-43E5-8F7C-59BC41C37A96.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_4.cr2 b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_4.cr2
new file mode 100755
index 000000000..f2adc62f4
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_4.cr2 differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.jpeg
new file mode 100644
index 000000000..31eb2ab32
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/6/6FD38366-3BF2-407D-81FE-7153EB6125B6.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/6/6FD38366-3BF2-407D-81FE-7153EB6125B6.jpeg
new file mode 100644
index 000000000..88caa5373
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/6/6FD38366-3BF2-407D-81FE-7153EB6125B6.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/7/71E3E212-00EB-430D-8A63-5E294B268554.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/7/71E3E212-00EB-430D-8A63-5E294B268554.jpeg
new file mode 100644
index 000000000..829a2345c
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/7/71E3E212-00EB-430D-8A63-5E294B268554.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266.heic b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266.heic
new file mode 100644
index 000000000..8f1038146
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266.heic differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/8/8846E3E6-8AC8-4857-8448-E3D025784410.tiff b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/8/8846E3E6-8AC8-4857-8448-E3D025784410.tiff
new file mode 100644
index 000000000..696544117
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/8/8846E3E6-8AC8-4857-8448-E3D025784410.tiff differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91.jpeg
new file mode 100755
index 000000000..c18728126
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_4.cr2 b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_4.cr2
new file mode 100755
index 000000000..6cd12fb49
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_4.cr2 differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068.dng b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068.dng
new file mode 100755
index 000000000..1f96242c4
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068.dng differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg
new file mode 100644
index 000000000..f23a024af
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/DC99FBDD-7A52-4100-A5BB-344131646C30.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/DC99FBDD-7A52-4100-A5BB-344131646C30.jpeg
new file mode 100644
index 000000000..e5a6b0bd1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/DC99FBDD-7A52-4100-A5BB-344131646C30.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.jpeg
new file mode 100644
index 000000000..ad8137e3d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/F/F12384F6-CD17-4151-ACBA-AE0E3688539E.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/F/F12384F6-CD17-4151-ACBA-AE0E3688539E.jpeg
new file mode 100644
index 000000000..b16159303
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/F/F12384F6-CD17-4151-ACBA-AE0E3688539E.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/.metadata_never_index b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/.metadata_never_index
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.Photos.Migration/appPrivateData.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.Photos.Migration/appPrivateData.plist
new file mode 100644
index 000000000..651ed0ad7
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.Photos.Migration/appPrivateData.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ MigrationService
+
+ State
+ 4
+
+ MigrationService.LastCompletedTask
+ 12
+ MigrationService.ValidationCounts
+
+ MigrationDetectedFaceprint
+ 6
+ MigrationManagedAsset
+ 0
+ MigrationSceneClassification
+ 44
+ MigrationUnmanagedAdjustment
+ 0
+ RDVersion.cloudLocalState.CPLIsNotPushed
+ 7
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.Photos/appPrivateData.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.Photos/appPrivateData.plist
new file mode 100644
index 000000000..54ef2f8bc
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.Photos/appPrivateData.plist
@@ -0,0 +1,71 @@
+
+
+
+
+ CollapsedSidebarSectionIdentifiers
+
+ ExpandedSidebarItemIdentifiers
+
+ 92D68107-B6C7-453B-96D2-97B0F26D5B8B/L0/020
+ 88A5F8B8-5B9A-43C7-BB85-3952B81580EB/L0/020
+ 29EF7A97-7E76-4D5F-A5E0-CC0A93E8524C/L0/020
+ 2C2AF115-BD1D-4434-A747-D1C8BD8E2045/L0/020
+ CB051A4C-2CB7-4B90-B59B-08CC4D0C2823/L0/020
+
+ IPXWorkspaceControllerZoomLevelsKey
+
+ kZoomLevelIdentifierPhotosGrid
+ 2
+
+ PXPeopleCandidateWidgetKey
+
+ PXPeopleCandidateWidgetKey2023.01.22
+
+ 3DDC8F83-FDAB-4943-AE53-19428BEEED9D/L0/070
+
+
+ PXPeopleHomeSortingType
+ 0
+ PeoplePetsHomeVisibilitySourceLastKnownHasHumans
+
+ PeoplePetsHomeVisibilitySourceLastKnownHasPets
+
+ Photos
+
+ CollapsedSidebarSectionIdentifiers
+
+ ExpandedSidebarItemIdentifiers
+
+ TopLevelAlbums
+ TopLevelSlideshows
+
+ IPXWorkspaceControllerZoomLevelsKey
+
+ kZoomLevelIdentifierAlbums
+ 7
+ kZoomLevelIdentifierVersions
+ 7
+
+ lastAddToDestination
+
+ key
+ 1
+ lastKnownDisplayName
+ September 28, 2018
+ type
+ album
+ uuid
+ DFFKmHt3Tk+AGzZLe2Xq+g
+
+ lastKnownItemCounts
+
+ other
+ 0
+ photos
+ 7
+ videos
+ 0
+
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db
new file mode 100644
index 000000000..b9290cf81
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db-shm
new file mode 100644
index 000000000..8ecc117e4
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db-wal
new file mode 100644
index 000000000..41d94a5fb
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/MediaAnalysis/mediaanalysis.db-wal differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/7B6C018B-59FD-44F0-96B7-E3C10BAB8EC7.cmap b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/7B6C018B-59FD-44F0-96B7-E3C10BAB8EC7.cmap
new file mode 100644
index 000000000..739f0a826
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/7B6C018B-59FD-44F0-96B7-E3C10BAB8EC7.cmap differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/AlgoFaceClusterCache.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/AlgoFaceClusterCache.data
new file mode 100644
index 000000000..d76b9c9d6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/AlgoFaceClusterCache.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/CE532FCE-EFBA-4139-A85A-880B1C67ABAF.cmap b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/CE532FCE-EFBA-4139-A85A-880B1C67ABAF.cmap
new file mode 100644
index 000000000..d49c947f3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/CE532FCE-EFBA-4139-A85A-880B1C67ABAF.cmap differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/PersonPromoter b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/PersonPromoter
new file mode 100644
index 000000000..e569f1fd4
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/PersonPromoter
@@ -0,0 +1,14 @@
+
+
+
+
+ NumberOfFacesProcessedOnLastRun
+ 12
+ ProcessedInQuiescentState
+
+ SuggestedMeIdentifier
+
+ Version
+ 13
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/PhotoAnalysisServicePreferences.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/PhotoAnalysisServicePreferences.plist
new file mode 100644
index 000000000..b5ef83377
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/PhotoAnalysisServicePreferences.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ FaceIDModelLastGenerationKey
+ 2022-11-12T21:51:03Z
+ PetIDModelLastGenerationKey
+ 2022-11-12T21:51:03Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/clustererState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/clustererState.plist
new file mode 100644
index 000000000..f9a836973
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/clustererState.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ VCPClustererBringUpState
+ 40
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/faceWorkerState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/faceWorkerState.plist
new file mode 100644
index 000000000..92c2f00d6
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/faceWorkerState.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ PersonBuilderLastMinimumFaceGroupSizeForCreatingMergeCandidates
+ 15
+ PersonBuilderMergeCandidatesEnabled
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/mediaAnalysisVersionState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/mediaAnalysisVersionState.plist
new file mode 100644
index 000000000..5badb44d8
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/mediaAnalysisVersionState.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ FaceProcessingInternalVersion
+ 15
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/vnpersonsmodel.bin b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/vnpersonsmodel.bin
new file mode 100644
index 000000000..cfe114f45
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/vnpersonsmodel.bin differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/vnpetsmodel.bin b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/vnpetsmodel.bin
new file mode 100644
index 000000000..3eb27d956
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.mediaanalysisd/caches/vision/vnpetsmodel.bin differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite
new file mode 100644
index 000000000..52f449c8b
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite-shm
new file mode 100644
index 000000000..47bf77d7d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.AOI.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite
new file mode 100644
index 000000000..1e3878b8e
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite-shm
new file mode 100644
index 000000000..282e171a0
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.Nature.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite
new file mode 100644
index 000000000..91a64686f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite-shm
new file mode 100644
index 000000000..fa07251d2
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.POI.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite
new file mode 100644
index 000000000..a804bc09f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite-shm
new file mode 100644
index 000000000..b0a49a7f5
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSBusinessCategoryCache.ROI.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite
new file mode 100644
index 000000000..d66ed5dec
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite-shm
new file mode 100644
index 000000000..681449ef2
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSContactCache.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite
new file mode 100644
index 000000000..031d074d4
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite-shm
new file mode 100644
index 000000000..b2b1d9b16
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSLocationCache.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite
new file mode 100644
index 000000000..492484403
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/CLSPublicEventCache.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite
new file mode 100644
index 000000000..d81b267b0
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite-shm
new file mode 100644
index 000000000..54b70fb64
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGCurationCache.sqlite.sqlite-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGSearchComputationCache.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGSearchComputationCache.plist
new file mode 100644
index 000000000..b5885dc4b
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGSearchComputationCache.plist differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGSharingFeatureExtractorRecords.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGSharingFeatureExtractorRecords.plist
new file mode 100644
index 000000000..0de953bac
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PGSharingFeatureExtractorRecords.plist differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotoAnalysisServiceFeaturesAnalytics.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotoAnalysisServiceFeaturesAnalytics.plist
new file mode 100644
index 000000000..2c004e57a
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotoAnalysisServiceFeaturesAnalytics.plist
@@ -0,0 +1,918 @@
+
+
+
+
+ firstSeenDates
+
+ com.apple.photos.CPAnalytics.addAssetsToLibrary
+ 11/12/22
+ com.apple.photos.CPAnalytics.appleMusicPreparationFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.appleMusicPreparationSucceeded
+ 11/12/22
+ com.apple.photos.CPAnalytics.appleMusicPreparedToPlay
+ 11/12/22
+ com.apple.photos.CPAnalytics.appleMusicSongDownloaded
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetCollectionBlocked
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetCollectionDeleted
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetCollectionFavorited
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetCollectionMoviePlayed
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetCollectionUnfavorited
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetCollectionViewed
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetExportItemPreparationCompleted
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetExportPreparationCanceled
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetExportPreparationCompleted
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetExportPreparationFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetFavorited
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetSharedStandardSelectionSize
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetUnfavorited
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetViewed
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetsDeleted
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetsDeletedFromTrash
+ 11/12/22
+ com.apple.photos.CPAnalytics.assetsRestored
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmAddAssetToLibrary
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmPublishFromDetailViewMenuAction
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmPublishFromForYouSendBackSuggestions
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmPublishFromForYouSuggestion
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmPublishFromMessagesSuggestion
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmPublishFromShareSheet
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmPublishFromUnknown
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmReceivedSharesOpened
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmReceivedSharesSeen
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmSentSharesOpened
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmSentSharesSeen
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmShareBackOpened
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmShareBackPresentable
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmShareBackShown
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmSuggestionComposeFlowOpened
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmSuggestionOpened
+ 11/12/22
+ com.apple.photos.CPAnalytics.cmmSuggestionSeen
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationEventFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationEventOneUpSelect
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationEventSkip
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationFromAlbumSection
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationFromAlbumSelection
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationFromOneUpMergeAll
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationFromOneUpSelection
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationFromUnspecified
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationMerge1
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationMerge11+
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationMerge2
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationMerge3-5
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationMerge6-10
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationMergeAll
+ 11/12/22
+ com.apple.photos.CPAnalytics.deduplicationSkipPerceptualMerge
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterAllItemsSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterDuplicatesSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterEditedSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterFavoritedSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterHeaderSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterIncludeSharedWithYouSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterKeywordHeaderSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterKeywordManagerSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterKeywordsSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterPhotosSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSavedItemsOnlySelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibraryAllDisplayed
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibraryAllSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibraryDismissed
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibraryMineDisplayed
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibraryMineSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibraryPresented
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibrarySharedDisplayed
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterSharedLibrarySharedSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterUnsavedItemsOnlySelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.filterVideosSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.firstTimeExperienceNotReady
+ 11/12/22
+ com.apple.photos.CPAnalytics.firstTimeExperienceReady
+ 11/12/22
+ com.apple.photos.CPAnalytics.flexMusicDownloadRequiredAtPlaybackTime
+ 11/12/22
+ com.apple.photos.CPAnalytics.flexMusicSongArtworkDownloaded
+ 11/12/22
+ com.apple.photos.CPAnalytics.flexMusicSongAudioDownloaded
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeCMMPublishedShare
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeCMMReceivedShare
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumAccept
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumCoalescedWithComments
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumCoalescedWithCommentsAndLikes
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumComment
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumDecline
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumInvitation
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumLike
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouInboxItemSelectedWithTypeSharedAlbumPost
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouTabOpenedFromInAppUserNavigation
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouTabOpenedFromNotification
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouTabOpenedFromOtherURL
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouTabOpenedFromStateRestoration
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouTabOpenedFromUndefined
+ 11/12/22
+ com.apple.photos.CPAnalytics.forYouTabOpenedFromWidget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeAlbumGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeAlbumListGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeCMMInviteGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeCMMSuggestionGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeCPLCMMSuggestionGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeContentSyndication
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeDebugGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeFooterGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeInboxGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeListViewGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeMemoryRowGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeNoContentGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeRecentPhotosGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeRecentSearchesGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSearchZeroKeywordGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSettingsAdvisory
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSharedAlbumActivityGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSharedAlbumGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSharedAlbumInviteGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSuggestedEditGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSuggestionGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSurveyCongratulations
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeSurveyQuestionGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetSeenWithTypeTapToRadarGadget
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetWithTypeMemoryRowGadgetSelectedAccessoryButtonWithTypeSeeAll
+ 11/12/22
+ com.apple.photos.CPAnalytics.gadgetWithTypeSharedAlbumGadgetSelectedAccessoryButtonWithTypeSeeAll
+ 11/12/22
+ com.apple.photos.CPAnalytics.infoPanelAddLocationTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.infoPanelAdjustLocationTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.infoPanelLocationTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.mapViewAdjustLocationTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.mediaViewed
+ 11/12/22
+ com.apple.photos.CPAnalytics.memoryCreatedViaAddToMemories
+ 11/12/22
+ com.apple.photos.CPAnalytics.memoryNotificationResponded
+ 11/12/22
+ com.apple.photos.CPAnalytics.memoryNotificationSeen
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigateToFailedToUploadItemsAlbumFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigateToFailedToUploadItemsAlbumSucceeded
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigatedToSharedAlbumActivityViewFromCollageView
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigatedToSharedAlbumActivityViewFromRecentActivityEntry
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigatedToSharedAlbumActivityViewFromSeeAllButton
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.favorites
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.hidden
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.imports
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.animated
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.bursts
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.cinematicVideos
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.depthEffect
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.livePhotos
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.longExposures
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.panoramas
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.proRes
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.raw
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.screenrecordings
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.screenshots
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.selfPortraits
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.slomoVideos
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.timelapses
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.mediaTypes.videos
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.people
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.places
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.recentlyedited
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.recentlysaved
+ 11/12/22
+ com.apple.photos.CPAnalytics.navigationList.trashBin
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExited
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith1-10Characters
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith101+Characters
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith11+Hashtags
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith11-20Characters
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith1Hashtags
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith21-30Characters
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith2Hashtags
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith31-50Characters
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith3Hashtags
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith4-5Hashtags
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith51-100Characters
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpCaptionEditExitedWith6-10Hashtags
+ 11/12/22
+ com.apple.photos.CPAnalytics.oneUpLivePhotoEffectApplied
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.addToPeopleHome
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.bootstrap.inlineControl.dismiss
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.bootstrap.inlineControl.review
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.bootstrap.mergeCandidates.confirmedAndRejectedCounts
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.bootstrap.speedbump.advance
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.bootstrap.speedbump.cancel
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.confirmAdditional.mergeCandidates.confirmedAndRejectedCounts
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.confirmAdditional.personSuggestions.confirmedAndRejectedCounts
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.detailView.keyPhotoChanged
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.detailView.notThisPerson
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.detailView.showFaces
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.manageTags.commitTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.me.confirmed
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.me.rejected
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.naming.contactChosen
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.naming.personChosen
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.naming.skipped
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.naming.stringChosen
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.removeFromPeopleHome
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.untag.cancelTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.untag.newTagTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.people.untag.untagTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosCloudQuotaOfferAdded
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosCloudQuotaOfferRemoved
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosCloudQuotaOfferReplaced
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsAllAssetsCounted
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth1
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth10
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth11-12
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth13-15
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth16-20
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth2
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth21-30
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth3
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth31-50
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth4
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth5
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth51+
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth6
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth7
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth8
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsNavigatedToDepth9
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsShowMoreButtonSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsSummaryAssetsCounted
+ 11/12/22
+ com.apple.photos.CPAnalytics.photosDetailsSummaryButtonSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.places.locationAction
+ 11/12/22
+ com.apple.photos.CPAnalytics.rendering.livePhotoEffectFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.rendering.livePhotoEffectPreviewRenderingDuration
+ 11/12/22
+ com.apple.photos.CPAnalytics.search.session
+ 11/12/22
+ com.apple.photos.CPAnalytics.search.siri
+ 11/12/22
+ com.apple.photos.CPAnalytics.selectModeEntered
+ 11/12/22
+ com.apple.photos.CPAnalytics.shareCanceled
+ 11/12/22
+ com.apple.photos.CPAnalytics.shareCompleted
+ 11/12/22
+ com.apple.photos.CPAnalytics.shareFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedAlbumInvitationAccepted
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedAlbumInvitationDeclined
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedAlbumInvitationReportedAsJunk
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedAlbumsActivityFeedPostLiked
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedAlbumsActivityFeedPostUnliked
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedLibrary.suggestionsBanner.dismissed
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedLibrary.suggestionsBanner.presented
+ 11/12/22
+ com.apple.photos.CPAnalytics.sharedLibrary.suggestionsBanner.reviewed
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportCancelledAfter10.0-60.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportCancelledAfter2.0-10.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportCancelledAfter<2.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportCancelledAfter>60.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter0.0-1.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter1.0-2.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter10.0-20.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter120.0-300.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter2.0-5.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter20.0-60.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter300.0-600.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter5.0-10.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter60.0-120.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter600.0-3600.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter<0.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportEndedSuccessfullyAfter>3600.0Seconds
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportFailed
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowExportStarted
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.0-0.1
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.1-0.2
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.2-0.2
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.3-0.4
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.4-0.5
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.5-0.6
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.6-0.7
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.7-0.8
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.8-0.9
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction0.9-1.0
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction1.0-1.5
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction1.5-2.0
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction2.0-3.0
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction3.0-5.0
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction<0.0
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedAfterTimeFraction>5.0
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedByEndReached
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedByUndefined
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackEndedByUser
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStarted
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith0-Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith1-5Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith1001+Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith101-200Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith11-15Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith16-20Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith201-300Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith21-30Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith301-500Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith31-50Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith501-1000Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith51-100Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.slideshowPlaybackStartedWith6-10Assets
+ 11/12/22
+ com.apple.photos.CPAnalytics.syndicatedAssetsFilterTipAnchorButtonTapped
+ 11/12/22
+ com.apple.photos.CPAnalytics.syndicatedAssetsFilterTipDismissed
+ 11/12/22
+ com.apple.photos.CPAnalytics.syndicatedAssetsFilterTipPresented
+ 11/12/22
+ com.apple.photos.CPAnalytics.syndicatedAssetsSaved
+ 11/12/22
+ com.apple.photos.CPAnalytics.syndicationSuggestionRemoved
+ 11/12/22
+ com.apple.photos.CPAnalytics.tabIdentifierChanged
+ 11/12/22
+ com.apple.photos.CPAnalytics.toggleMineAndSharedSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.toggleMyPhotosOnlySelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.userChoices.livePhotoEffectBounceSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.userChoices.livePhotoEffectLongExposureSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.userChoices.livePhotoEffectLoopSelected
+ 11/12/22
+ com.apple.photos.CPAnalytics.userChoices.livePhotoEffectsAppeared
+ 11/12/22
+ com.apple.photos.CPAnalytics.viewScrolledToBottom
+ 11/12/22
+ com.apple.photos.CPAnalytics.viewScrolledToInitialPosition
+ 11/12/22
+ com.apple.photos.CPAnalytics.widget.open
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.actionOnSharedLibrarySuggestions
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.interactiveMemoryExport
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.interactiveMemoryPlayback
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.memoryMoviePlayed
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.memoryViewed
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.mobileSlideShowActive
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.slideshowExported
+ 11/12/22
+ com.apple.photos.cpa.active_user_feature.slideshowPlayed
+ 11/12/22
+ com.apple.photos.edit.perf.exitedit
+ 11/12/22
+ com.apple.photos.memory.appleMusicFixation
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurred
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInAdditionalAutoEditDecisionLists
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInAssetsPreloading
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInAutoEditClip
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInAutoEditDecisionLists
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInAutoEditTransitionInfo
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInColorNormalization
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInCuratedSongs
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInInitialStyle
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInMovieHighlights
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInMusicPlayback
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInPersistableRecipe
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInPersistence
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInRecipePersistence
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInStoryModel
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInStyleManager
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInStyles
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInTargetDurationCuration
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInTimelineManager
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInTimelineValidation
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryErrorOccurredInTransitions
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryExportCancelled
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryExportFailed
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryExported
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStarted
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedByAutoplayedRelated
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedByUserSelectingRelated
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith1-10CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith10001-20000CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith1001-2000CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith101-200CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith11-50CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith20000+CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith2001-5000CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith201-300CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith301-500CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith5001-10000CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith501-1000CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryFullscreenPlaybackStartedWith51-100CuratedAssets
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryMusicFellBackToLocalFlexSong
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryMusicUsedFlexMusic
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryMusicUseedAppleMusic
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedMuted
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedTruncated
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedUnmuted
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith0Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith1-2Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith101+Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith11-50Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith3-5Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith51-100Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackFinishedWith6-10Pauses
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackMutedDueToExplicitUserAction
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackMutedDueToSilentModeSwitch
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackUnmutedDueToExplicitUserAction
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackUnmutedDueToSilentModeSwitch
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackUnmutedDueToSongPick
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryPlaybackUnmutedDueToVolumeIncrease
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryRecipeErrorOccurred
+ 11/12/22
+ com.apple.photos.memory.interactiveMemorySessionBegan
+ 11/12/22
+ com.apple.photos.memory.interactiveMemorySessionEnded
+ 11/12/22
+ com.apple.photos.memory.interactiveMemorySessionPaused
+ 11/12/22
+ com.apple.photos.memory.interactiveMemorySessionPlayed
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryTimelinePlayedWith0-49PercentTransitionsOnBar
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryTimelinePlayedWith50-74PercentTransitionsOnBar
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryTimelinePlayedWith75-84PercentTransitionsOnBar
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryTimelinePlayedWith85-94PercentTransitionsOnBar
+ 11/12/22
+ com.apple.photos.memory.interactiveMemoryTimelinePlayedWith95-100PercentTransitionsOnBar
+ 11/12/22
+ com.apple.photos.memory.playbackLaunchPerformance
+ 11/12/22
+ com.apple.photos.memory.playbackReliability
+ 11/12/22
+ screen_CuratedLibrary_AllPhotos
+ 11/12/22
+ screen_CuratedLibrary_Days
+ 11/12/22
+ screen_CuratedLibrary_Months
+ 11/12/22
+ screen_CuratedLibrary_Years
+ 11/12/22
+ screen_DuplicatesAlbum
+ 11/12/22
+ screen_FavoriteMemories
+ 11/12/22
+ screen_IPXFeedViewController
+ 11/12/22
+ screen_InteractiveMemory
+ 11/12/22
+ screen_InteractiveMemoryBrowserGrid
+ 11/12/22
+ screen_InteractiveMemoryStyleSwitcher
+ 11/12/22
+ screen_MFMailComposeViewController
+ 11/12/22
+ screen_MFMessageComposeViewController
+ 11/12/22
+ screen_Memories
+ 11/12/22
+ screen_MemoriesFeed
+ 11/12/22
+ screen_MemoriesWidget
+ 11/12/22
+ screen_ObjectManipulationViewController
+ 11/12/22
+ screen_PMEditorNavigationController
+ 11/12/22
+ screen_PMiOSMainViewController
+ 11/12/22
+ screen_PXAssistantController
+ 11/12/22
+ screen_PXCMMAssetsViewController
+ 11/12/22
+ screen_PXEducationalTipViewController
+ 11/12/22
+ screen_PXFeedViewController
+ 11/12/22
+ screen_PXFeedbackTapToRadarViewController
+ 11/12/22
+ screen_PXFloatingCardViewController
+ 11/12/22
+ screen_PXForYouGadgetViewController
+ 11/12/22
+ screen_PXPeopleBootstrapConfirmationViewController
+ 11/12/22
+ screen_PXPeopleBootstrapSummaryViewController
+ 11/12/22
+ screen_PXPeopleCollectionViewController
+ 11/12/22
+ screen_PXPeopleConfirmationSummaryViewController
+ 11/12/22
+ screen_PXPeopleDetailViewController
+ 11/12/22
+ screen_PXPeopleNamePickerViewController
+ 11/12/22
+ screen_PXPeopleRecoCollectionViewController
+ 11/12/22
+ screen_PXPlacesMapInfoViewController
+ 11/12/22
+ screen_PXPlacesMapViewController
+ 11/12/22
+ screen_PXSharedLibraryAssistantCameraViewController
+ 11/12/22
+ screen_PXSharedLibraryAssistantHowToViewController
+ 11/12/22
+ screen_PXSharedLibraryAssistantReviewParticipantsViewController
+ 11/12/22
+ screen_PXSharedLibraryAssistantRulesViewController
+ 11/12/22
+ screen_PXSharedLibraryAssistantSummaryViewController
+ 11/12/22
+ screen_PXSurveyRadarReporterViewController
+ 11/12/22
+ screen_PXUIPeopleBootstrapNamingViewController
+ 11/12/22
+ screen_PhotosDetails_Collection
+ 11/12/22
+ screen_PhotosDetails_CuratedLibraryDays
+ 11/12/22
+ screen_PhotosDetails_CuratedLibraryMonths
+ 11/12/22
+ screen_PhotosDetails_CuratedLibraryYears
+ 11/12/22
+ screen_PhotosDetails_Memories
+ 11/12/22
+ screen_PhotosDetails_Moment
+ 11/12/22
+ screen_PhotosDetails_NonTracking
+ 11/12/22
+ screen_PhotosDetails_OneUpAccessory
+ 11/12/22
+ screen_PhotosDetails_OtherAlbums
+ 11/12/22
+ screen_PhotosDetails_People
+ 11/12/22
+ screen_PhotosDetails_Places
+ 11/12/22
+ screen_PhotosDetails_RelatedWidget
+ 11/12/22
+ screen_PhotosDetails_Search
+ 11/12/22
+ screen_PhotosDetails_Year
+ 11/12/22
+ screen_PhotosUIApps.PUXStoryColorGradeEditorViewController
+ 11/12/22
+ screen_PhotosUIApps.PUXStoryExportActivityPreviewViewController
+ 11/12/22
+ screen_PhotosUIApps.PUXStoryExportActivityViewController
+ 11/12/22
+ screen_PhotosUIApps.PUXStoryMusicEditorViewController
+ 11/12/22
+ screen_PhotosView
+ 11/12/22
+ screen_SBSUIWallpaperPreviewViewController
+ 11/12/22
+ screen_SLComposeViewController
+ 11/12/22
+ screen_TPKContentPopoverViewController
+ 11/12/22
+ screen_UIImagePickerController
+ 11/12/22
+ screen__UIActivityUserDefaultsViewController
+ 11/12/22
+
+ lastSeenDates
+
+ com.apple.photos.CPAnalytics.assetCollectionViewed
+ 1/22/23
+ com.apple.photos.CPAnalytics.mediaViewed
+ 1/22/23
+ com.apple.photos.CPAnalytics.search.session
+ 11/12/22
+ screen_CuratedLibrary_AllPhotos
+ 1/22/23
+ screen_PhotosDetails_People
+ 1/22/23
+ screen_PhotosView
+ 11/12/22
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotoAnalysisServicePreferences.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotoAnalysisServicePreferences.plist
new file mode 100644
index 000000000..60f1cbb0c
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotoAnalysisServicePreferences.plist
@@ -0,0 +1,60 @@
+
+
+
+
+ BackgroundHighlightCollection
+ 2020-06-24T04:02:13Z
+ BackgroundHighlightEnrichment
+ 2020-06-24T04:02:12Z
+ BackgroundJobAssetRevGeocode
+ 2020-06-24T04:02:13Z
+ BackgroundJobSearch
+ 2020-06-24T04:02:13Z
+ BackgroundPeopleSuggestion
+ 2020-06-24T04:02:12Z
+ BackgroundUserBehaviorProcessor
+ 2020-06-24T04:02:13Z
+ PHAAssetRevGeocodeEnrichmentTask
+ 2022-11-12T21:54:14Z
+ PHACachingCPAnalyticsPropertiesTask
+ 2022-11-12T21:54:15Z
+ PHAContactClassificationTask
+ 2022-11-12T21:54:24Z
+ PHAFeaturesUsageReportingTask
+ 2022-11-12T21:54:00Z
+ PHAForcedHighlightEnrichmentTask
+ 2022-11-12T21:54:25Z
+ PHAGraphConsistencyTask
+ 2022-11-12T21:54:08Z
+ PHAGraphRebuildTask
+ 2022-11-12T21:54:05Z
+ PHAHighlightCollectionEnrichmentTask
+ 2022-11-12T21:54:06Z
+ PHAHighlightEnrichmentTask
+ 2022-11-12T21:54:06Z
+ PHAMediaSampleReportingTask
+ 2022-11-12T21:54:15Z
+ PHAMemoriesEnrichmentTask
+ 2022-11-12T21:54:15Z
+ PHAMemoryElectionTask
+ 2022-11-12T21:54:13Z
+ PHAPeopleSuggestionEnrichmentTask
+ 2022-11-12T21:54:05Z
+ PHAPortraitDonationEnrichmentTask
+ 2022-11-12T21:54:15Z
+ PHASearchEnrichmentTask
+ 2022-11-12T21:54:15Z
+ PHASuggestionGenerationTask
+ 2022-11-12T21:54:14Z
+ PHAUserBehaviorEnrichmentTask
+ 2022-11-12T21:54:15Z
+ PhotoAnalysisGraphLastBackgroundGraphConsistencyUpdateJobDateKey
+ 2020-05-30T02:16:06Z
+ PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate
+ 2020-05-29T04:31:37Z
+ PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate
+ 2020-06-24T04:02:13Z
+ SiriPortraitDonation
+ 2020-06-24T04:02:13Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb
new file mode 100644
index 000000000..47e1e3a11
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/construction-photosgraph.kgdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb
new file mode 100644
index 000000000..4ab71e6c6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/liveupdate-photosgraph.kgdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb
new file mode 100644
index 000000000..47e1e3a11
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph-tmp.kgdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb
new file mode 100644
index 000000000..fbc9ff44a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb-shm
new file mode 100644
index 000000000..fd95e397b
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb-wal
new file mode 100644
index 000000000..46c88aae3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/PhotosGraph/photosgraph.kgdb-wal differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/changetoken.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/changetoken.plist
new file mode 100644
index 000000000..7b397bf20
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/changetoken.plist differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/ftemetrics b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/ftemetrics
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/revgeoprovider.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/revgeoprovider.plist
new file mode 100644
index 000000000..bf8f1e5d5
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/graph/revgeoprovider.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ revgeoprovider
+ 7618
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/4E294112-DC9D-4B49-9561-1946B53A4E19.cmap b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/4E294112-DC9D-4B49-9561-1946B53A4E19.cmap
new file mode 100644
index 000000000..cca93d7ca
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/4E294112-DC9D-4B49-9561-1946B53A4E19.cmap differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/9A5E0437-04AA-45DC-AAA7-FDC74A91F170.cmap b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/9A5E0437-04AA-45DC-AAA7-FDC74A91F170.cmap
new file mode 100644
index 000000000..40018f765
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/9A5E0437-04AA-45DC-AAA7-FDC74A91F170.cmap differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/AlgoFaceClusterCache.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/AlgoFaceClusterCache.data
new file mode 100644
index 000000000..f16b4a76d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/AlgoFaceClusterCache.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/PersonPromoter b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/PersonPromoter
new file mode 100644
index 000000000..5feb64f2b
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/PersonPromoter
@@ -0,0 +1,14 @@
+
+
+
+
+ NumberOfFacesProcessedOnLastRun
+ 7
+ ProcessedInQuiescentState
+
+ SuggestedMeIdentifier
+
+ Version
+ 4
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/PhotoAnalysisServicePreferences.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/PhotoAnalysisServicePreferences.plist
new file mode 100644
index 000000000..bdd3d7531
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/PhotoAnalysisServicePreferences.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ FaceIDModelLastGenerationKey
+ 2020-05-29T03:44:04Z
+ LastContactClassificationKey
+ 2020-05-29T04:31:40Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/clustererState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/clustererState.plist
new file mode 100644
index 000000000..cb4560b6e
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/clustererState.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ PVClustererBringUpState
+ 50
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/faceWorkerState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/faceWorkerState.plist
new file mode 100644
index 000000000..c36206de2
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/faceWorkerState.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ IncrementalPersonProcessingStage
+ 6
+ PersonBuilderLastMinimumFaceGroupSizeForCreatingMergeCandidates
+ 15
+ PersonBuilderMergeCandidatesEnabled
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/vnpersonsmodel.bin b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/vnpersonsmodel.bin
new file mode 100644
index 000000000..211a83f70
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/caches/vision/vnpersonsmodel.bin differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotoAnalysisServicePreferences.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotoAnalysisServicePreferences.plist
new file mode 100644
index 000000000..be5ca4c7d
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotoAnalysisServicePreferences.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ PhotoAnalysisGraphLastBackgroundGraphRebuildJobDate
+ 2019-08-07T02:26:15Z
+ PhotoAnalysisGraphLastBackgroundMemoryGenerationJobDate
+ 2019-08-17T14:26:34Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb
new file mode 100644
index 000000000..96fee1cea
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/construction-photosgraph.graphdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb
new file mode 100644
index 000000000..4d8a5dfb1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/liveupdate-photosgraph.graphdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb
new file mode 100644
index 000000000..96fee1cea
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph-tmp.graphdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb
new file mode 100644
index 000000000..147ce4009
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb-shm b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb-shm
new file mode 100644
index 000000000..fe9ac2845
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb-shm differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb-wal b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/graph/PhotosGraph/photosgraph.graphdb-wal
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/2E578BF2-718A-43E1-81BA-80AC61004DCF.cmap b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/2E578BF2-718A-43E1-81BA-80AC61004DCF.cmap
new file mode 100644
index 000000000..4aaf1638f
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/2E578BF2-718A-43E1-81BA-80AC61004DCF.cmap differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/AlgoFaceClusterCache.data b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/AlgoFaceClusterCache.data
new file mode 100644
index 000000000..1f14d5359
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/AlgoFaceClusterCache.data differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/C7589FFF-A378-4059-ABDC-19C4316A8B69.cmap b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/C7589FFF-A378-4059-ABDC-19C4316A8B69.cmap
new file mode 100644
index 000000000..1d6b64462
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/C7589FFF-A378-4059-ABDC-19C4316A8B69.cmap differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/PersonPromoter b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/PersonPromoter
new file mode 100644
index 000000000..4fdc85b48
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/PersonPromoter
@@ -0,0 +1,12 @@
+
+
+
+
+ ProcessedInQuiescentState
+
+ SuggestedMeIdentifier
+
+ Version
+ 3
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/clustererState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/clustererState.plist
new file mode 100644
index 000000000..cb4560b6e
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/clustererState.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ PVClustererBringUpState
+ 50
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/faceWorkerState.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/faceWorkerState.plist
new file mode 100644
index 000000000..736db69d7
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photoanalysisd/vision/faceWorkerState.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ IncrementalPersonProcessingStage
+ 0
+ PersonBuilderLastMinimumFaceGroupSizeForCreatingMergeCandidates
+ 15
+ PersonBuilderMergeCandidatesEnabled
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photolibraryd/appPrivateData.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photolibraryd/appPrivateData.plist
new file mode 100644
index 000000000..5181f1161
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photolibraryd/appPrivateData.plist
@@ -0,0 +1,128 @@
+
+
+
+
+ MigrationAction
+
+ Background
+
+ PLModelMigrationAction_AddMissingExtendedAttributeDateTimezone
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_AddMissingExtendedAttributeDigitalZoomRatio
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_AddMissingExtendedAttributeFocalLengthIn35mm
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_AddMissingExtendedAttributeLocation
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_CinematicVideoPopulateDepthType
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_FixExtendedAttributeDateCreated
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_PopulateExtendedAttributes
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_RemoveOrphanedMediaAnalysisAttributes
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_RemoveOrphanedSceneprint
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+ PLModelMigrationAction_updateACVideos
+
+ PLBackgroundMigrationStartDate
+ 2022-11-12T21:33:04Z
+ PLBackgroundMigrationStatus
+ 2
+ PLBackgroundMigrationStatusAttempts
+ 1
+ PLBackgroundMigrationStatusDate
+ 2022-11-12T21:33:04Z
+
+
+ ResumeMaker
+
+
+ PLDeferredCriticalMaintenanceTask
+ 2022-11-12T21:34:06Z
+ PLLibraryServicesManager.LocaleIdentifier
+ en_US
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photomodel/appPrivateData.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photomodel/appPrivateData.plist
new file mode 100644
index 000000000..106cedb0c
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/private/com.apple.photomodel/appPrivateData.plist
@@ -0,0 +1,11 @@
+
+
+
+
+ LithiumMessageTracer
+
+ LastReportedDate
+ 2019-08-04T13:32:55Z
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/.metadata_never_index b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/.metadata_never_index
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/caches/analytics/CPAnalyticsPropertiesCache.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/caches/analytics/CPAnalyticsPropertiesCache.plist
new file mode 100644
index 000000000..e5fc1522b
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/caches/analytics/CPAnalyticsPropertiesCache.plist
@@ -0,0 +1,46 @@
+
+
+
+
+ cpa_cache_demographicSummary
+
+ cpa_demographic_userAgeRange
+ Unknown
+ cpa_demographic_userGender
+ Unknown
+
+ cpa_cache_lastCacheTime
+ 2022-11-12T21:54:15Z
+ cpa_cache_librarySummary
+
+ cpa_common_collectionCount
+ 16
+ cpa_common_faceAnalysisProgress
+ 1
+ cpa_common_fullAnalysisProgress
+ 0.92307692307692313
+ cpa_common_icpl_enabled
+
+ cpa_common_icpl_exceedingQuota
+
+ cpa_common_icpl_hasChangesToProcess
+
+ cpa_common_icpl_lowDiskSpace
+
+ cpa_common_icpl_veryLowDiskSpace
+
+ cpa_common_momentCount
+ 10
+ cpa_common_personCount
+ 3
+ cpa_common_photoCount
+ 16
+ cpa_common_sceneAnalysisProgress
+ 1
+ cpa_common_videoCount
+ 0
+
+ cpa_music_hasAppleMusicSubscription
+
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/1/1EB2B765-0765-43BA-A90C-0D0580E6172C_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/1/1EB2B765-0765-43BA-A90C-0D0580E6172C_1_105_c.jpeg
new file mode 100644
index 000000000..8a612cdc8
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/1/1EB2B765-0765-43BA-A90C-0D0580E6172C_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907_1_105_c.jpeg
new file mode 100644
index 000000000..c19de1d48
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_1_100_o.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_1_100_o.jpeg
new file mode 100644
index 000000000..d5ece67d6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_1_100_o.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_1_105_c.jpeg
new file mode 100644
index 000000000..bb5e38af9
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_1_105_c.jpeg
new file mode 100644
index 000000000..c36ba3a58
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/6/6FD38366-3BF2-407D-81FE-7153EB6125B6_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/6/6FD38366-3BF2-407D-81FE-7153EB6125B6_1_105_c.jpeg
new file mode 100644
index 000000000..4b8730c66
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/6/6FD38366-3BF2-407D-81FE-7153EB6125B6_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/7/71E3E212-00EB-430D-8A63-5E294B268554_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/7/71E3E212-00EB-430D-8A63-5E294B268554_1_105_c.jpeg
new file mode 100644
index 000000000..ccbb2fd02
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/7/71E3E212-00EB-430D-8A63-5E294B268554_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_105_c.jpeg
new file mode 100644
index 000000000..ed80532d3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/8/8846E3E6-8AC8-4857-8448-E3D025784410_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/8/8846E3E6-8AC8-4857-8448-E3D025784410_1_105_c.jpeg
new file mode 100644
index 000000000..539b4e593
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/8/8846E3E6-8AC8-4857-8448-E3D025784410_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/8/8E1D7BC9-9321-44F9-8CFB-4083F6B9232A_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/8/8E1D7BC9-9321-44F9-8CFB-4083F6B9232A_1_105_c.jpeg
new file mode 100644
index 000000000..312b01d27
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/8/8E1D7BC9-9321-44F9-8CFB-4083F6B9232A_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/A/A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/A/A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_1_105_c.jpeg
new file mode 100644
index 000000000..f8943c5cd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/A/A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_1_105_c.jpeg
new file mode 100644
index 000000000..82af4102c
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_100_o.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_100_o.jpeg
new file mode 100644
index 000000000..03d2c6ce7
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_100_o.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_105_c.jpeg
new file mode 100644
index 000000000..82a19c3a6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D79B8D77-BFFC-460B-9312-034F2877D35B_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D79B8D77-BFFC-460B-9312-034F2877D35B_1_105_c.jpeg
new file mode 100644
index 000000000..4f0c1479d
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/D79B8D77-BFFC-460B-9312-034F2877D35B_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/DC99FBDD-7A52-4100-A5BB-344131646C30_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/DC99FBDD-7A52-4100-A5BB-344131646C30_1_105_c.jpeg
new file mode 100644
index 000000000..5a00c3242
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/D/DC99FBDD-7A52-4100-A5BB-344131646C30_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_105_c.jpeg
new file mode 100644
index 000000000..db88ba040
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/F/F12384F6-CD17-4151-ACBA-AE0E3688539E_1_105_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/F/F12384F6-CD17-4151-ACBA-AE0E3688539E_1_105_c.jpeg
new file mode 100644
index 000000000..6881aa315
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/F/F12384F6-CD17-4151-ACBA-AE0E3688539E_1_105_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/1/1EB2B765-0765-43BA-A90C-0D0580E6172C_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/1/1EB2B765-0765-43BA-A90C-0D0580E6172C_4_5005_c.jpeg
new file mode 100644
index 000000000..839cdcbd8
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/1/1EB2B765-0765-43BA-A90C-0D0580E6172C_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907_4_5005_c.jpeg
new file mode 100644
index 000000000..e68f1ee60
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/3/3DD2C897-F19E-4CA6-8C22-B027D5A71907_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_4_5005_c.jpeg
new file mode 100644
index 000000000..a4a8a5edd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/4/4D521201-92AC-43E5-8F7C-59BC41C37A96_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_4_5005_c.jpeg
new file mode 100644
index 000000000..4e1d70f6a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/6/6FD38366-3BF2-407D-81FE-7153EB6125B6_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/6/6FD38366-3BF2-407D-81FE-7153EB6125B6_4_5005_c.jpeg
new file mode 100644
index 000000000..03d0ff799
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/6/6FD38366-3BF2-407D-81FE-7153EB6125B6_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/7/71E3E212-00EB-430D-8A63-5E294B268554_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/7/71E3E212-00EB-430D-8A63-5E294B268554_4_5005_c.jpeg
new file mode 100644
index 000000000..c48aa6ea3
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/7/71E3E212-00EB-430D-8A63-5E294B268554_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_4_5005_c.jpeg
new file mode 100644
index 000000000..8b5467f65
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/8/8846E3E6-8AC8-4857-8448-E3D025784410_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/8/8846E3E6-8AC8-4857-8448-E3D025784410_4_5005_c.jpeg
new file mode 100644
index 000000000..a26808556
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/8/8846E3E6-8AC8-4857-8448-E3D025784410_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/8/8E1D7BC9-9321-44F9-8CFB-4083F6B9232A_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/8/8E1D7BC9-9321-44F9-8CFB-4083F6B9232A_4_5005_c.jpeg
new file mode 100644
index 000000000..c0d826ffb
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/8/8E1D7BC9-9321-44F9-8CFB-4083F6B9232A_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/A/A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/A/A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_4_5005_c.jpeg
new file mode 100644
index 000000000..b3e0f9302
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/A/A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_4_5005_c.jpeg
new file mode 100644
index 000000000..c41dcce50
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/A/A92D9C26-3A50-4197-9388-CB5F7DB9FA91_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_4_5005_c.jpeg
new file mode 100644
index 000000000..f4939048a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/D79B8D77-BFFC-460B-9312-034F2877D35B_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/D79B8D77-BFFC-460B-9312-034F2877D35B_4_5005_c.jpeg
new file mode 100644
index 000000000..3cdee08ce
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/D79B8D77-BFFC-460B-9312-034F2877D35B_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/DC99FBDD-7A52-4100-A5BB-344131646C30_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/DC99FBDD-7A52-4100-A5BB-344131646C30_4_5005_c.jpeg
new file mode 100644
index 000000000..6e9e2b127
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/D/DC99FBDD-7A52-4100-A5BB-344131646C30_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_4_5005_c.jpeg
new file mode 100644
index 000000000..f510f7144
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/F/F12384F6-CD17-4151-ACBA-AE0E3688539E_4_5005_c.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/F/F12384F6-CD17-4151-ACBA-AE0E3688539E_4_5005_c.jpeg
new file mode 100644
index 000000000..95c0ea854
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/masters/F/F12384F6-CD17-4151-ACBA-AE0E3688539E_4_5005_c.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/3356.ithmb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/3356.ithmb
new file mode 100644
index 000000000..3197081d4
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/3356.ithmb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/4133.ithmb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/4133.ithmb
new file mode 100644
index 000000000..a2675e6c4
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/4133.ithmb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/4532.ithmb b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/4532.ithmb
new file mode 100644
index 000000000..7a3f381e1
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/4532.ithmb differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/thumbnailConfiguration b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/thumbnailConfiguration
new file mode 100644
index 000000000..6c331ad12
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/derivatives/thumbs/thumbnailConfiguration
@@ -0,0 +1,17 @@
+
+
+
+
+ PLThumbnailManagerThumbnailFormatKey
+ 5005
+ PLThumbnailManagerThumbnailFormatsKey
+
+ 5005
+ 4532
+ 4133
+ 3356
+
+ PLThumbnailManagerVersionKey
+ 31
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album-change.plj
new file mode 100644
index 000000000..ae920f991
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album-snapshot.plj
new file mode 100644
index 000000000..f6e35acdc
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album.plist
new file mode 100644
index 000000000..1ca755721
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Album.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2022-11-12T21:34:07Z
+ coalescePayloadVersion
+ 1
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset-change.plj
new file mode 100644
index 000000000..5cfae321c
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset-snapshot.plj
new file mode 100644
index 000000000..33c37cd24
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset.plist
new file mode 100644
index 000000000..1bb402ab8
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Asset.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2022-11-12T21:34:07Z
+ coalescePayloadVersion
+ 103
+ currentPayloadVersion
+ 300
+ snapshotDate
+ 2019-11-11T04:16:28Z
+ snapshotPayloadVersion
+ 10
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DeferredRebuildFace-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DeferredRebuildFace-snapshot.plj
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DeferredRebuildFace.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DeferredRebuildFace.plist
new file mode 100644
index 000000000..3a4b91404
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DeferredRebuildFace.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:57Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace-change.plj
new file mode 100644
index 000000000..171ec8604
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace-snapshot.plj
new file mode 100644
index 000000000..f78df5b73
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace.plist
new file mode 100644
index 000000000..1ca755721
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/DetectedFace.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2022-11-12T21:34:07Z
+ coalescePayloadVersion
+ 1
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FetchingAlbum-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FetchingAlbum-snapshot.plj
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FetchingAlbum.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FetchingAlbum.plist
new file mode 100644
index 000000000..99732eaec
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FetchingAlbum.plist
@@ -0,0 +1,18 @@
+
+
+
+
+ coalesceDate
+ 2023-07-15T21:17:00Z
+ coalescePayloadVersion
+ 2
+ currentPayloadVersion
+ 2
+ snapshotChecksum
+
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FileSystemVolume-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FileSystemVolume-snapshot.plj
new file mode 100644
index 000000000..71155590a
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FileSystemVolume-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FileSystemVolume.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FileSystemVolume.plist
new file mode 100644
index 000000000..ac1db1360
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/FileSystemVolume.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2020-05-29T15:20:05Z
+ coalescePayloadVersion
+ 1
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder-change.plj
new file mode 100644
index 000000000..2c9dda384
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder-snapshot.plj
new file mode 100644
index 000000000..751122fea
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder.plist
new file mode 100644
index 000000000..1ca755721
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Folder.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2022-11-12T21:34:07Z
+ coalescePayloadVersion
+ 1
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/HistoryToken.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/HistoryToken.plist
new file mode 100644
index 000000000..5d2d1df49
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/HistoryToken.plist differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ImportSession-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ImportSession-snapshot.plj
new file mode 100644
index 000000000..98b7b9f87
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ImportSession-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ImportSession.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ImportSession.plist
new file mode 100644
index 000000000..1ca755721
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ImportSession.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2022-11-12T21:34:07Z
+ coalescePayloadVersion
+ 1
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword-change.plj
new file mode 100644
index 000000000..bc1570ab6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword-snapshot.plj
new file mode 100644
index 000000000..f512308e6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword.plist
new file mode 100644
index 000000000..3ece9a2cf
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Keyword.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Memory-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Memory-snapshot.plj
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Memory.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Memory.plist
new file mode 100644
index 000000000..3ece9a2cf
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Memory.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory-change.plj
new file mode 100644
index 000000000..74e4d6bd6
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory-snapshot.plj
new file mode 100644
index 000000000..d5eda50a0
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory.plist
new file mode 100644
index 000000000..4ec37c7f7
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/MigrationHistory.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2020-10-02T13:39:59Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person-change.plj
new file mode 100644
index 000000000..cf1c943b5
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person-change.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person-snapshot.plj
new file mode 100644
index 000000000..c2eac19cc
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person-snapshot.plj differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person.plist
new file mode 100644
index 000000000..1ca755721
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/Person.plist
@@ -0,0 +1,16 @@
+
+
+
+
+ coalesceDate
+ 2022-11-12T21:34:07Z
+ coalescePayloadVersion
+ 1
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ProjectAlbum-snapshot.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ProjectAlbum-snapshot.plj
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ProjectAlbum.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ProjectAlbum.plist
new file mode 100644
index 000000000..3ece9a2cf
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/ProjectAlbum.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2019-10-27T15:02:55Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/SocialGroup-change.plj b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/SocialGroup-change.plj
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/SocialGroup.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/SocialGroup.plist
new file mode 100644
index 000000000..facd3207d
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/journals/SocialGroup.plist
@@ -0,0 +1,12 @@
+
+
+
+
+ currentPayloadVersion
+ 1
+ snapshotDate
+ 2024-06-10T23:34:56Z
+ snapshotPayloadVersion
+ 1
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.plist
new file mode 100644
index 000000000..b69a91476
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ adjustmentBaseVersion
+ 0
+ adjustmentData
+
+ bZBNS8NAEIb/y5xDaGxTSa62Yi8VFFQQD5PspJmS3Q27k15C/ruTBBTB68zzfsyMcKMQ
+ 2buTazyUI1QDd+Y82IoClJAVj8UeEsC+f1u5eZhnaVakWb7RTaxbsvhCN163WQJ9h9L4
+ YBV9fv2AKQFLggYF5wCLUSi8s5EWyrvN7l4F3FPHjn4jVJfu1H2Fn4gvraj3dp8n4AOT
+ E5Q1Tt3nLJQfsTZAcx2iWMUilJ/jPwQ5rDoyUEoYSK8gEXaXOBekpqH6L7xMzmhJq20P
+ h4DqxvWD9918HRsN4oaXjx0XFqav6Rs=
+
+ adjustmentEditorBundleID
+ com.apple.Photos
+ adjustmentFormatIdentifier
+ com.apple.photo
+ adjustmentFormatVersion
+ 1.4
+ adjustmentTimestamp
+ 2020-05-29T03:39:38Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_1_201_a.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_1_201_a.jpeg
new file mode 100644
index 000000000..c2b531111
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/6/6191423D-8DB8-4D4C-92BE-9BBBA308AAC4_1_201_a.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266.plist
new file mode 100644
index 000000000..080450e01
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266.plist
@@ -0,0 +1,68 @@
+
+
+
+
+ adjustmentBaseVersion
+ 0
+ adjustmentData
+
+ bVfbkqM6sv0Xv1ZHl8BgQ0fMAyCJm8EgbsZT84ABczVggwvsHfvfj1zdfXZPxPCGMrVy
+ KSVlLv21+sxvY9V3enfuVz/+Wp3uVZvZ98spv61+rFgg8WuBS1ffVskwhD9d6fiaAd+Z
+ 7wwDqGFMy/ySkPyz+mlkvq2GNpnO/e1CPffeYfX3t9Uln5IsmZJXiEsyTvktqrKpXP1Y
+ A5ajE6ohb6su/ycCnfedo+g/nbW8Kspp9YMDa/bbqr9VeTcl089wFP0VK5n+fzJlkGT1
+ fZwu1G1c/fj3X//DI++SU5tnqx/T7Z7TVeTTVHXF+CLYn8/0d9enSbv7GRd8+zWo0f/2
+ NTZ+DVbdcJ9++3xnhA0QNzzgOLAFPMMKv2ehZejH+y3/A0huk7Rx+qr7E12+vaC6fPyJ
+ Pr7WOE5V+sVqAOwrCABbgVsz6y3LcyJgxA3Y0vzx4MsmCmAtsgy/ETbsluMBZZDcpz5M
+ 2vsr+HdW4Dfgj48m8/QnEYq+ZsTthmdopnlRYJkt/2019V3SkqQr8l9BOH6z2fKABZQF
+ y1KPgeW/TGueFTmG2W44mgBBYNfUJAovEy/+90eZfeXRSga62xgPZgaGkxc2biTxB8I0
+ diTbEcbxYCnmYODiFMmXO2bislb8rTGhqgFhqUcGbhlHD9U2SphsiiIxSVuGPaxb+PG+
+ 4Bm2gRM2WWzg1AmJNKPlqEeojNXQRpFsHFAYx5Gi6kbS2vHyWeC1VJyC2xxkYsi0xzFk
+ meOJGZaDFp5z+QKh19jhzEe4jYMQ4ogwmRaC8uDhjOK2FLfxo+amO8n8+fEebDewHZ2j
+ TKbgcgwSHF7DT+42emczOi9p2/IcfqAjmUUKFCeh3KTI53wNZQcvLA0KePTa1ozAlPqY
+ sQ5VWJAzspVCbO2OeOeQ9KE6hM2j+Hg3QZCSsgGB0+912TiTN8psBhasrUSTxdjDvwEH
+ M2qm0xdgwxc+i524ACqMXOYTko/3ULPYQsFjyBkKs3gFPkn+XOoelvUgXMhhH/UkJJXp
+ mbIeN78YNnTvmIUCMucvwJLmyg3sqDU2tmoFGZEZW5QOi7zvUOX6qLRc2MQHIqcBDovQ
+ ezhnw0yrYzBUXwTBiyDFC37htbiBUWzLBXMPHY7siWkgSSCI6B7q3CBjeCGOAzdc7JBO
+ i0CZHfClaD/em/XHu/cp/sMwYPLfiMHBsjOZn5xrQTdrfhPNeL72uAVRZ59GzK/pMSqv
+ r2PZ9lFEyM2Y5iGCb2fvLm0OaOi+cgh+5ZDBrdP13dHLAj3S41zuSvXSZ2X51mtdXFte
+ dNTYJvqUpZ338W6bFOCkNkV4kxOTJKW1aZ5HPxP3DPp4z/034rJY84Md5xWzUMLHTPYy
+ ilA0ltvFbfTn+CQ+TW2j3x152KA+pEtbcoxnB87CHj5dl5Q7jNLZuy+mqA3uKV3mO37M
+ jutyZxgB7ym9JXCeHSQHD7jEg+MzexdLgvcMkW331yZ4LBgDFxYUr0TUTxtQJHlxOdUG
+ a/VuFbD60zolhXiDxeyqBUcg6W04Aw97em5XjbgHohLAydqteWuGV4KWwEsJvuBdGi6y
+ 66pn22lbuQ6i4Hb0jp0eDeFJDqewk+zUBTvoWUdTQTdd6WvLlwSrZtIc87zWNedHtXWt
+ oXdguZyQMjs6ibbavgkECWjQTZ08tEVtn0UpbhfUSXtVmjVIwMV6zGvzGd+sqpktCG65
+ qljxYf48yxvFMMOKlUOEJ4nM0sd7AY+9rbkgg8Xo8AV7fp1qhfCMMehONjNrSCRb9UbB
+ blzg1vrH+64e73slEw53uy6aSFL1ueiq50Vr9eNQdp5/vvYf7xRahFJjmWTXmWfLFmaW
+ oC72MlmnOQKeLs0u3eOt50/mHgVPh1Wloy7xtZooIWdlVWW8mWIr31xx0gLr6JOnAN+Q
+ jWTXw/p8uMq7G9y4gUqaQlOszJDnC127bT5aZAbFQBRLgBy+lPi6P4qkruh9VY/BLOLO
+ gYngXuXa3luFu5C5U2sri8l8pliB6kk3o5auttcwBrTyXQFMTObWfIwP+BAcXAh20LeX
+ Sr1bu0GoOkXJDNM6tjIakSx4TrmuNS9tdlXwaUC93j3Q03zOTwJtbAU0nCw9UakfVDJf
+ DJB6iCARwdSrGdVJjDBqlmqv9XPeL8VA82TDAlzgQ69tj9taPlgcT3jT/aB0/WHvhBLn
+ zYyMXHDQFetueNyQlKFttDOXEfFi4rQ5PmxGPQLPqcxSZWILzcIRyVZqePpF8/vSqayP
+ dwsKo6OMYOcXte3OJ2WJd5gUF80rxv3jmRmWlCfK1tG5oLt6xNHWXFDKtgLZYG/M4hUt
+ Y6xX1kWvgtLwKJHn/HBhCCnhaa/on7BMLZ24PpSlzvENbsc19efj+GnZ49RWd2xcxuJa
+ Dp+oLk7t0hZGB4a6QoNepbWpBDdjPYp+zdh2EDzdamJhq3v0Qtr4IFnKLGQYjOemTmiP
+ 0Irq4oXF7pYeCNn46FY46TKtsTqXdcmusTlerCqbadkIulm4o53k0mazV9PRlhcK2qAg
+ kbiANrrQWcRZM9EFyHmGGekUyu2gXqSkJnKtGU2YLg9P74BfldkDtRbZyb5n7NN46woR
+ cnsyFkDDcrB3iH7EXHAs5ERSw7lYPAfipIlKJWrxMY6yMmwgp9sHV6zgZcrWM09bZm+H
+ 7sc72YkpLW8nHePGUSgwPeKBKh9lNeTO41LecZpOdQVjTZ+TqswR4l33RMIWrXUvcBkP
+ 4cJJJDaFnEQeEt/gfh668rHTVFCeCjGGRWErLnDUsC8Lb7/FPHcoypuM++BwKWORXm7a
+ yI0SdZxjyWaJ8mZPce7wQWVCKW+wMF6B4pW7o8t8vD92H+/atdgrrwIVjMNU3R8GbVtT
+ aZT40PvJYvQQAJLLtNTzVkBk9IYUQAs6LYSkCXEhunTX3aR8sJDlXLfELBRHt5Y4ndal
+ vVNppqm7QTILVxTFdKOFGXWBE8wMjw7BbSS4RFhyEtIktNjQs/F2QhoXNMRg1FFK7654
+ hjLwkvkthS7ttsSQ1clNn5Wp6VzsBwSdUdgcGnkRUO/6HbHv8NDbhst9onC0YxLVSHC9
+ +LEL/Bwbd5ctoOTatfsWwQc9QgXQtbYhqOoI3sQZnd8gQ3J2rmiqB+TQhunBdeGcC1DA
+ df8vKv/blwiX/pSw6w3L/SlhN99Wc1lN+S8Jy7wk7B8S+PUaYX6K439k8S+Z/G1VUglq
+ 5o+XWQCbNbd5+bBUxLP85u/fqlzpu+lGnyF/CHWvTLJ+fql06lVl9JlRnauvF5N3SW6T
+ 33f56u///P1/
+
+ adjustmentEditorBundleID
+ com.apple.Photos
+ adjustmentFormatIdentifier
+ com.apple.photo
+ adjustmentFormatVersion
+ 1.5
+ adjustmentTimestamp
+ 2020-10-04T06:00:14Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_201_a.heic b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_201_a.heic
new file mode 100644
index 000000000..c7b00d6cd
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_201_a.heic differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/D/DC99FBDD-7A52-4100-A5BB-344131646C30.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/D/DC99FBDD-7A52-4100-A5BB-344131646C30.plist
new file mode 100644
index 000000000..b298f6be9
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/D/DC99FBDD-7A52-4100-A5BB-344131646C30.plist
@@ -0,0 +1,20 @@
+
+
+
+
+ adjustmentBaseVersion
+ 0
+ adjustmentData
+
+ shkyAAAAAAACAAAA
+
+ adjustmentEditorBundleID
+ com.apple.Photos
+ adjustmentFormatIdentifier
+ com.apple.Photos.externalEdit
+ adjustmentFormatVersion
+ 1
+ adjustmentTimestamp
+ 2019-12-01T15:27:48Z
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/D/DC99FBDD-7A52-4100-A5BB-344131646C30_1_201_a.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/D/DC99FBDD-7A52-4100-A5BB-344131646C30_1_201_a.jpeg
new file mode 100644
index 000000000..7bcb36b93
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/D/DC99FBDD-7A52-4100-A5BB-344131646C30_1_201_a.jpeg differ
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.plist b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.plist
new file mode 100644
index 000000000..4117c7312
--- /dev/null
+++ b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ adjustmentBaseVersion
+ 0
+ adjustmentData
+
+ bVFNT4RADP0vPSNh+FgWbsbE6MVNNFET42F2KVADAxnKqiH8dwvIukZP0+l77XtvZoAj
+ 2o4ac2vyBtIB9j1V2V1f79FCCmp7rQIfHNBt+7gQpRuEkXJjV/meIN2hxFrf45EWVDnQ
+ VprzxtZC3T08w+hAjawzzXpSqHXHaJ8o4xJS3wu3MkAtVmTwR0Lm3FC2L+QbpKJk2R1s
+ YgcaS2hY8yIn2yctzadhcaCzt77jWmgdpC/DPww0el9hBinbHiUFMpMpuslgeVLzI0HY
+ 6umO5tIUFUJ64TlwaMzcN/ydQ3rvS6Uif+PAx85SQWYGPtdanQ+umTwJQJk4pZzmN7+y
+ TTu9eM/zh6znHx/eb5VVPk5E5hRBJdGZgcQbx/F1/AI=
+
+ adjustmentEditorBundleID
+ com.apple.photos
+ adjustmentFormatIdentifier
+ com.apple.photo
+ adjustmentFormatVersion
+ 1.4
+ adjustmentRenderTypes
+ 0
+
+
diff --git a/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_201_a.jpeg b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_201_a.jpeg
new file mode 100644
index 000000000..88caa5373
Binary files /dev/null and b/tests/Test-15.0.0_Dev_Preview.photoslibrary/resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_201_a.jpeg differ
diff --git a/tests/test_sequoia_15_0_0_preview.py b/tests/test_sequoia_15_0_0_preview.py
new file mode 100644
index 000000000..fbcbce860
--- /dev/null
+++ b/tests/test_sequoia_15_0_0_preview.py
@@ -0,0 +1,1342 @@
+"""Test macOS 15.0 Photos library"""
+
+import json
+from collections import namedtuple
+
+import pytest
+
+import osxphotos
+from osxphotos._constants import _UNKNOWN_PERSON
+
+PHOTOS_DB = "./tests/Test-15.0.0_Dev_Preview.photoslibrary/database/photos.db"
+PHOTOS_DB_PATH = "/Test-15.0.0_Dev_Preview.photoslibrary/database/photos.db"
+PHOTOS_LIBRARY_PATH = "/Test-15.0.0_Dev_Preview.photoslibrary"
+
+
+PHOTOS_DB_LEN = 16
+PHOTOS_NOT_IN_TRASH_LEN = 14
+PHOTOS_IN_TRASH_LEN = 2
+
+KEYWORDS = [
+ "Kids",
+ "wedding",
+ "flowers",
+ "England",
+ "London",
+ "London 2018",
+ "St. James's Park",
+ "UK",
+ "United Kingdom",
+]
+
+PERSONS = ["Katie", "Suzy", "Maria"]
+ALBUMS = [
+ "Pumpkin Farm",
+ "Test Album", # there are 2 albums named "Test Album" for testing duplicate album names
+ "AlbumInFolder",
+ "Raw",
+ "I have a deleted twin", # there's an empty album with same name that has been deleted
+ "EmptyAlbum",
+ "2018-10 - Sponsion, Museum, Frühstück, Römermuseum",
+ "2019-10/11 Paris Clermont",
+]
+
+KEYWORDS_DICT = {
+ "Kids": 4,
+ "wedding": 3,
+ "UK": 1,
+ "England": 1,
+ "London": 1,
+ "United Kingdom": 1,
+ "London 2018": 1,
+ "St. James's Park": 1,
+ "flowers": 1,
+ "Birthday": 0,
+ "Digital Nomad": 0,
+ "Family": 0,
+ "Indoor": 0,
+ "Reiseblogger": 0,
+ "Stock Photography": 0,
+ "Top Shot": 0,
+ "Vacation": 0,
+ "close up": 0,
+ "colorful": 0,
+ "design": 0,
+ "display": 0,
+ "fake": 0,
+ "flower": 0,
+ "kids": 0,
+ "outdoor": 0,
+ "photography": 0,
+ "plastic": 0,
+ "raw-only": 0,
+ "stock photo": 0,
+ "vibrant": 0,
+ "we": 0,
+}
+
+PERSONS_DICT = {
+ "Katie": 3,
+ "Suzy": 2,
+ "Maria": 2,
+}
+
+ALBUM_DICT = {
+ "Pumpkin Farm": 3,
+ "Test Album": 2,
+ "AlbumInFolder": 2,
+ "Raw": 4,
+ "I have a deleted twin": 1,
+ "EmptyAlbum": 0,
+ "2018-10 - Sponsion, Museum, Frühstück, Römermuseum": 1,
+ "2019-10/11 Paris Clermont": 1,
+} # Note: there are 2 albums named "Test Album" for testing duplicate album names
+
+UUID_DICT = {
+ "missing": "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C",
+ "favorite": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
+ "not_favorite": "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C",
+ "hidden": "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C",
+ "not_hidden": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
+ "has_adjustments": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
+ "adjustments_info": "7783E8E6-9CAC-40F3-BE22-81FB7051C266",
+ "no_adjustments": "D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068",
+ "location": "DC99FBDD-7A52-4100-A5BB-344131646C30",
+ "no_location": "6191423D-8DB8-4D4C-92BE-9BBBA308AAC4",
+ "external_edit": "DC99FBDD-7A52-4100-A5BB-344131646C30",
+ "no_external_edit": "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51",
+ "export": "D79B8D77-BFFC-460B-9312-034F2877D35B", # "Pumkins2.jpg"
+ "export_tif": "8846E3E6-8AC8-4857-8448-E3D025784410",
+ "in_album": "D79B8D77-BFFC-460B-9312-034F2877D35B", # "Pumkins2.jpg"
+ "date_invalid": "8846E3E6-8AC8-4857-8448-E3D025784410",
+ "intrash": "71E3E212-00EB-430D-8A63-5E294B268554",
+ "not_intrash": "DC99FBDD-7A52-4100-A5BB-344131646C30",
+ "intrash_person_keywords": "6FD38366-3BF2-407D-81FE-7153EB6125B6",
+}
+
+UUID_PUMPKIN_FARM = [
+ "F12384F6-CD17-4151-ACBA-AE0E3688539E",
+ "D79B8D77-BFFC-460B-9312-034F2877D35B",
+ "1EB2B765-0765-43BA-A90C-0D0580E6172C",
+]
+
+ALBUM_SORT_ORDER = [
+ "1EB2B765-0765-43BA-A90C-0D0580E6172C",
+ "F12384F6-CD17-4151-ACBA-AE0E3688539E",
+ "D79B8D77-BFFC-460B-9312-034F2877D35B",
+]
+ALBUM_KEY_PHOTO = "D79B8D77-BFFC-460B-9312-034F2877D35B"
+
+UTI_DICT = {
+ "8846E3E6-8AC8-4857-8448-E3D025784410": "public.tiff",
+ "7783E8E6-9CAC-40F3-BE22-81FB7051C266": "public.heic",
+ "1EB2B765-0765-43BA-A90C-0D0580E6172C": "public.jpeg",
+ "4D521201-92AC-43E5-8F7C-59BC41C37A96": "public.jpeg",
+}
+
+UTI_ORIGINAL_DICT = {
+ "8846E3E6-8AC8-4857-8448-E3D025784410": "public.tiff",
+ "7783E8E6-9CAC-40F3-BE22-81FB7051C266": "public.heic",
+ "1EB2B765-0765-43BA-A90C-0D0580E6172C": "public.jpeg",
+ "4D521201-92AC-43E5-8F7C-59BC41C37A96": "public.jpeg",
+}
+
+
+RawInfo = namedtuple(
+ "RawInfo",
+ [
+ "comment",
+ "original_filename",
+ "has_raw",
+ "israw",
+ "raw_original",
+ "uti",
+ "uti_original",
+ "uti_raw",
+ ],
+)
+RAW_DICT = {
+ "D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068": RawInfo(
+ "raw image, no jpeg pair",
+ "DSC03584.dng",
+ False,
+ True,
+ False,
+ "com.adobe.raw-image",
+ "com.adobe.raw-image",
+ None,
+ ),
+ "A92D9C26-3A50-4197-9388-CB5F7DB9FA91": RawInfo(
+ "raw+jpeg, jpeg original",
+ "IMG_1994.JPG",
+ True,
+ False,
+ False,
+ "public.jpeg",
+ "public.jpeg",
+ "com.canon.cr2-raw-image",
+ ),
+ "4D521201-92AC-43E5-8F7C-59BC41C37A96": RawInfo(
+ "raw+jpeg, raw original",
+ "IMG_1997.JPG",
+ True,
+ False,
+ True,
+ "public.jpeg",
+ "public.jpeg",
+ "com.canon.cr2-raw-image",
+ ),
+ "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51": RawInfo(
+ "jpeg, no raw",
+ "wedding.jpg",
+ False,
+ False,
+ False,
+ "public.jpeg",
+ "public.jpeg",
+ None,
+ ),
+}
+
+# HEIC image that's been edited in Big Sur, resulting edit is .HEIC
+UUID_HEIC_EDITED = "7783E8E6-9CAC-40F3-BE22-81FB7051C266"
+PATH_HEIC_EDITED = (
+ "resources/renders/7/7783E8E6-9CAC-40F3-BE22-81FB7051C266_1_201_a.heic"
+)
+
+# file is reference (not copied to library)
+UUID_IS_REFERENCE = "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C"
+UUID_NOT_REFERENCE = "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51"
+
+UUID_MOMENT = {
+ "3DD2C897-F19E-4CA6-8C22-B027D5A71907": {
+ "uuid": "3DD2C897-F19E-4CA6-8C22-B027D5A71907",
+ "location": (-34.91889167000001, 138.59686167),
+ "title": "Adelaide",
+ "subtitle": "",
+ "start_date": "2017-06-20T17:18:56.518000+09:30",
+ "end_date": "2017-06-20T17:18:56.518000+09:30",
+ "date": "2017-06-20T17:18:56.518000+09:30",
+ "modification_date": "2020-04-06T15:22:24.595584+09:30",
+ }
+}
+
+UUID_LABELS = {"6191423D-8DB8-4D4C-92BE-9BBBA308AAC4": ["Plant", "Flower Arrangement"]}
+
+UUID_CAMERA = {
+ "4D521201-92AC-43E5-8F7C-59BC41C37A96": "Canon PowerShot G10",
+ "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C": "",
+}
+
+
+UUID_DETECTED_TEXT = {
+ "4D521201-92AC-43E5-8F7C-59BC41C37A96": ["mint", "mojito", "sprouts"],
+ "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C": [],
+}
+
+UUID_SEARCH_INFO = {
+ "3DD2C897-F19E-4CA6-8C22-B027D5A71907": {
+ "labels": ["Art", "Clothing", "Plant", "Statue"],
+ "place_names": ["River Torrens/Karrawirra Parri"],
+ "streets": ["River Torrens Linear Park Trl"],
+ "neighborhoods": ["Central Ward"],
+ "city": "Adelaide",
+ "locality_names": [],
+ "state": "Adelaide",
+ "state_abbreviation": "SA",
+ "country": "Australia",
+ "bodies_of_water": [],
+ "month": "June",
+ "year": "2017",
+ "holidays": [],
+ "activities": [],
+ "season": "Summer",
+ "venues": [],
+ "venue_types": [],
+ "media_types": [],
+ "detected_text": [],
+ "camera": "Apple iPhone 6s",
+ "source": "",
+ }
+}
+
+
+UUID_FINGERPRINT = {
+ "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51": "ASs96bJvsunOg9Vxo5hK7VU3HegE"
+}
+
+UUID_FAVORITE_PERSON = "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51" # wedding.jpg, Maria
+UUID_NOT_FAVORITE_PERSON = "D79B8D77-BFFC-460B-9312-034F2877D35B" # Pumkins2.jpg, Katie
+UUID_PERSON_FEATURE_LESS = UUID_NOT_FAVORITE_PERSON
+UUID_PERSON_NOT_FEATURE_LESS = UUID_FAVORITE_PERSON
+
+
+@pytest.fixture(scope="module")
+def photosdb():
+ return osxphotos.PhotosDB(dbfile=PHOTOS_DB)
+
+
+def test_init1():
+ # test named argument
+ import osxphotos
+
+ photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
+ assert isinstance(photosdb, osxphotos.PhotosDB)
+
+
+def test_init2():
+ # test positional argument
+ import osxphotos
+
+ photosdb = osxphotos.PhotosDB(PHOTOS_DB)
+ assert isinstance(photosdb, osxphotos.PhotosDB)
+
+
+def test_init3():
+ # test positional and named argument (raises exception)
+ import osxphotos
+
+ with pytest.raises(Exception):
+ assert osxphotos.PhotosDB(PHOTOS_DB, dbfile=PHOTOS_DB)
+
+
+def test_init4():
+ # test invalid db
+ import os
+ import tempfile
+
+ import osxphotos
+
+ (bad_db, bad_db_name) = tempfile.mkstemp(suffix=".db", prefix="osxphotos-")
+ os.close(bad_db)
+
+ with pytest.raises(Exception):
+ assert osxphotos.PhotosDB(bad_db_name)
+
+ with pytest.raises(Exception):
+ assert osxphotos.PhotosDB(dbfile=bad_db_name)
+
+ try:
+ os.remove(bad_db_name)
+ except:
+ pass
+
+
+def test_init5(mocker):
+ # test failed get_last_library_path
+ import osxphotos
+
+ def bad_library():
+ return None
+
+ # get_last_library actually in utils but need to patch it in photosdb because it's imported into photosdb
+ # because of the layout of photosdb/ need to patch it this way...don't really understand why, but it works
+ mocker.patch("osxphotos.photosdb.photosdb.get_last_library_path", new=bad_library)
+
+ with pytest.raises(Exception):
+ assert osxphotos.PhotosDB()
+
+
+def test_db_len(photosdb):
+ # assert photosdb.db_version in osxphotos._TESTED_DB_VERSIONS
+ assert len(photosdb) == PHOTOS_DB_LEN
+
+
+def test_db_version(photosdb):
+ # assert photosdb.db_version in osxphotos._TESTED_DB_VERSIONS
+ assert photosdb.db_version == "6000"
+
+
+def test_photos_version(photosdb):
+ assert photosdb.photos_version == 10
+
+
+def test_persons(photosdb):
+ import collections
+
+ assert "Katie" in photosdb.persons
+ assert collections.Counter(PERSONS) == collections.Counter(photosdb.persons)
+
+
+def test_keywords(photosdb):
+ import collections
+
+ assert "wedding" in photosdb.keywords
+ assert collections.Counter(KEYWORDS) == collections.Counter(photosdb.keywords)
+
+
+def test_album_names(photosdb):
+ import collections
+
+ assert "Pumpkin Farm" in photosdb.albums
+ assert collections.Counter(ALBUMS) == collections.Counter(photosdb.albums)
+
+
+def test_keywords_dict(photosdb):
+ keywords = photosdb.keywords_as_dict
+ assert keywords["wedding"] == 3
+ assert keywords == KEYWORDS_DICT
+
+
+def test_persons_as_dict(photosdb):
+ persons = photosdb.persons_as_dict
+ assert persons["Maria"] == 2
+ assert persons == PERSONS_DICT
+
+
+def test_albums_as_dict(photosdb):
+ albums = photosdb.albums_as_dict
+ assert albums["Pumpkin Farm"] == 3
+ assert albums == ALBUM_DICT
+
+
+def test_album_sort_order(photosdb):
+ album = [a for a in photosdb.album_info if a.title == "Pumpkin Farm"][0]
+ photos = album.photos
+
+ uuids = [p.uuid for p in photos]
+ assert uuids == ALBUM_SORT_ORDER
+
+
+def test_album_empty_album(photosdb):
+ album = [a for a in photosdb.album_info if a.title == "EmptyAlbum"][0]
+ photos = album.photos
+ assert photos == []
+
+
+def test_attributes(photosdb):
+ import datetime
+
+ photos = photosdb.photos(uuid=["D79B8D77-BFFC-460B-9312-034F2877D35B"])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.keywords == ["Kids"]
+ assert p.original_filename == "Pumkins2.jpg"
+ assert p.filename == "D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg"
+ assert p.date == datetime.datetime(
+ 2018, 9, 28, 16, 7, 7, 0, datetime.timezone(datetime.timedelta(seconds=-14400))
+ )
+ assert p.date_added == datetime.datetime(
+ 2019,
+ 7,
+ 27,
+ 9,
+ 16,
+ 49,
+ 778432,
+ tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)),
+ )
+ assert p.description == "Girl holding pumpkin"
+ assert p.title == "I found one!"
+ assert sorted(p.albums) == ["Pumpkin Farm", "Test Album"]
+ assert p.persons == ["Katie"]
+ assert p.path.endswith(
+ "tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/D/D79B8D77-BFFC-460B-9312-034F2877D35B.jpeg"
+ )
+ assert not p.ismissing
+
+
+def test_attributes_2(photosdb):
+ """Test attributes including height, width, etc"""
+ import datetime
+
+ photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.keywords == ["wedding"]
+ assert p.original_filename == "wedding.jpg"
+ assert p.filename == "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.jpeg"
+ assert p.date == datetime.datetime(
+ 2019,
+ 4,
+ 15,
+ 14,
+ 40,
+ 24,
+ 86000,
+ datetime.timezone(datetime.timedelta(seconds=-14400)),
+ )
+ assert p.description == "Bride Wedding day"
+ assert p.title is None
+ assert sorted(p.albums) == ["AlbumInFolder", "I have a deleted twin"]
+ assert p.persons == ["Maria"]
+ assert p.path.endswith(
+ "tests/Test-15.0.0_Dev_Preview.photoslibrary/originals/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.jpeg"
+ )
+ assert not p.ismissing
+ assert p.hasadjustments
+ assert p.height == 1325
+ assert p.width == 1526
+ assert p.original_height == 1367
+ assert p.original_width == 2048
+ assert p.orientation == 1
+ assert p.original_orientation == 1
+ assert p.original_filesize == 460483
+
+
+def test_missing(photosdb):
+ photos = photosdb.photos(uuid=[UUID_DICT["missing"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.path is None
+ assert p.ismissing
+
+
+def test_favorite(photosdb):
+ photos = photosdb.photos(uuid=[UUID_DICT["favorite"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.favorite
+
+
+def test_not_favorite(photosdb):
+ photos = photosdb.photos(uuid=[UUID_DICT["not_favorite"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert not p.favorite
+
+
+def test_hidden(photosdb):
+ photos = photosdb.photos(uuid=[UUID_DICT["hidden"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.hidden
+
+
+def test_not_hidden(photosdb):
+ photos = photosdb.photos(uuid=[UUID_DICT["not_hidden"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert not p.hidden
+
+
+def test_location_1(photosdb):
+ # test photo with lat/lon info
+ photos = photosdb.photos(uuid=[UUID_DICT["location"]])
+ assert len(photos) == 1
+ p = photos[0]
+ lat, lon = p.location
+ assert lat == pytest.approx(51.50357167)
+ assert lon == pytest.approx(-0.1318055)
+
+
+def test_location_2(photosdb):
+ # test photo with no location info
+ photos = photosdb.photos(uuid=[UUID_DICT["no_location"]])
+ assert len(photos) == 1
+ p = photos[0]
+ lat, lon = p.location
+ assert lat is None
+ assert lon is None
+
+
+def test_hasadjustments1(photosdb):
+ # test hasadjustments
+ photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.hasadjustments
+
+
+def test_hasadjustments2(photosdb):
+ # test hasadjustments == False
+ photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert not p.hasadjustments
+
+
+def test_external_edit1(photosdb):
+ # test image has been edited in external editor
+ photos = photosdb.photos(uuid=[UUID_DICT["external_edit"]])
+ assert len(photos) == 1
+ p = photos[0]
+
+ assert p.external_edit
+
+
+def test_external_edit2(photosdb):
+ # test image has not been edited in external editor
+ photos = photosdb.photos(uuid=[UUID_DICT["no_external_edit"]])
+ assert len(photos) == 1
+ p = photos[0]
+
+ assert not p.external_edit
+
+
+def test_path_edited_jpeg(photosdb):
+ # test a valid edited path
+ import os.path
+
+ photos = photosdb.photos(uuid=["E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51"])
+ assert len(photos) == 1
+ p = photos[0]
+ path = p.path_edited
+ assert path.endswith(
+ "resources/renders/E/E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51_1_201_a.jpeg"
+ )
+ assert os.path.exists(path)
+
+
+def test_path_edited_heic(photosdb):
+ # test a valid edited path for .heic image
+ import pathlib
+
+ photo = photosdb.get_photo(UUID_HEIC_EDITED)
+ assert photo.path_edited.endswith(PATH_HEIC_EDITED)
+ assert pathlib.Path(photo.path_edited).is_file()
+
+
+def test_path_edited2(photosdb):
+ # test an invalid edited path
+ photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
+ assert len(photos) == 1
+ p = photos[0]
+ path = p.path_edited
+ assert path is None
+
+
+def test_path_derivatives(photosdb):
+ # test an path_derivatives
+
+ photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
+ assert len(photos) == 1
+ p = photos[0]
+ path = p.path_derivatives
+ derivs = [
+ "D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_100_o.jpeg",
+ "D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_1_105_c.jpeg",
+ "D05A5FE3-15FB-49A1-A15D-AB3DA6F8B068_4_5005_c.jpeg",
+ ]
+ for i, p in enumerate(path):
+ assert p.endswith(derivs[i])
+
+
+def test_count(photosdb):
+ photos = photosdb.photos()
+ assert len(photos) == PHOTOS_NOT_IN_TRASH_LEN
+
+
+def test_photos_intrash_1(photosdb):
+ """test PhotosDB.photos(intrash=True)"""
+ photos = photosdb.photos(intrash=True)
+ assert len(photos) == PHOTOS_IN_TRASH_LEN
+
+
+def test_photos_intrash_2(photosdb):
+ """test PhotosDB.photos(intrash=True)"""
+ photos = photosdb.photos(intrash=True)
+ for p in photos:
+ assert p.intrash
+
+
+def test_photos_intrash_3(photosdb):
+ """test PhotosDB.photos(intrash=False)"""
+ photos = photosdb.photos(intrash=False)
+ for p in photos:
+ assert not p.intrash
+
+
+def test_photoinfo_intrash_1(photosdb):
+ """Test PhotoInfo.intrash"""
+ p = photosdb.photos(uuid=[UUID_DICT["intrash"]], intrash=True)[0]
+ assert p.intrash
+
+
+def test_photoinfo_intrash_2(photosdb):
+ """Test PhotoInfo.intrash and intrash=default"""
+ p = photosdb.photos(uuid=[UUID_DICT["intrash"]])
+ assert not p
+
+
+def test_photoinfo_intrash_3(photosdb):
+ """Test PhotoInfo.intrash and photo has keyword and person"""
+ p = photosdb.photos(uuid=[UUID_DICT["intrash_person_keywords"]], intrash=True)[0]
+ assert p.intrash
+ assert "Maria" in p.persons
+ assert "wedding" in p.keywords
+
+
+def test_photoinfo_intrash_4(photosdb):
+ """Test PhotoInfo.intrash and photo has keyword and person"""
+ p = photosdb.photos(persons=["Maria"], intrash=True)[0]
+ assert p.intrash
+ assert "Maria" in p.persons
+ assert "wedding" in p.keywords
+
+
+def test_photoinfo_intrash_5(photosdb):
+ """Test PhotoInfo.intrash and photo has keyword and person"""
+ p = photosdb.photos(keywords=["wedding"], intrash=True)[0]
+ assert p.intrash
+ assert "Maria" in p.persons
+ assert "wedding" in p.keywords
+
+
+def test_photoinfo_not_intrash(photosdb):
+ """Test PhotoInfo.intrash"""
+ p = photosdb.photos(uuid=[UUID_DICT["not_intrash"]])[0]
+ assert not p.intrash
+
+
+def test_keyword_2(photosdb):
+ photos = photosdb.photos(keywords=["wedding"])
+ assert len(photos) == 2 # won't show the one in the trash
+
+
+def test_keyword_not_in_album(photosdb):
+ # find all photos with keyword "Kids" not in the album "Pumpkin Farm"
+ photos1 = photosdb.photos(albums=["Pumpkin Farm"])
+ photos2 = photosdb.photos(keywords=["Kids"])
+ photos3 = [p for p in photos2 if p not in photos1]
+ assert len(photos3) == 1
+ assert photos3[0].uuid == "A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C"
+
+
+def test_album_folder_name(photosdb):
+ """Test query with album name same as a folder name"""
+
+ photos = photosdb.photos(albums=["Pumpkin Farm"])
+ assert sorted(p.uuid for p in photos) == sorted(UUID_PUMPKIN_FARM)
+
+
+def test_multi_person(photosdb):
+ photos = photosdb.photos(persons=["Katie", "Suzy"])
+
+ assert len(photos) == 3
+
+
+def test_get_db_path(photosdb):
+ db_path = photosdb.db_path
+ assert db_path.endswith(PHOTOS_DB_PATH)
+
+
+def test_get_library_path(photosdb):
+ lib_path = photosdb.library_path
+ assert lib_path.endswith(PHOTOS_LIBRARY_PATH)
+
+
+def test_get_db_connection(photosdb):
+ """Test PhotosDB.get_db_connection"""
+ import sqlite3
+
+ conn, cursor = photosdb.get_db_connection()
+
+ assert isinstance(conn, sqlite3.Connection)
+ assert isinstance(cursor, sqlite3.Cursor)
+
+ results = conn.execute("SELECT ZUUID FROM ZASSET WHERE ZFAVORITE = 1;").fetchall()
+ assert len(results) == 1
+ assert results[0][0] == "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51" # uuid
+
+ conn.close()
+
+
+def test_export_1(photosdb):
+ # test basic export
+ # get an unedited image and export it using default filename
+ import os
+ import os.path
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ filename = photos[0].original_filename
+ expected_dest = os.path.join(dest, filename)
+ got_dest = photos[0].export(dest)[0]
+
+ assert got_dest == expected_dest
+ assert os.path.isfile(got_dest)
+
+
+def test_export_2(photosdb):
+ # test export with user provided filename
+ import os
+ import os.path
+ import tempfile
+ import time
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ timestamp = time.time()
+ filename = f"osxphotos-export-2-test-{timestamp}.jpg"
+ expected_dest = os.path.join(dest, filename)
+ got_dest = photos[0].export(dest, filename)[0]
+
+ assert got_dest == expected_dest
+ assert os.path.isfile(got_dest)
+
+
+def test_export_3(photosdb):
+ # test file already exists and test increment=True (default)
+ import os
+ import os.path
+ import pathlib
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ filename = photos[0].original_filename
+ filename2 = pathlib.Path(filename)
+ filename2 = f"{filename2.stem} (1){filename2.suffix}"
+ expected_dest_2 = os.path.join(dest, filename2)
+
+ got_dest = photos[0].export(dest)[0]
+ got_dest_2 = photos[0].export(dest)[0]
+
+ assert got_dest_2 == expected_dest_2
+ assert os.path.isfile(got_dest_2)
+
+
+def test_export_4(photosdb):
+ # test user supplied file already exists and test increment=True (default)
+ import os
+ import os.path
+ import pathlib
+ import tempfile
+ import time
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ timestamp = time.time()
+ filename = f"osxphotos-export-2-test-{timestamp}.jpg"
+ filename2 = f"osxphotos-export-2-test-{timestamp} (1).jpg"
+ expected_dest_2 = os.path.join(dest, filename2)
+
+ got_dest = photos[0].export(dest, filename)[0]
+ got_dest_2 = photos[0].export(dest, filename)[0]
+
+ assert got_dest_2 == expected_dest_2
+ assert os.path.isfile(got_dest_2)
+
+
+def test_export_5(photosdb):
+ # test file already exists and test increment=True (default)
+ # and overwrite = True
+ import os
+ import os.path
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ filename = photos[0].original_filename
+ expected_dest = os.path.join(dest, filename)
+
+ got_dest = photos[0].export(dest)[0]
+ got_dest_2 = photos[0].export(dest, overwrite=True)[0]
+
+ assert got_dest_2 == got_dest
+ assert got_dest_2 == expected_dest
+ assert os.path.isfile(got_dest_2)
+
+
+def test_export_6(photosdb):
+ # test user supplied file already exists and test increment=True (default)
+ # and overwrite = True
+ import os
+ import os.path
+ import pathlib
+ import tempfile
+ import time
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ timestamp = time.time()
+ filename = f"osxphotos-export-test-{timestamp}.jpg"
+ expected_dest = os.path.join(dest, filename)
+
+ got_dest = photos[0].export(dest, filename)[0]
+ got_dest_2 = photos[0].export(dest, filename, overwrite=True)[0]
+
+ assert got_dest_2 == got_dest
+ assert got_dest_2 == expected_dest
+ assert os.path.isfile(got_dest_2)
+
+
+def test_export_7(photosdb):
+ # test file already exists and test increment=False (not default), overwrite=False (default)
+ # should raise exception
+ import os
+ import os.path
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ filename = photos[0].filename
+
+ got_dest = photos[0].export(dest)[0]
+ with pytest.raises(Exception) as e:
+ # try to export again with increment = False
+ assert photos[0].export(dest, increment=False)
+ assert e.type == type(FileExistsError())
+
+
+def test_export_8(photosdb):
+ # try to export missing file
+ # should return empty list
+ import os
+ import os.path
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["missing"]])
+
+ assert photos[0].export(dest) == []
+
+
+def test_export_9(photosdb):
+ # try to export edited file that's not edited
+ # should raise exception
+ import os
+ import os.path
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
+
+ filename = photos[0].filename
+
+ with pytest.raises(Exception) as e:
+ assert photos[0].export(dest, edited=True)
+ assert e.type == ValueError
+
+
+def test_export_10(photosdb):
+ # try to export edited file that's not edited and name provided
+ # should raise exception
+ import os
+ import os.path
+ import tempfile
+ import time
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]])
+
+ timestamp = time.time()
+ filename = f"osxphotos-export-test-{timestamp}.jpg"
+
+ with pytest.raises(Exception) as e:
+ assert photos[0].export(dest, filename, edited=True)
+ assert e.type == ValueError
+
+
+def test_export_11(photosdb):
+ # export edited file with name provided
+ import os
+ import os.path
+ import tempfile
+ import time
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
+
+ timestamp = time.time()
+ filename = f"osxphotos-export-test-{timestamp}.jpg"
+ expected_dest = os.path.join(dest, filename)
+
+ got_dest = photos[0].export(dest, filename, edited=True)[0]
+ assert got_dest == expected_dest
+
+
+def test_export_12(photosdb):
+ # export edited file with default name
+ import os
+ import os.path
+ import pathlib
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["has_adjustments"]])
+
+ edited_name = pathlib.Path(photos[0].path_edited).name
+ edited_suffix = pathlib.Path(edited_name).suffix
+ filename = (
+ pathlib.Path(photos[0].original_filename).stem + "_edited" + edited_suffix
+ )
+ expected_dest = os.path.join(dest, filename)
+
+ got_dest = photos[0].export(dest, edited=True)[0]
+ assert got_dest == expected_dest
+
+
+def test_export_13(photosdb):
+ # export to invalid destination
+ # should raise exception
+ import os
+ import os.path
+ import tempfile
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+
+ # create a folder that doesn't exist
+ i = 0
+ while os.path.isdir(dest):
+ dest = os.path.join(dest, str(i))
+ i += 1
+
+ photos = photosdb.photos(uuid=[UUID_DICT["export"]])
+
+ filename = photos[0].filename
+
+ with pytest.raises(Exception) as e:
+ assert photos[0].export(dest)
+ assert e.type == type(FileNotFoundError())
+
+
+def test_export_14(caplog, photosdb):
+ # test export with user provided filename with different (but valid) extension than source
+ import os
+ import os.path
+ import tempfile
+ import time
+
+ tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
+ dest = tempdir.name
+ photos = photosdb.photos(uuid=[UUID_DICT["export_tif"]])
+
+ timestamp = time.time()
+ filename = f"osxphotos-export-2-test-{timestamp}.tif"
+ expected_dest = os.path.join(dest, filename)
+ got_dest = photos[0].export(dest, filename)[0]
+
+ assert got_dest == expected_dest
+ assert os.path.isfile(got_dest)
+
+ assert "Invalid destination suffix" not in caplog.text
+
+
+def test_eq(photosdb):
+ """Test equality of two PhotoInfo objects"""
+ import osxphotos
+
+ photosdb2 = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
+ photos1 = photosdb.photos(uuid=[UUID_DICT["export"]])
+ photos2 = photosdb2.photos(uuid=[UUID_DICT["export"]])
+ assert photos1[0] == photos2[0]
+
+
+def test_eq_2(photosdb):
+ """Test equality of two PhotoInfo objects when one has memoized property"""
+ import osxphotos
+
+ photosdb2 = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
+ photos1 = photosdb.photos(uuid=[UUID_DICT["in_album"]])
+ photos2 = photosdb2.photos(uuid=[UUID_DICT["in_album"]])
+
+ # memoize a value
+ albums = photos1[0].albums
+ assert albums
+
+ assert photos1[0] == photos2[0]
+
+
+def test_not_eq(photosdb):
+ photos1 = photosdb.photos(uuid=[UUID_DICT["export"]])
+ photos2 = photosdb.photos(uuid=[UUID_DICT["missing"]])
+ assert photos1[0] != photos2[0]
+
+
+def test_photosdb_repr():
+ photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
+ photosdb2 = eval(repr(photosdb))
+
+ ignore_keys = ["_tmp_db", "_tempdir", "_tempdir_name", "_db_connection"]
+ assert {k: v for k, v in photosdb.__dict__.items() if k not in ignore_keys} == {
+ k: v for k, v in photosdb2.__dict__.items() if k not in ignore_keys
+ }
+
+
+def test_photosinfo_repr(photosdb):
+ import datetime
+
+ photos = photosdb.photos(uuid=[UUID_DICT["favorite"]])
+ photo = photos[0]
+ photo2 = eval(repr(photo))
+
+ assert {k: str(v).encode("utf-8") for k, v in photo.__dict__.items()} == {
+ k: str(v).encode("utf-8") for k, v in photo2.__dict__.items()
+ }
+
+
+@pytest.mark.usefixtures("set_tz_pacific")
+def test_from_to_date(photosdb):
+ import datetime as dt
+
+ photos = photosdb.photos(from_date=dt.datetime(2018, 10, 28))
+ assert len(photos) == 7
+
+ photos = photosdb.photos(to_date=dt.datetime(2018, 10, 28))
+ assert len(photos) == 7
+
+ photos = photosdb.photos(
+ from_date=dt.datetime(2018, 9, 28), to_date=dt.datetime(2018, 9, 29)
+ )
+ assert len(photos) == 4
+
+
+@pytest.mark.usefixtures("set_tz_pacific")
+def test_date_invalid():
+ """Test date is invalid"""
+ # doesn't run correctly with the module-level fixture
+ from datetime import datetime, timedelta, timezone
+
+ import osxphotos
+
+ # UUID_DICT["date_invalid"] has an invalid date that's
+ # been manually adjusted in the database
+ photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB)
+ photos = photosdb.photos(uuid=[UUID_DICT["date_invalid"]])
+ assert len(photos) == 1
+ p = photos[0]
+ delta = timedelta(seconds=p.tzoffset)
+ tz = timezone(delta)
+ assert p.date == datetime(1970, 1, 1).astimezone(tz=tz)
+
+
+def test_date_modified_invalid(photosdb):
+ """Test date modified is invalid"""
+ from datetime import datetime, timedelta, timezone
+
+ # UUID_DICT["date_invalid"] has an invalid modified date that's
+ # been manually adjusted in the database
+ photos = photosdb.photos(uuid=[UUID_DICT["date_invalid"]])
+ assert len(photos) == 1
+ p = photos[0]
+ assert p.date_modified is None
+
+
+def test_uti(photosdb):
+ """test uti"""
+
+ for uuid, uti in UTI_DICT.items():
+ photo = photosdb.get_photo(uuid)
+ assert photo.uti == uti
+ assert photo.uti_original == UTI_ORIGINAL_DICT[uuid]
+
+
+def test_raw(photosdb):
+ """Test various raw properties"""
+
+ for uuid, rawinfo in RAW_DICT.items():
+ photo = photosdb.get_photo(uuid)
+ assert photo.original_filename == rawinfo.original_filename
+ assert photo.has_raw == rawinfo.has_raw
+ assert photo.israw == rawinfo.israw
+ assert photo.uti == rawinfo.uti
+ assert photo.uti_original == rawinfo.uti_original
+ assert photo.uti_raw == rawinfo.uti_raw
+
+
+def test_is_reference(photosdb):
+ """test isreference"""
+
+ photo = photosdb.get_photo(UUID_IS_REFERENCE)
+ assert photo.isreference
+ photo = photosdb.get_photo(UUID_NOT_REFERENCE)
+ assert not photo.isreference
+
+
+def test_adjustments(photosdb):
+ """test adjustments/AdjustmentsInfo"""
+ from osxphotos.adjustmentsinfo import AdjustmentsInfo
+
+ photo = photosdb.get_photo(UUID_DICT["adjustments_info"])
+ adjustments = photo.adjustments
+ assert isinstance(adjustments, AdjustmentsInfo)
+ assert adjustments.asdict() == {
+ "data": b"mW\xdb\x92\xa3:\xb2\xfd\x17\xbfVG\x97\xc0`CG\xcc\x03 \x89\x9b\xc1 n\xc6S\xf3\x80\x01s5`\x83\x0b\xec\x1d\xfb\xdf\x8f\\\xdd}vO\xc4\xf0\x862\xb5r)%e.\xfd\xb5\xfa\xccoc\xd5wzw\xeeW?\xfeZ\x9d\xeeU\x9b\xd9\xf7\xcb)\xbf\xad~\xacX \xf1k\x81KW\xdfV\xc90\x84?]\xe9\xf8\x9a\x01\xdf\x99\xef\x0c\x03\xa8aL\xcb\xfc\x92\x90\xfc\xb3\xfaid\xbe\xad\x866\x99\xce\xfd\xedB=\xf7\xdea\xf5\xf7\xb7\xd5%\x9f\x92,\x99\x92W\x88K2N\xf9-\xaa\xb2\xa9\\\xfdX\x03\x96\xa3\x13\xaa!o\xab.\xff'\x02\x9d\xf7\x9d\xa3\xe8?\x9d\xb5\xbc*\xcai\xf5\x83\x03k\xf6\xdb\xaa\xbfUy7%\xd3\xcfp\x14\xfd\x15+\x99\xfe\x7f2e\x90d\xf5}\x9c.\xd4m\\\xfd\xf8\xf7_\xff\xc3#\xef\x92S\x9bg\xab\x1f\xd3\xed\x9e\xd3U\xe4\xd3Tu\xc5\xf8\"\xd8\x9f\xcf\xf4w\xd7\xa7I\xbb\xfb\x19\x17|\xfb5\xa8\xd1\xff\xf656~\rV\xddp\x9f~\xfb|g\x84\r\x107<\xe08\xb0\x05<\xc3\n\xbfg\xa1e\xe8\xc7\xfb-\xff\x03Hn\x93\xb4q\xfa\xaa\xfb\x13]\xbe\xbd\xa0\xba|\xfc\x89>\xbe\xd68NU\xfa\xc5j\x00\xec+\x08\x00[\x81[3\xeb-\xcbs\"`\xc4\r\xd8\xd2\xfc\xf1\xe0\xcb&\n`-\xb2\x0c\xbf\x116\xec\x96\xe3\x01e\x90\xdc\xa7>L\xda\xfb+\xf8wV\xe07\xe0\x8f\x8f&\xf3\xf4'\x11\x8a\xbef\xc4\xed\x86gh\xa6yQ`\x99-\xffm5\xf5]\xd2\x92\xa4+\xf2_A8~\xb3\xd9\xf2\x80\x05\x94\x05\xcbR\x8f\x81\xe5\xbfLk\x9e\x159\x86\xd9n8\x9a\x00A`\xd7\xd4$\n/\x13/\xfe\xf7G\x99}\xe5\xd1J\x06\xba\xdb\x18\x0ff\x06\x86\x93\x176n$\xf1\x07\xc24v$\xdb\x11\xc6\xf1`)\xe6`\xe0\xe2\x14\xc9\x97;f\xe2\xb2V\xfc\xad1\xa1\xaa\x01a\xa9G\x06n\x19G\x0f\xd56J\x98l\x8a\"1I[\x86=\xac[\xf8\xf1\xbe\xe0\x19\xb6\x81\x136Yl\xe0\xd4\t\x894\xa3\xe5\xa8G\xa8\x8c\xd5\xd0F\x91l\x1cP\x18\xc7\x91\xa2\xeaF\xd2\xda\xf1\xf2Y\xe0\xb5T\x9c\x82\xdb\x1cdb\xc8\xb4\xc71d\x99\xe3\x89\x19\x96\x83\x16\x9es\xf9\x02\xa1\xd7\xd8\xe1\xccG\xb8\x8d\x83\x10\xe2\x880\x99\x16\x82\xf2\xe0\xe1\x8c\xe2\xb6\x14\xb7\xf1\xa3\xe6\xa6;\xc9\xfc\xf9\xf1\x1el7\xb0\x1d\x9d\xa3L\xa6\xe0r\x0c\x12\x1c^\xc3O\xee6zg3:/i\xdb\xf2\x1c~\xa0#\x99E\n\x14'\xa1\xdc\xa4\xc8\xe7|\re\x07/,\r\nx\xf4\xda\xd6\x8c\xc0\x94\xfa\x98\xb1\x0eUX\x903\xb2\x95Bl\xed\x8ex\xe7\x90\xf4\xa1:\x84\xcd\xa3\xf8x7A\x90\x92\xb2\x01\x81\xd3\xefu\xd98\x937\xcal\x06\x16\xac\xadD\x93\xc5\xd8\xc3\xbf\x01\x073j\xa6\xd3\x17`\xc3\x17>\x8b\x9d\xb8\x00*\x8c\\\xe6\x13\x92\x8f\xf7P\xb3\xd8B\xc1c\xc8\x19\n\xb3x\x05>I\xfe\\\xea\x1e\x96\xf5 \\\xc8a\x1f\xf5$$\x95\xe9\x99\xb2\x1e7\xbf\x186t\xef\x98\x85\x022\xe7/\xc0\x92\xe6\xca\r\xec\xa856\xb6j\x05\x19\x91\x19[\x94\x0e\x8b\xbc\xefP\xe5\xfa\xa8\xb4\\\xd8\xc4\x07\"\xa7\x01\x0e\x8b\xd0{8g\xc3L\xabc0T_\x04\xc1\x8b \xc5\x0b~\xe1\xb5\xb8\x81Ql\xcb\x05s\x0f\x1d\x8e\xec\x89i I \x88\xe8\x1e\xea\xdc cx!\x8e\x037\\\xec\x90N\x8b@\x99\x1d\xf0\xa5h?\xde\x9b\xf5\xc7\xbb\xf7)\xfe\xc30`\xf2\xdf\x88\xc1\xc1\xb23\x99\x9f\x9ckA7k~\x13\xcdx\xbe\xf6\xb8\x05Qg\x9fF\xcc\xaf\xe91*\xaf\xafc\xd9\xf6QD\xc8\xcd\x98\xe6!\x82og\xef.m\x0eh\xe8\xber\x08~\xe5\x90\xc1\xad\xd3\xf5\xdd\xd1\xcb\x02=\xd2\xe3\\\xeeJ\xf5\xd2ge\xf9\xd6k]\\[^t\xd4\xd8&\xfa\x94\xa5\x9d\xf7\xf1n\x9b\x14\xe0\xa46Ex\x93\x13\x93$\xa5\xb5i\x9eG?\x13\xf7\x0c\xfax\xcf\xfd7\xe2\xb2X\xf3\x83\x1d\xe7\x15\xb3P\xc2\xc7L\xf62\x8aP4\x96\xdb\xc5m\xf4\xe7\xf8$>Mm\xa3\xdf\x1dy\xd8\xa0>\xa4K[r\x8cg\x07\xce\xc2\x1e>]\x97\x94;\x8c\xd2\xd9\xbb/\xa6\xa8\r\xee)]\xe6;~\xcc\x8e\xebrg\x18\x01\xef)\xbd%p\x9e\x1d$\x07\x0f\xb8\xc4\x83\xe33{\x17K\x82\xf7\x0c\x91m\xf7\xd7&x,\x18\x03\x17\x16\x14\xafD\xd4O\x1bP$yq9\xd5\x06k\xf5n\x15\xb0\xfa\xd3:%\x85x\x83\xc5\xec\xaa\x05G \xe9m8\x03\x0f{znW\x8d\xb8\x07\xa2\x12\xc0\xc9\xda\xadyk\x86W\x82\x96\xc0K\t\xbe\xe0]\x1a.\xb2\xeb\xaag\xdbi[\xb9\x0e\xa2\xe0v\xf4\x8e\x9d\x1e\r\xe1I\x0e\xa7\xb0\x93\xec\xd4\x05;\xe8YGSA7]\xe9k\xcb\x97\x04\xabf\xd2\x1c\xf3\xbc\xd65\xe7G\xb5u\xad\xa1w`\xb9\x9c\x902;:\x89\xb6\xda\xbe\t\x04\th\xd0M\x9d<\xb4Em\x9fE)n\x17\xd4I{U\x9a5H\xc0\xc5z\xcck\xf3\x19\xdf\xac\xaa\x99-\x08n\xb9\xaaX\xf1a\xfe<\xcb\x1b\xc50\xc3\x8a\x95C\x84'\x89\xcc\xd2\xc7{\x01\x8f\xbd\xad\xb9 \x83\xc5\xe8\xf0\x05{~\x9dj\x85\xf0\x8c1\xe8N63kH$[\xf5F\xc1n\\\xe0\xd6\xfa\xc7\xfb\xae\x1e\xef{%\x13\x0ew\xbb.\x9aHR\xf5\xb9\xe8\xaa\xe7Ek\xf5\xe3Pv\x9e\x7f\xbe\xf6\x1f\xef\x14Z\x84Rc\x99d\xd7\x99g\xcb\x16f\x96\xa0.\xf62Y\xa79\x02\x9e.\xcd.\xdd\xe3\xad\xe7O\xe6\x1e\x05O\x87U\xa5\xa3.\xf1\xb5\x9a(!geUe\xbc\x99b+\xdf\\q\xd2\x02\xeb\xe8\x93\xa7\x00\xdf\x90\x8dd\xd7\xc3\xfa|\xb8\xca\xbb\x1b\xdc\xb8\x81J\x9aBS\xac\xcc\x90\xe7\x0b]\xbbm>Zd\x06\xc5@\x14K\x80\x1c\xbe\x94\xf8\xba?\x8a\xa4\xae\xe8}U\x8f\xc1,\xe2\xce\x81\x89\xe0^\xe5\xda\xde[\x85\xbb\x90\xb9Sk+\x8b\xc9|\xa6X\x81\xeaI7\xa3\x96\xae\xb6\xd70\x06\xb4\xf2]\x01LL\xe6\xd6|\x8c\x0f\xf8\x10\x1c\\\x08v\xd0\xb7\x97J\xbd[\xbbA\xa8:E\xc9\x0c\xd3:\xb62\x1a\x91,xN\xb9\xae5/mvU\xf0i@\xbd\xde=\xd0\xd3|\xceO\x02ml\x054\x9c,=Q\xa9\x1fT2_\x0c\x90z\x88 \x11\xc1\xd4\xab\x19\xd5I\x8c0j\x96j\xaf\xf5s\xde/\xc5@\xf3d\xc3\x02\\\xe0C\xafm\x8f\xdbZ>X\x1cOx\xd3\xfd\xa0t\xfda\xef\x84\x12\xe7\xcd\x8c\x8c\\p\xd0\x15\xebnx\xdc\x90\x94\xa1m\xb43\x97\x11\xf1b\xe2\xb49>lF=\x02\xcf\xa9\xccReb\x0b\xcd\xc2\x11\xc9Vjx\xfaE\xf3\xfb\xd2\xa9\xac\x8fw\x0b\n\xa3\xa3\x8c`\xe7\x17\xb5\xed\xce'e\x89w\x98\x14\x17\xcd+\xc6\xfd\xe3\x99\x19\x96\x94'\xca\xd6\xd1\xb9\xa0\xbbz\xc4\xd1\xd6\\P\xca\xb6\x02\xd9`o\xcc\xe2\x15-c\xacW\xd6E\xaf\x82\xd2\xf0(\x91\xe7\xfcpa\x08)\xe1i\xaf\xe8\x9f\xb0L-\x9d\xb8>\x94\xa5\xce\xf1\rn\xc75\xf5\xe7\xe3\xf8i\xd9\xe3\xd4Vwl\\\xc6\xe2Z\x0e\x9f\xa8.N\xed\xd2\x16F\x07\x86\xbaB\x83^\xa5\xb5\xa9\x047c=\x8a~\xcd\xd8v\x10<\xddjba\xab{\xf4B\xda\xf8 Y\xca,d\x18\x8c\xe7\xa6Nh\x8f\xd0\x8a\xea\xe2\x85\xc5\xee\x96\x1e\x08\xd9\xf8\xe8V8\xe92\xad\xb1:\x97u\xc9\xae\xb19^\xac*\x9bi\xd9\x08\xbaY\xb8\xa3\x9d\xe4\xd2f\xb3W\xd3\xd1\x96\x17\n\xda\xa0 \x91\xb8\x806\xba\xd0Y\xc4Y3\xd1\x05\xc8y\x86\x19\xe9\x14\xca\xed\xa0^\xa4\xa4&r\xad\x19M\x98.\x0fO\xef\x80_\x95\xd9\x03\xb5\x16\xd9\xc9\xbeg\xec\xd3x\xeb\n\x11r{2\x16@\xc3r\xb0w\x88~\xc4\\p,\xe4DR\xc3\xb9X<\x07\xe2\xa4\x89J%j\xf11\x8e\xb22l \xa7\xdb\x07W\xac\xe0e\xca\xd63O[fo\x87\xee\xc7;\xd9\x89)-o'\x1d\xe3\xc6Q(0=\xe2\x81*\x1fe5\xe4\xce\xe3R\xdeq\x9aNu\x05cM\x9f\x93\xaa\xcc\x11\xe2]\xf7D\xc2\x16\xadu/p\x19\x0f\xe1\xc2I$6\x85\x9cD\x1e\x12\xdf\xe0~\x1e\xba\xf2\xb1\xd3TP\x9e\n1\x86Ea+.p\xd4\xb0/\x0bo\xbf\xc5