exiftool-vendored.pl 12.65.0 → 12.69.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/Changes +60 -2
- package/bin/MANIFEST +5 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +7 -7
- package/bin/exiftool +30 -21
- package/bin/lib/Image/ExifTool/Apple.pm +6 -2
- package/bin/lib/Image/ExifTool/Canon.pm +55 -13
- package/bin/lib/Image/ExifTool/DNG.pm +25 -2
- package/bin/lib/Image/ExifTool/Exif.pm +95 -13
- package/bin/lib/Image/ExifTool/FujiFilm.pm +20 -1
- package/bin/lib/Image/ExifTool/Geotag.pm +17 -12
- package/bin/lib/Image/ExifTool/Nikon.pm +47 -11
- package/bin/lib/Image/ExifTool/PLUS.pm +19 -4
- package/bin/lib/Image/ExifTool/PNG.pm +14 -7
- package/bin/lib/Image/ExifTool/Panasonic.pm +13 -9
- package/bin/lib/Image/ExifTool/Pentax.pm +8 -1
- package/bin/lib/Image/ExifTool/PhotoMechanic.pm +2 -1
- package/bin/lib/Image/ExifTool/QuickTime.pm +62 -52
- package/bin/lib/Image/ExifTool/README +7 -3
- package/bin/lib/Image/ExifTool/RIFF.pm +8 -2
- package/bin/lib/Image/ExifTool/Sony.pm +66 -21
- package/bin/lib/Image/ExifTool/TagLookup.pm +6881 -6709
- package/bin/lib/Image/ExifTool/TagNames.pod +454 -37
- package/bin/lib/Image/ExifTool/Validate.pm +18 -16
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
- package/bin/lib/Image/ExifTool/WriteExif.pl +14 -4
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +2 -0
- package/bin/lib/Image/ExifTool/WriteRIFF.pl +22 -3
- package/bin/lib/Image/ExifTool/Writer.pl +53 -11
- package/bin/lib/Image/ExifTool/XISF.pm +185 -0
- package/bin/lib/Image/ExifTool/XMP.pm +67 -2
- package/bin/lib/Image/ExifTool/XMP2.pl +36 -1
- package/bin/lib/Image/ExifTool.pm +45 -20
- package/bin/lib/Image/ExifTool.pod +20 -10
- package/bin/perl-Image-ExifTool.spec +6 -6
- package/bin/pp_build_exe.args +5 -4
- package/package.json +2 -2
package/bin/Changes
CHANGED
|
@@ -7,6 +7,64 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 12.60. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Oct. 26, 2023 - Version 12.69
|
|
11
|
+
|
|
12
|
+
- Added support for DNG version 1.7.0.0
|
|
13
|
+
- Added a new XMP-GCamera tag
|
|
14
|
+
- Added a number of new Nikon Z lenses (thanks Warren Hatch and Stefan)
|
|
15
|
+
- Added a number of new XMP-crs tags
|
|
16
|
+
- Extract XML metadata from some Hasselblad images
|
|
17
|
+
- Tweaked -fast2 option to read metadata from inside mdat atom of HEIC images
|
|
18
|
+
- Patched FFF reader to be more tolerant of the mess made by incompetent
|
|
19
|
+
Hasselblad programmers (wrong IFD count for some values)
|
|
20
|
+
- Patched WebP reader to be more tolerant of the mess made by incompetent
|
|
21
|
+
Google programmers (EXIF with wrong header and XMP with wrong ID)
|
|
22
|
+
- Fixed problem which could cause "use of uninitialized variable" warnings
|
|
23
|
+
when reading images from some Nikon cameras
|
|
24
|
+
- Fixed List type for new XMP-photomech:CreatorIdentity tag
|
|
25
|
+
|
|
26
|
+
Oct. 16, 2023 - Version 12.68
|
|
27
|
+
|
|
28
|
+
- Added preliminary read support for XISF images
|
|
29
|
+
- Added the ability to delete JUMBF metadata from PNG images
|
|
30
|
+
- Added support for writing Canon burst-roll CR3 images
|
|
31
|
+
- Added a new Nikon Z9 SubjectDetection value, and improved Zf support (thanks
|
|
32
|
+
Warren Hatch)
|
|
33
|
+
- Added a couple of new PentaxModelID values
|
|
34
|
+
- Added a few couple of new tag values for the Pentax K-3 Mark III Monochrome (github #226)
|
|
35
|
+
- Added a new XMP-photomech tag
|
|
36
|
+
- Added a new QuickTime ItemList tag
|
|
37
|
+
- Added a new Nikon LensID
|
|
38
|
+
- Added a new Canon LensType
|
|
39
|
+
- Support decimal values for FujiFilm ShadowTone and HighlightTone tags
|
|
40
|
+
- Decode some new Sony tags (thanks Jos Roost)
|
|
41
|
+
- Decode ShutterCount for Canon EOS R6 (thanks gamin)
|
|
42
|
+
- Decode QuickTime VideoFullRangeFlag
|
|
43
|
+
- Decode JPGCompression for the Nikon D3S
|
|
44
|
+
- Enhanced -geotag feature to allow writing QuickTime:GPSCoordinates
|
|
45
|
+
- Renamed Panasonic HDRShot tag to MergedImages (forum 15298)
|
|
46
|
+
- Fixed problem where some NEF files were misidentified as NRW
|
|
47
|
+
|
|
48
|
+
Sept. 19, 2023 - Version 12.67
|
|
49
|
+
|
|
50
|
+
- Added a new Pentax LensType (thanks dmont)
|
|
51
|
+
- Added a new FujiFilm FilmMode and FaceElementTypes values (thanks Greybeard)
|
|
52
|
+
- Fixed error writing new DataMining tag where URI prefix wasn't being
|
|
53
|
+
properly added to the value
|
|
54
|
+
|
|
55
|
+
Sept. 19, 2023 - Version 12.66
|
|
56
|
+
|
|
57
|
+
- Added a few new Canon LensType values (thanks Norbert Wasser)
|
|
58
|
+
- Added conversions for a few Apple:ImageCaptureType values
|
|
59
|
+
- Added new XMP tag for PLUS version 2.0.1
|
|
60
|
+
- Added a new CanonModelID (thanks Laurent Clevy)
|
|
61
|
+
- Decode another tag from Canon 1DS raw images (Hubert Figuiere, github #219)
|
|
62
|
+
- Decode JPGCompression for newer Nikon models (thanks Warren Hatch)
|
|
63
|
+
- Fixed bug introduced in 12.65 where duplicate tags were not returned even
|
|
64
|
+
when the groups where specified explicitly
|
|
65
|
+
- API Changes:
|
|
66
|
+
- Added WindowsWideFile option
|
|
67
|
+
|
|
10
68
|
Aug. 10, 2023 - Version 12.65
|
|
11
69
|
|
|
12
70
|
- Added a new QuickTime Keys tag
|
|
@@ -135,6 +193,8 @@ Apr. 5, 2023 - Version 12.60 (production release)
|
|
|
135
193
|
- Fixed problem where setting the Geotime value didn't work when using an
|
|
136
194
|
advanced-formatting expression containing a greater-than symbol (>)
|
|
137
195
|
|
|
196
|
+
History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
|
|
197
|
+
|
|
138
198
|
Mar. 28, 2023 - Version 12.59
|
|
139
199
|
|
|
140
200
|
- COMPATIBILITY WARNING: Changed the calculated ImageDataMD5 for JPEG images
|
|
@@ -323,8 +383,6 @@ Nov. 8, 2022 - Version 12.50 (production release)
|
|
|
323
383
|
- Fixed inconsistent year and time zone for Kenwood dashcam timed GPS in MP4
|
|
324
384
|
videos
|
|
325
385
|
|
|
326
|
-
History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
|
|
327
|
-
|
|
328
386
|
Oct. 19, 2022 - Version 12.49
|
|
329
387
|
|
|
330
388
|
- Added read support for Windows ICO and CUR files
|
package/bin/MANIFEST
CHANGED
|
@@ -179,6 +179,7 @@ html/TagNames/VCard.html
|
|
|
179
179
|
html/TagNames/Vorbis.html
|
|
180
180
|
html/TagNames/WPG.html
|
|
181
181
|
html/TagNames/WTV.html
|
|
182
|
+
html/TagNames/XISF.html
|
|
182
183
|
html/TagNames/XMP.html
|
|
183
184
|
html/TagNames/ZIP.html
|
|
184
185
|
html/TagNames/ZISRAW.html
|
|
@@ -432,6 +433,7 @@ lib/Image/ExifTool/WriteQuickTime.pl
|
|
|
432
433
|
lib/Image/ExifTool/WriteRIFF.pl
|
|
433
434
|
lib/Image/ExifTool/WriteXMP.pl
|
|
434
435
|
lib/Image/ExifTool/Writer.pl
|
|
436
|
+
lib/Image/ExifTool/XISF.pm
|
|
435
437
|
lib/Image/ExifTool/XMP.pm
|
|
436
438
|
lib/Image/ExifTool/XMP2.pl
|
|
437
439
|
lib/Image/ExifTool/XMPStruct.pl
|
|
@@ -916,6 +918,8 @@ t/Writer_6.out
|
|
|
916
918
|
t/Writer_60.out
|
|
917
919
|
t/Writer_7.out
|
|
918
920
|
t/Writer_9.out
|
|
921
|
+
t/XISF.t
|
|
922
|
+
t/XISF_2.out
|
|
919
923
|
t/XMP.t
|
|
920
924
|
t/XMP_10.out
|
|
921
925
|
t/XMP_11.out
|
|
@@ -1144,6 +1148,7 @@ t/images/Vorbis.ogg
|
|
|
1144
1148
|
t/images/WPG.wpg
|
|
1145
1149
|
t/images/WTV.wtv
|
|
1146
1150
|
t/images/Writer.jpg
|
|
1151
|
+
t/images/XISF.xisf
|
|
1147
1152
|
t/images/XMP.inx
|
|
1148
1153
|
t/images/XMP.jpg
|
|
1149
1154
|
t/images/XMP.svg
|
package/bin/META.json
CHANGED
package/bin/META.yml
CHANGED
package/bin/README
CHANGED
|
@@ -51,11 +51,11 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
51
51
|
DCP r/w | ICO r | MPG r | PSB r/w | WV r
|
|
52
52
|
DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
|
|
53
53
|
DFONT r | IDML r | MQV r/w | PSP r | XCF r
|
|
54
|
-
DIVX r | IIQ r/w | MRC r | QTIF r/w |
|
|
55
|
-
DJVU r | IND r/w | MRW r/w | R3D r |
|
|
56
|
-
DLL r | INSP r/w | MXF r | RA r |
|
|
57
|
-
DNG r/w | INSV r | NEF r/w | RAF r/w |
|
|
58
|
-
DOC r | INX r | NKSC r/w | RAM r |
|
|
54
|
+
DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
|
|
55
|
+
DJVU r | IND r/w | MRW r/w | R3D r | XLS r
|
|
56
|
+
DLL r | INSP r/w | MXF r | RA r | XLSX r
|
|
57
|
+
DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
|
|
58
|
+
DOC r | INX r | NKSC r/w | RAM r | ZIP r
|
|
59
59
|
DOCX r | ISO r | NRW r/w | RAR r |
|
|
60
60
|
|
|
61
61
|
Meta Information
|
|
@@ -108,8 +108,8 @@ your home directory, then you would type the following commands in a
|
|
|
108
108
|
terminal window to extract and run ExifTool:
|
|
109
109
|
|
|
110
110
|
cd ~/Desktop
|
|
111
|
-
gzip -dc Image-ExifTool-12.
|
|
112
|
-
cd Image-ExifTool-12.
|
|
111
|
+
gzip -dc Image-ExifTool-12.69.tar.gz | tar -xf -
|
|
112
|
+
cd Image-ExifTool-12.69
|
|
113
113
|
./exiftool t/images/ExifTool.jpg
|
|
114
114
|
|
|
115
115
|
Note: These commands extract meta information from one of the test images.
|
package/bin/exiftool
CHANGED
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '12.
|
|
14
|
+
my $version = '12.69';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -4665,11 +4665,11 @@ supported by ExifTool (r = read, w = write, c = create):
|
|
|
4665
4665
|
DCP r/w | ICO r | MPG r | PSB r/w | WV r
|
|
4666
4666
|
DCR r | ICS r | MPO r/w | PSD r/w | X3F r/w
|
|
4667
4667
|
DFONT r | IDML r | MQV r/w | PSP r | XCF r
|
|
4668
|
-
DIVX r | IIQ r/w | MRC r | QTIF r/w |
|
|
4669
|
-
DJVU r | IND r/w | MRW r/w | R3D r |
|
|
4670
|
-
DLL r | INSP r/w | MXF r | RA r |
|
|
4671
|
-
DNG r/w | INSV r | NEF r/w | RAF r/w |
|
|
4672
|
-
DOC r | INX r | NKSC r/w | RAM r |
|
|
4668
|
+
DIVX r | IIQ r/w | MRC r | QTIF r/w | XISF r
|
|
4669
|
+
DJVU r | IND r/w | MRW r/w | R3D r | XLS r
|
|
4670
|
+
DLL r | INSP r/w | MXF r | RA r | XLSX r
|
|
4671
|
+
DNG r/w | INSV r | NEF r/w | RAF r/w | XMP r/w/c
|
|
4672
|
+
DOC r | INX r | NKSC r/w | RAM r | ZIP r
|
|
4673
4673
|
DOCX r | ISO r | NRW r/w | RAR r |
|
|
4674
4674
|
|
|
4675
4675
|
Meta Information
|
|
@@ -5582,7 +5582,7 @@ with this command:
|
|
|
5582
5582
|
|
|
5583
5583
|
produces output like this:
|
|
5584
5584
|
|
|
5585
|
-
-- Generated by ExifTool 12.
|
|
5585
|
+
-- Generated by ExifTool 12.69 --
|
|
5586
5586
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5587
5587
|
(f/5.6, 1/60s, ISO 100)
|
|
5588
5588
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6418,10 +6418,14 @@ from the track log, and they are supported by the destination metadata
|
|
|
6418
6418
|
format): GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
|
|
6419
6419
|
GPSAltitude, GPSAltitudeRef, GPSDateStamp, GPSTimeStamp, GPSDateTime,
|
|
6420
6420
|
GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef, GPSImgDirection,
|
|
6421
|
-
GPSImgDirectionRef, GPSPitch, GPSRoll, AmbientTemperature
|
|
6422
|
-
CameraElevationAngle. By default, tags are created in
|
|
6423
|
-
XMP only if they already exist.
|
|
6424
|
-
|
|
6421
|
+
GPSImgDirectionRef, GPSPitch, GPSRoll, GPSCoordinates, AmbientTemperature
|
|
6422
|
+
and CameraElevationAngle. By default, in image files tags are created in
|
|
6423
|
+
EXIF, and updated in XMP only if they already exist. In QuickTime-format
|
|
6424
|
+
files GPSCoordinates is created in the preferred location (ItemList by
|
|
6425
|
+
default) as well as in XMP. However, C<EXIF:Geotime>, C<XMP:Geotime> or
|
|
6426
|
+
C<QuickTime:Geotime> may be specified to write to write only to one group.
|
|
6427
|
+
Also, C<ItemList:Geotime>, C<Keys:Geotime> or C<UserData:Geotime> may be
|
|
6428
|
+
used to write to a specific location in QuickTime-format files. Note that
|
|
6425
6429
|
GPSPitch and GPSRoll are non-standard, and require user-defined tags in
|
|
6426
6430
|
order to be written.
|
|
6427
6431
|
|
|
@@ -6527,7 +6531,8 @@ load exiftool for each invocation.
|
|
|
6527
6531
|
Set ExifTool API option. I<OPT> is an API option name. The option value is
|
|
6528
6532
|
set to 1 if I<=VAL> is omitted. If I<VAL> is omitted, the option value is
|
|
6529
6533
|
set to undef if C<=> is used, or an empty string with C<^=>. If I<OPT> is
|
|
6530
|
-
not specified a list of available options is returned.
|
|
6534
|
+
not specified a list of available options is returned. The option name is
|
|
6535
|
+
not case senstive, but the option values are. See
|
|
6531
6536
|
L<Image::ExifTool Options|Image::ExifTool/Options> for option details. This
|
|
6532
6537
|
overrides API options set via the config file.
|
|
6533
6538
|
|
|
@@ -6543,11 +6548,12 @@ options on the command line.
|
|
|
6543
6548
|
|
|
6544
6549
|
Load specified configuration file instead of the default ".ExifTool_config".
|
|
6545
6550
|
If used, this option must come before all other arguments on the command
|
|
6546
|
-
line and applies to all B<-execute>'d commands.
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
+
line and applies to all B<-execute>'d commands. This file is used to create
|
|
6552
|
+
user-defined tags as well as set default ExifTool options. The I<CFGFILE>
|
|
6553
|
+
must exist relative to the current working directory or the exiftool
|
|
6554
|
+
application directory unless an absolute path is specified. Loading of the
|
|
6555
|
+
default config file may be disabled by setting I<CFGFILE> to an empty string
|
|
6556
|
+
(ie. ""). See L<https://exiftool.org/config.html> and
|
|
6551
6557
|
config_files/example.config in the full ExifTool distribution for details
|
|
6552
6558
|
about the configuration file syntax.
|
|
6553
6559
|
|
|
@@ -7323,10 +7329,13 @@ CreateDate and FileNumber tags, in the form "20060507_118-1861.jpg".
|
|
|
7323
7329
|
|
|
7324
7330
|
=head1 GEOTAGGING EXAMPLES
|
|
7325
7331
|
|
|
7326
|
-
ExifTool implements geotagging via 3 special tags: Geotag
|
|
7327
|
-
convenience is also implemented as an exiftool option), Geosync
|
|
7328
|
-
The examples below highlight some geotagging features. See
|
|
7329
|
-
L<https://exiftool.org/geotag.html> for additional documentation.
|
|
7332
|
+
ExifTool implements geotagging from GPS log files via 3 special tags: Geotag
|
|
7333
|
+
(which for convenience is also implemented as an exiftool option), Geosync
|
|
7334
|
+
and Geotime. The examples below highlight some geotagging features. See
|
|
7335
|
+
L<https://exiftool.org/geotag.html> for additional documentation. (Note
|
|
7336
|
+
that geotagging from known GPS coordinates is done by writing the
|
|
7337
|
+
L<GPS tags|Image::ExifTool::TagNames/GPS Tags> directly rather than using
|
|
7338
|
+
the B<-geotag> option.)
|
|
7330
7339
|
|
|
7331
7340
|
=over 5
|
|
7332
7341
|
|
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool::Exif;
|
|
17
17
|
use Image::ExifTool::PLIST;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.11';
|
|
20
20
|
|
|
21
21
|
sub ConvertPLIST($$);
|
|
22
22
|
|
|
@@ -123,8 +123,12 @@ sub ConvertPLIST($$);
|
|
|
123
123
|
0x0014 => { # (StillImageCaptureType, ref 2)
|
|
124
124
|
Name => 'ImageCaptureType',
|
|
125
125
|
Writable => 'int32s',
|
|
126
|
-
Unknown => 1, # (don't know what the values mean)
|
|
127
126
|
# seen: 1,2,3,4,5,10,12
|
|
127
|
+
PrintConv => { #forum15096
|
|
128
|
+
1 => 'ProRAW',
|
|
129
|
+
2 => 'Portrait',
|
|
130
|
+
10 => 'Photo',
|
|
131
|
+
},
|
|
128
132
|
},
|
|
129
133
|
0x0015 => { # (ImageGroupIdentifier, ref 2)
|
|
130
134
|
Name => 'ImageUniqueID',
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.70';
|
|
92
92
|
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
|
@@ -476,7 +476,6 @@ $VERSION = '4.67';
|
|
|
476
476
|
255.1 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #50
|
|
477
477
|
255.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD', #exiv issue 1202 (A009)
|
|
478
478
|
255.3 => 'Yongnuo YN 50mm f/1.8', #50
|
|
479
|
-
313 => 'Canon RF 28mm F2.8 STM', #42
|
|
480
479
|
368 => 'Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens', #IB (A018)
|
|
481
480
|
368.1 => 'Sigma 20mm f/1.4 DG HSM | A', #50 (newer firmware)
|
|
482
481
|
368.2 => 'Sigma 50mm f/1.4 DG HSM | A', #50
|
|
@@ -491,6 +490,7 @@ $VERSION = '4.67';
|
|
|
491
490
|
'368.11' => 'Sigma 70mm f/2.8 DG Macro', #IB (A018)
|
|
492
491
|
'368.12' => 'Sigma 18-35mm f/1.8 DC HSM | A', #50
|
|
493
492
|
'368.13' => 'Sigma 24-105mm f/4 DG OS HSM | A', #forum3833
|
|
493
|
+
'368.14' => 'Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM | C', #forum15280 (014)
|
|
494
494
|
# Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
|
|
495
495
|
488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
|
|
496
496
|
489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek
|
|
@@ -609,18 +609,24 @@ $VERSION = '4.67';
|
|
|
609
609
|
'61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
610
610
|
'61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
611
611
|
'61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
612
|
-
'61182.36' => 'Canon RF
|
|
613
|
-
'61182.37' => 'Canon RF
|
|
614
|
-
'61182.38' => 'Canon RF
|
|
615
|
-
'61182.39' => 'Canon RF 800mm F5.6L IS USM
|
|
616
|
-
'61182.40' => 'Canon RF
|
|
617
|
-
'61182.41' => 'Canon RF
|
|
618
|
-
'61182.42' => 'Canon RF 1200mm F8L IS USM
|
|
619
|
-
'61182.43' => 'Canon RF
|
|
620
|
-
'61182.44' => 'Canon RF
|
|
621
|
-
'61182.45' => 'Canon RF
|
|
612
|
+
'61182.36' => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
|
|
613
|
+
'61182.37' => 'Canon RF 600mm F4L IS USM + RF2x', #42
|
|
614
|
+
'61182.38' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
|
615
|
+
'61182.39' => 'Canon RF 800mm F5.6L IS USM', #42
|
|
616
|
+
'61182.40' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
|
|
617
|
+
'61182.41' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
|
|
618
|
+
'61182.42' => 'Canon RF 1200mm F8L IS USM', #42
|
|
619
|
+
'61182.43' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
|
|
620
|
+
'61182.44' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
|
|
621
|
+
'61182.45' => 'Canon RF 135mm F1.8 L IS USM', #42
|
|
622
|
+
'61182.46' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
|
|
623
|
+
'61182.47' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
|
|
624
|
+
'61182.48' => 'Canon RF 100-300mm F2.8L IS USM', #42
|
|
625
|
+
'61182.49' => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
|
|
626
|
+
'61182.50' => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
|
|
627
|
+
'61182.51' => 'Canon RF 28mm F2.8 STM', #42
|
|
622
628
|
# we need the RFLensType values for the following...
|
|
623
|
-
'61182.
|
|
629
|
+
'61182.52' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
|
|
624
630
|
65535 => 'n/a',
|
|
625
631
|
);
|
|
626
632
|
|
|
@@ -985,6 +991,7 @@ $VERSION = '4.67';
|
|
|
985
991
|
0x80000481 => 'EOS R6 Mark II', #42
|
|
986
992
|
0x80000487 => 'EOS R8', #42
|
|
987
993
|
0x80000491 => 'PowerShot V10', #25
|
|
994
|
+
0x80000498 => 'EOS R100', #25
|
|
988
995
|
0x80000520 => 'EOS D2000C', #IB
|
|
989
996
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
990
997
|
);
|
|
@@ -1383,6 +1390,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
1383
1390
|
Condition => '$$self{Model} =~ /\b(1200D|REBEL T5|Kiss X70)\b/',
|
|
1384
1391
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfo60D' },
|
|
1385
1392
|
},
|
|
1393
|
+
{
|
|
1394
|
+
Name => 'CanonCameraInfoR6',
|
|
1395
|
+
Condition => '$$self{Model} =~ /\bEOS R6$/',
|
|
1396
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6' },
|
|
1397
|
+
},
|
|
1386
1398
|
{
|
|
1387
1399
|
Name => 'CanonCameraInfoPowerShot',
|
|
1388
1400
|
# valid if format is int32u[138] or int32u[148]
|
|
@@ -1698,6 +1710,12 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
1698
1710
|
# Writable => 'int32u',
|
|
1699
1711
|
# Protected => 2,
|
|
1700
1712
|
},
|
|
1713
|
+
0x82 => { #github219 (found on 1DS)
|
|
1714
|
+
Name => 'RawDataLength',
|
|
1715
|
+
# (can't yet write 1DS raw files)
|
|
1716
|
+
# Writable => 'int32u',
|
|
1717
|
+
# Protected => 2,
|
|
1718
|
+
},
|
|
1701
1719
|
0x83 => { #PH
|
|
1702
1720
|
Name => 'OriginalDecisionDataOffset',
|
|
1703
1721
|
Writable => 'int32u',
|
|
@@ -4683,6 +4701,19 @@ my %ciMaxFocal = (
|
|
|
4683
4701
|
},
|
|
4684
4702
|
);
|
|
4685
4703
|
|
|
4704
|
+
%Image::ExifTool::Canon::CameraInfoR6 = (
|
|
4705
|
+
%binaryDataAttrs,
|
|
4706
|
+
FIRST_ENTRY => 0,
|
|
4707
|
+
PRIORITY => 0,
|
|
4708
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4709
|
+
NOTES => 'CameraInfo tags for the EOS R6.',
|
|
4710
|
+
0x0af1 => { #forum15210
|
|
4711
|
+
Name => 'ShutterCount',
|
|
4712
|
+
Format => 'int32u',
|
|
4713
|
+
Notes => 'includes electronic + mechanical shutter',
|
|
4714
|
+
},
|
|
4715
|
+
);
|
|
4716
|
+
|
|
4686
4717
|
# Canon camera information for 70D (MakerNotes tag 0x0d) (ref PH)
|
|
4687
4718
|
%Image::ExifTool::Canon::CameraInfo70D = (
|
|
4688
4719
|
%binaryDataAttrs,
|
|
@@ -6859,6 +6890,8 @@ my %ciMaxFocal = (
|
|
|
6859
6890
|
290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
6860
6891
|
291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
6861
6892
|
292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
6893
|
+
293 => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
|
|
6894
|
+
294 => 'Canon RF 600mm F4L IS USM + RF2x', #42
|
|
6862
6895
|
295 => 'Canon RF 800mm F5.6L IS USM', #42
|
|
6863
6896
|
296 => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
|
|
6864
6897
|
297 => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
|
|
@@ -6869,6 +6902,10 @@ my %ciMaxFocal = (
|
|
|
6869
6902
|
303 => 'Canon RF 135mm F1.8 L IS USM', #42
|
|
6870
6903
|
304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
|
|
6871
6904
|
305 => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
|
|
6905
|
+
306 => 'Canon RF 100-300mm F2.8L IS USM', #42
|
|
6906
|
+
307 => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
|
|
6907
|
+
308 => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
|
|
6908
|
+
313 => 'Canon RF 28mm F2.8 STM', #42
|
|
6872
6909
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6873
6910
|
},
|
|
6874
6911
|
},
|
|
@@ -9063,6 +9100,11 @@ my %filterConv = (
|
|
|
9063
9100
|
CMT3 => { # (CR3 files)
|
|
9064
9101
|
Name => 'MakerNoteCanon',
|
|
9065
9102
|
PreservePadding => 1,
|
|
9103
|
+
Writable => 'undef', # (writable directory!)
|
|
9104
|
+
# (note that ExifTool 12.68 and earlier lacked the ability to write this as a block,
|
|
9105
|
+
# and would instead add the maker notes the the CMT2 ExifIFD. To remove these
|
|
9106
|
+
# incorrectly-placed maker notes, use "exiftool -exififd:makernotes= FILE")
|
|
9107
|
+
MakerNotes => 1,
|
|
9066
9108
|
SubDirectory => {
|
|
9067
9109
|
TagTable => 'Image::ExifTool::Canon::Main',
|
|
9068
9110
|
ProcessProc => \&ProcessCMT3,
|
|
@@ -17,7 +17,7 @@ use Image::ExifTool::Exif;
|
|
|
17
17
|
use Image::ExifTool::MakerNotes;
|
|
18
18
|
use Image::ExifTool::CanonRaw;
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.24';
|
|
21
21
|
|
|
22
22
|
sub ProcessOriginalRaw($$$);
|
|
23
23
|
sub ProcessAdobeData($$$);
|
|
@@ -120,6 +120,25 @@ sub WriteAdobeStuff($$$);
|
|
|
120
120
|
},
|
|
121
121
|
);
|
|
122
122
|
|
|
123
|
+
# (DNG 1.7)
|
|
124
|
+
%Image::ExifTool::DNG::ImageSeq = (
|
|
125
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
126
|
+
0 => { Name => 'SeqID', Format => 'var_string' },
|
|
127
|
+
1 => { Name => 'SeqType', Format => 'var_string' },
|
|
128
|
+
2 => { Name => 'SeqFrameInfo', Format => 'var_string' },
|
|
129
|
+
3 => { Name => 'SeqIndex', Format => 'int32u' },
|
|
130
|
+
7 => { Name => 'SeqCount', Format => 'int32u' },
|
|
131
|
+
11 => { Name => 'SeqFinal', Format => 'int8u', PrintConv => { 0 => 'No', 1 => 'Yes' } },
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
# (DNG 1.7)
|
|
135
|
+
%Image::ExifTool::DNG::ProfileDynamicRange = (
|
|
136
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
137
|
+
0 => { Name => 'PDRVersion', Format => 'int16u' },
|
|
138
|
+
2 => { Name => 'DynamicRange', Format => 'int16u', PrintConv => { 0 => 'Standard', 1 => 'High' } },
|
|
139
|
+
4 => { Name => 'HintMaxOutputValue', Format => 'float' },
|
|
140
|
+
);
|
|
141
|
+
|
|
123
142
|
# fill in maker notes
|
|
124
143
|
{
|
|
125
144
|
my $tagInfo;
|
|
@@ -786,7 +805,11 @@ sub ProcessAdobeMakN($$$)
|
|
|
786
805
|
return 1 unless $$tagInfo{Writable};
|
|
787
806
|
}
|
|
788
807
|
$val = substr($$dataPt, 20) unless defined $val;
|
|
789
|
-
$et->FoundTag($tagInfo, $val);
|
|
808
|
+
my $key = $et->FoundTag($tagInfo, $val);
|
|
809
|
+
if ($$et{MAKER_NOTE_FIXUP}) {
|
|
810
|
+
$$et{TAG_EXTRA}{$key}{Fixup} = $$et{MAKER_NOTE_FIXUP};
|
|
811
|
+
delete $$et{MAKER_NOTE_FIXUP};
|
|
812
|
+
}
|
|
790
813
|
}
|
|
791
814
|
}
|
|
792
815
|
return 1;
|
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
58
58
|
use Image::ExifTool::MakerNotes;
|
|
59
59
|
|
|
60
|
-
$VERSION = '4.
|
|
60
|
+
$VERSION = '4.45';
|
|
61
61
|
|
|
62
62
|
sub ProcessExif($$$);
|
|
63
63
|
sub WriteExif($$$);
|
|
@@ -250,6 +250,7 @@ $formatName[129] = 'utf8'; # (Exif 3.0)
|
|
|
250
250
|
34927 => 'WebP', #LibTiff
|
|
251
251
|
34933 => 'PNG', # (TIFF mail list)
|
|
252
252
|
34934 => 'JPEG XR', # (TIFF mail list)
|
|
253
|
+
52546 => 'JPEG XL', # (DNG 1.7)
|
|
253
254
|
65000 => 'Kodak DCR Compressed', #PH
|
|
254
255
|
65535 => 'Pentax PEF Compressed', #Jens
|
|
255
256
|
);
|
|
@@ -3077,14 +3078,31 @@ my %opcodeInfo = (
|
|
|
3077
3078
|
},
|
|
3078
3079
|
PrintConvInv => '$val =~ /^PrintIM/ ? $val : undef', # quick validation
|
|
3079
3080
|
},
|
|
3081
|
+
0xc519 => { # (Hasselblad X2D)
|
|
3082
|
+
Name => 'HasselbladXML',
|
|
3083
|
+
Format => 'undef',
|
|
3084
|
+
TruncateOK => 1, # (incorrect size written by X2D)
|
|
3085
|
+
SubDirectory => {
|
|
3086
|
+
DirName => 'XML',
|
|
3087
|
+
TagTable => 'Image::ExifTool::PLIST::Main',
|
|
3088
|
+
Start => '$valuePtr + 4',
|
|
3089
|
+
},
|
|
3090
|
+
},
|
|
3080
3091
|
0xc51b => { # (Hasselblad H3D)
|
|
3081
3092
|
Name => 'HasselbladExif',
|
|
3082
3093
|
Format => 'undef',
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3094
|
+
SubDirectory => {
|
|
3095
|
+
Start => '$valuePtr',
|
|
3096
|
+
Base => '$start',
|
|
3097
|
+
TagTable => 'Image::ExifTool::Exif::Main',
|
|
3098
|
+
ProcessProc => \&Image::ExifTool::ProcessSubTIFF,
|
|
3099
|
+
# Writing this is problematic due to the braindead Hasselblad programmers.
|
|
3100
|
+
# One problem is that some values run outside the HasselbladExif data so they
|
|
3101
|
+
# will be lost if we do a simple copy (which is what we are currently doing
|
|
3102
|
+
# by returning undef from the WriteProc), but we can't rebuild this directory
|
|
3103
|
+
# by writing it properly because there is an erroneous StripByteCounts value
|
|
3104
|
+
# written by the X2D 100C that renders the data unreadable
|
|
3105
|
+
WriteProc => sub { return undef },
|
|
3088
3106
|
},
|
|
3089
3107
|
},
|
|
3090
3108
|
0xc573 => { #PH
|
|
@@ -3123,7 +3141,7 @@ my %opcodeInfo = (
|
|
|
3123
3141
|
0xc612 => {
|
|
3124
3142
|
Name => 'DNGVersion',
|
|
3125
3143
|
Notes => q{
|
|
3126
|
-
tags 0xc612-
|
|
3144
|
+
tags 0xc612-0xcd48 are defined by the DNG specification unless otherwise
|
|
3127
3145
|
noted. See L<https://helpx.adobe.com/photoshop/digital-negative.html> for
|
|
3128
3146
|
the specification
|
|
3129
3147
|
},
|
|
@@ -3609,6 +3627,11 @@ my %opcodeInfo = (
|
|
|
3609
3627
|
Writable => 'int16u',
|
|
3610
3628
|
WriteGroup => 'IFD0',
|
|
3611
3629
|
Protected => 1,
|
|
3630
|
+
PrintConv => {
|
|
3631
|
+
0 => 'Scene-referred',
|
|
3632
|
+
1 => 'Output-referred (ICC Profile Dynamic Range)',
|
|
3633
|
+
2 => 'Output-referred (High Dyanmic Range)', # DNG 1.7
|
|
3634
|
+
},
|
|
3612
3635
|
},
|
|
3613
3636
|
0xc6c5 => { Name => 'SRawType', Description => 'SRaw Type', WriteGroup => 'IFD0' }, #exifprobe (CR2 proprietary)
|
|
3614
3637
|
0xc6d2 => { #JD (Panasonic DMC-TZ5)
|
|
@@ -4133,7 +4156,7 @@ my %opcodeInfo = (
|
|
|
4133
4156
|
0xcd2d => { # DNG 1.6
|
|
4134
4157
|
Name => 'ProfileGainTableMap',
|
|
4135
4158
|
Writable => 'undef',
|
|
4136
|
-
WriteGroup => 'SubIFD',
|
|
4159
|
+
WriteGroup => 'SubIFD', # (according to DNG 1.7 docs, this was an error and it should have been IFD0)
|
|
4137
4160
|
Protected => 1,
|
|
4138
4161
|
Binary => 1,
|
|
4139
4162
|
},
|
|
@@ -4221,6 +4244,51 @@ my %opcodeInfo = (
|
|
|
4221
4244
|
WriteGroup => 'IFD0',
|
|
4222
4245
|
Protected => 1,
|
|
4223
4246
|
},
|
|
4247
|
+
0xcd40 => { # DNG 1.7
|
|
4248
|
+
Name => 'ProfileGainTableMap2',
|
|
4249
|
+
Writable => 'undef',
|
|
4250
|
+
WriteGroup => 'IFD0',
|
|
4251
|
+
Protected => 1,
|
|
4252
|
+
Binary => 1,
|
|
4253
|
+
},
|
|
4254
|
+
0xcd43 => { # DNG 1.7
|
|
4255
|
+
Name => 'ColumnInterleaveFactor',
|
|
4256
|
+
Writable => 'int32u',
|
|
4257
|
+
WriteGroup => 'SubIFD',
|
|
4258
|
+
Protected => 1,
|
|
4259
|
+
},
|
|
4260
|
+
0xcd44 => { # DNG 1.7
|
|
4261
|
+
Name => 'ImageSequenceInfo',
|
|
4262
|
+
Writable => 'undef',
|
|
4263
|
+
WriteGroup => 'IFD0',
|
|
4264
|
+
SubDirectory => {
|
|
4265
|
+
TagTable => 'Image::ExifTool::DNG::ImageSeq',
|
|
4266
|
+
ByteOrder => 'BigEndian',
|
|
4267
|
+
},
|
|
4268
|
+
},
|
|
4269
|
+
0xcd46 => { # DNG 1.7
|
|
4270
|
+
Name => 'ImageStats',
|
|
4271
|
+
Writable => 'undef',
|
|
4272
|
+
WriteGroup => 'IFD0',
|
|
4273
|
+
Binary => 1,
|
|
4274
|
+
Protected => 1,
|
|
4275
|
+
},
|
|
4276
|
+
0xcd47 => { # DNG 1.7
|
|
4277
|
+
Name => 'ProfileDynamicRange',
|
|
4278
|
+
Writable => 'undef',
|
|
4279
|
+
WriteGroup => 'IFD0',
|
|
4280
|
+
SubDirectory => {
|
|
4281
|
+
TagTable => 'Image::ExifTool::DNG::ProfileDynamicRange',
|
|
4282
|
+
ByteOrder => 'BigEndian', # (not indicated in spec)
|
|
4283
|
+
},
|
|
4284
|
+
},
|
|
4285
|
+
0xcd48 => { # DNG 1.7
|
|
4286
|
+
Name => 'ProfileGroupName',
|
|
4287
|
+
Writable => 'string',
|
|
4288
|
+
Format => 'string',
|
|
4289
|
+
WriteGroup => 'IFD0',
|
|
4290
|
+
Protected => 1,
|
|
4291
|
+
},
|
|
4224
4292
|
0xea1c => { #13
|
|
4225
4293
|
Name => 'Padding',
|
|
4226
4294
|
Binary => 1,
|
|
@@ -5944,6 +6012,12 @@ sub ProcessExif($$$)
|
|
|
5944
6012
|
my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
|
|
5945
6013
|
my $isExif = ($tagTablePtr eq \%Image::ExifTool::Exif::Main);
|
|
5946
6014
|
|
|
6015
|
+
# warn for incorrect maker notes in CR3 files
|
|
6016
|
+
if ($$dirInfo{DirName} eq 'MakerNotes' and $$et{FileType} eq 'CR3' and
|
|
6017
|
+
$$dirInfo{Parent} and $$dirInfo{Parent} eq 'ExifIFD')
|
|
6018
|
+
{
|
|
6019
|
+
$et->WarnOnce("MakerNotes shouldn't exist ExifIFD of CR3 image", 1);
|
|
6020
|
+
}
|
|
5947
6021
|
# set flag to calculate image data hash if requested
|
|
5948
6022
|
$doHash = 1 if $$et{ImageDataHash} and (($$et{FILE_TYPE} eq 'TIFF' and not $base and not $inMakerNotes) or
|
|
5949
6023
|
($$et{FILE_TYPE} eq 'RAF' and $dirName eq 'FujiIFD'));
|
|
@@ -6219,7 +6293,7 @@ sub ProcessExif($$$)
|
|
|
6219
6293
|
}
|
|
6220
6294
|
# read from file if necessary
|
|
6221
6295
|
unless (defined $buff) {
|
|
6222
|
-
my $wrn;
|
|
6296
|
+
my ($wrn, $truncOK);
|
|
6223
6297
|
my $readFromRAF = ($tagInfo and $$tagInfo{ReadFromRAF});
|
|
6224
6298
|
if (not $raf->Seek($base + $valuePtr + $dataPos, 0)) {
|
|
6225
6299
|
$wrn = "Invalid offset for $dir entry $index";
|
|
@@ -6229,18 +6303,22 @@ sub ProcessExif($$$)
|
|
|
6229
6303
|
$buff = "$$tagInfo{Name} data $size bytes";
|
|
6230
6304
|
$readSize = length $buff;
|
|
6231
6305
|
} elsif ($raf->Read($buff,$size) != $size) {
|
|
6232
|
-
$wrn = "Error reading value for $dir entry $index";
|
|
6306
|
+
$wrn = sprintf("Error reading value for $dir entry $index, ID 0x%.4x", $tagID);
|
|
6307
|
+
if ($tagInfo and not $$tagInfo{Unknown}) {
|
|
6308
|
+
$wrn .= " $$tagInfo{Name}";
|
|
6309
|
+
$truncOK = $$tagInfo{TruncateOK};
|
|
6310
|
+
}
|
|
6233
6311
|
} elsif ($readFromRAF) {
|
|
6234
6312
|
# seek back to the start of the value
|
|
6235
6313
|
$raf->Seek($base + $valuePtr + $dataPos, 0);
|
|
6236
6314
|
}
|
|
6237
6315
|
if ($wrn) {
|
|
6238
|
-
$et->Warn($wrn, $inMakerNotes);
|
|
6239
|
-
return 0 unless $inMakerNotes or $htmlDump;
|
|
6316
|
+
$et->Warn($wrn, $inMakerNotes || $truncOK);
|
|
6317
|
+
return 0 unless $inMakerNotes or $htmlDump or $truncOK;
|
|
6240
6318
|
++$warnCount;
|
|
6241
6319
|
$buff = '' unless defined $buff;
|
|
6242
6320
|
$readSize = length $buff;
|
|
6243
|
-
$bad = 1;
|
|
6321
|
+
$bad = 1 unless $truncOK;
|
|
6244
6322
|
}
|
|
6245
6323
|
}
|
|
6246
6324
|
$valueDataLen = length $buff;
|
|
@@ -6813,6 +6891,10 @@ sub ProcessExif($$$)
|
|
|
6813
6891
|
# save original components of rational numbers (used when copying)
|
|
6814
6892
|
$$et{RATIONAL}{$tagKey} = $rational if defined $rational;
|
|
6815
6893
|
$$et{TAG_EXTRA}{$tagKey}{G6} = $saveFormat if $saveFormat;
|
|
6894
|
+
if ($$et{MAKER_NOTE_FIXUP}) {
|
|
6895
|
+
$$et{TAG_EXTRA}{$tagKey}{Fixup} = $$et{MAKER_NOTE_FIXUP};
|
|
6896
|
+
delete $$et{MAKER_NOTE_FIXUP};
|
|
6897
|
+
}
|
|
6816
6898
|
}
|
|
6817
6899
|
}
|
|
6818
6900
|
|