exiftool-vendored.pl 12.41.0 → 12.42.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 +21 -1
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +2 -2
- package/bin/exiftool +4 -3
- package/bin/lib/Image/ExifTool/Canon.pm +12 -3
- package/bin/lib/Image/ExifTool/DJI.pm +59 -1
- package/bin/lib/Image/ExifTool/DNG.pm +8 -2
- package/bin/lib/Image/ExifTool/Exif.pm +9 -0
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +10 -8
- package/bin/lib/Image/ExifTool/ID3.pm +5 -5
- package/bin/lib/Image/ExifTool/MakerNotes.pm +5 -0
- package/bin/lib/Image/ExifTool/Nikon.pm +6 -1
- package/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +21 -2
- package/bin/lib/Image/ExifTool/PDF.pm +2 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/lib/Image/ExifTool/Photoshop.pm +6 -5
- package/bin/lib/Image/ExifTool/Samsung.pm +233 -2
- package/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
- package/bin/lib/Image/ExifTool/TagLookup.pm +16 -0
- package/bin/lib/Image/ExifTool/TagNames.pod +58 -27
- package/bin/lib/Image/ExifTool/Writer.pl +1 -1
- package/bin/lib/Image/ExifTool.pm +10 -10
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/pp_build_exe.args +4 -4
- package/package.json +3 -3
package/bin/Changes
CHANGED
|
@@ -4,9 +4,29 @@ ExifTool Version History
|
|
|
4
4
|
|
|
5
5
|
RSS feed: https://exiftool.org/rss.xml
|
|
6
6
|
|
|
7
|
-
Note: The most recent production release is Version 12.
|
|
7
|
+
Note: The most recent production release is Version 12.42. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
June 1, 2022 - Version 12.42 (production release)
|
|
11
|
+
|
|
12
|
+
- Added support for reading maker notes from Panasonic DC-GH6 videos
|
|
13
|
+
- Added conversion for Samsung MCCData
|
|
14
|
+
- Added a new Nikon LensID (thanks Chris)
|
|
15
|
+
- Added a few new Canon LensType values
|
|
16
|
+
- Added a couple of new Olympus StackedImage values (thanks Eberhard)
|
|
17
|
+
- Added a few new values for some Nikon Settings tags (thanks Warren Hatch)
|
|
18
|
+
- Added a "lang:" element to the -json output for alternate language tags when
|
|
19
|
+
-D, -H or -t is used
|
|
20
|
+
- Update DNG writer to not issue an error when writing DNG 1.6 files
|
|
21
|
+
- Decode information from DJI "ae_dbg_info" maker notes
|
|
22
|
+
- Decode Olympus AISubjectTrackingMode
|
|
23
|
+
- Changed ExifTool FileSize print conversion to use kB/MB/GB units instead of
|
|
24
|
+
KiB/MiB/GiB
|
|
25
|
+
- Changed "is not shiftable" warning to appear in -v (instead of just -v3)
|
|
26
|
+
output
|
|
27
|
+
- Patched to allow PDF Encrypt object to be "null"
|
|
28
|
+
- Fixed bug reading ICC_Profile 'meta' tags
|
|
29
|
+
|
|
10
30
|
Apr. 7, 2022 - Version 12.41
|
|
11
31
|
|
|
12
32
|
- Added support for "OM SYSTEM" maker notes
|
package/bin/META.json
CHANGED
package/bin/META.yml
CHANGED
package/bin/README
CHANGED
|
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
|
|
|
107
107
|
terminal window to extract and run ExifTool:
|
|
108
108
|
|
|
109
109
|
cd ~/Desktop
|
|
110
|
-
gzip -dc Image-ExifTool-12.
|
|
111
|
-
cd Image-ExifTool-12.
|
|
110
|
+
gzip -dc Image-ExifTool-12.42.tar.gz | tar -xf -
|
|
111
|
+
cd Image-ExifTool-12.42
|
|
112
112
|
./exiftool t/images/ExifTool.jpg
|
|
113
113
|
|
|
114
114
|
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.42';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
BEGIN {
|
|
@@ -2554,8 +2554,9 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2554
2554
|
if ($showTagID or $outFormat < 0) {
|
|
2555
2555
|
$val = { val => $val };
|
|
2556
2556
|
if ($showTagID) {
|
|
2557
|
-
my $id = $et->GetTagID($tag);
|
|
2557
|
+
my ($id, $lang) = $et->GetTagID($tag);
|
|
2558
2558
|
$id = sprintf('0x%.4x', $id) if $showTagID eq 'H' and $id =~ /^\d+$/;
|
|
2559
|
+
$$val{lang} = $lang if $lang;
|
|
2559
2560
|
$$val{id} = $id;
|
|
2560
2561
|
}
|
|
2561
2562
|
if ($tabFormat) {
|
|
@@ -5466,7 +5467,7 @@ with this command:
|
|
|
5466
5467
|
|
|
5467
5468
|
produces output like this:
|
|
5468
5469
|
|
|
5469
|
-
-- Generated by ExifTool 12.
|
|
5470
|
+
-- Generated by ExifTool 12.42 --
|
|
5470
5471
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5471
5472
|
(f/5.6, 1/60s, ISO 100)
|
|
5472
5473
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.58';
|
|
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)
|
|
@@ -197,6 +197,7 @@ $VERSION = '4.57';
|
|
|
197
197
|
44 => 'Canon EF 90-300mm f/4.5-5.6', #32
|
|
198
198
|
45 => 'Canon EF-S 18-55mm f/3.5-5.6 [II]', #PH (same ID for version II, ref 20)
|
|
199
199
|
46 => 'Canon EF 28-90mm f/4-5.6', #32
|
|
200
|
+
# 46 => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD (A010)', # (also possibly?)
|
|
200
201
|
47 => 'Zeiss Milvus 35mm f/2 or 50mm f/2', #IB
|
|
201
202
|
47.1 => 'Zeiss Milvus 50mm f/2 Makro', #IB
|
|
202
203
|
47.2 => 'Zeiss Milvus 135mm f/2 ZE', #IB
|
|
@@ -571,7 +572,9 @@ $VERSION = '4.57';
|
|
|
571
572
|
61494 => 'Canon CN-E 85mm T1.3 L F', #PH
|
|
572
573
|
61495 => 'Canon CN-E 135mm T2.2 L F', #PH
|
|
573
574
|
61496 => 'Canon CN-E 35mm T1.5 L F', #PH
|
|
574
|
-
|
|
575
|
+
#
|
|
576
|
+
# see RFLensType tag for master list of 61182 RF lenses
|
|
577
|
+
#
|
|
575
578
|
61182 => 'Canon RF 50mm F1.2L USM or other Canon RF Lens',
|
|
576
579
|
61182.1 => 'Canon RF 24-105mm F4L IS USM',
|
|
577
580
|
61182.2 => 'Canon RF 28-70mm F2L USM',
|
|
@@ -603,7 +606,12 @@ $VERSION = '4.57';
|
|
|
603
606
|
'61182.28' => 'Canon RF 400mm F2.8L IS USM', #IB
|
|
604
607
|
'61182.29' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
605
608
|
'61182.30' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
606
|
-
|
|
609
|
+
'61182.31' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
610
|
+
# we need the RFLensType values for the following...
|
|
611
|
+
'61182.32' => 'Canon RF 800mm F5.6L IS USM', #PH (NC)
|
|
612
|
+
'61182.33' => 'Canon RF 1200mm F8L IS USM', #PH (NC)
|
|
613
|
+
'61182.34' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
|
|
614
|
+
'61182.35' => 'Canon RF 100mm F2.8L MACRO IS USM', #(NC)
|
|
607
615
|
65535 => 'n/a',
|
|
608
616
|
);
|
|
609
617
|
|
|
@@ -6804,6 +6812,7 @@ my %ciMaxFocal = (
|
|
|
6804
6812
|
289 => 'Canon RF 400mm F2.8L IS USM', #IB
|
|
6805
6813
|
290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
|
|
6806
6814
|
291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
|
|
6815
|
+
292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
|
|
6807
6816
|
#xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
|
|
6808
6817
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6809
6818
|
},
|
|
@@ -11,11 +11,14 @@ package Image::ExifTool::DJI;
|
|
|
11
11
|
|
|
12
12
|
use strict;
|
|
13
13
|
use vars qw($VERSION);
|
|
14
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
15
|
use Image::ExifTool::Exif;
|
|
15
16
|
use Image::ExifTool::XMP;
|
|
16
17
|
use Image::ExifTool::GPS;
|
|
17
18
|
|
|
18
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.05';
|
|
20
|
+
|
|
21
|
+
sub ProcessDJIInfo($$$);
|
|
19
22
|
|
|
20
23
|
my %convFloat2 = (
|
|
21
24
|
PrintConv => 'sprintf("%+.2f", $val)',
|
|
@@ -44,6 +47,29 @@ my %convFloat2 = (
|
|
|
44
47
|
0x0b => { Name => 'CameraRoll', Writable => 'float', %convFloat2 },
|
|
45
48
|
);
|
|
46
49
|
|
|
50
|
+
# DJI debug maker notes
|
|
51
|
+
%Image::ExifTool::DJI::Info = (
|
|
52
|
+
PROCESS_PROC => \&ProcessDJIInfo,
|
|
53
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
54
|
+
NOTES => 'Tags written by some DJI drones.',
|
|
55
|
+
VARS => { LONG_TAGS => 2 },
|
|
56
|
+
ae_dbg_info => { Name => 'AEDebugInfo' },
|
|
57
|
+
ae_histogram_info => { Name => 'AEHistogramInfo' },
|
|
58
|
+
ae_local_histogram => { Name => 'AELocalHistogram' },
|
|
59
|
+
ae_liveview_histogram_info => { Name => 'AELiveViewHistogramInfo' },
|
|
60
|
+
ae_liveview_local_histogram => { Name => 'AELiveViewLocalHistogram' },
|
|
61
|
+
awb_dbg_info => { Name => 'AWBDebugInfo' },
|
|
62
|
+
af_dbg_info => { Name => 'AFDebugInfo' },
|
|
63
|
+
hiso => { Name => 'Histogram' },
|
|
64
|
+
xidiri => { Name => 'Xidiri' },
|
|
65
|
+
'GimbalDegree(Y,P,R)'=> { Name => 'GimbalDegree' },
|
|
66
|
+
'FlightDegree(Y,P,R)'=> { Name => 'FlightDegree' },
|
|
67
|
+
adj_dbg_info => { Name => 'ADJDebugInfo' },
|
|
68
|
+
sensor_id => { Name => 'SensorID' },
|
|
69
|
+
'FlightSpeed(X,Y,Z)' => { Name => 'FlightSpeed' },
|
|
70
|
+
hyperlapse_dbg_info => { Name => 'HyperlapsDebugInfo' },
|
|
71
|
+
);
|
|
72
|
+
|
|
47
73
|
# thermal parameters in APP4 of DJI ZH20T images (ref forum11401)
|
|
48
74
|
%Image::ExifTool::DJI::ThermalParams = (
|
|
49
75
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -134,6 +160,38 @@ my %convFloat2 = (
|
|
|
134
160
|
},
|
|
135
161
|
);
|
|
136
162
|
|
|
163
|
+
#------------------------------------------------------------------------------
|
|
164
|
+
# Process DJI infor (ref PH)
|
|
165
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
166
|
+
# Returns: 1 on success
|
|
167
|
+
sub ProcessDJIInfo($$$)
|
|
168
|
+
{
|
|
169
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
|
170
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
171
|
+
my $dirStart = $$dirInfo{DirStart} || 0;
|
|
172
|
+
my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
|
|
173
|
+
if ($dirStart) {
|
|
174
|
+
my $buff = substr($$dataPt, $dirStart, $dirLen);
|
|
175
|
+
$dataPt = \$buff;
|
|
176
|
+
}
|
|
177
|
+
while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) {
|
|
178
|
+
my ($tag, $val) = split /:/, $1, 2;
|
|
179
|
+
if ($val =~ /^([\x20-\x7f]+)\0*$/) {
|
|
180
|
+
$val = $1;
|
|
181
|
+
} else {
|
|
182
|
+
my $buff = $val;
|
|
183
|
+
$val = \$buff;
|
|
184
|
+
}
|
|
185
|
+
if (not $$tagTbl{$tag} and $tag=~ /^[-_a-zA-Z0-9]+$/) {
|
|
186
|
+
my $name = $tag;
|
|
187
|
+
$name =~ s/_([a-z])/_\U$1/g;
|
|
188
|
+
AddTagToTable($tagTbl, $tag, { Name => Image::ExifTool::MakeTagName($name) });
|
|
189
|
+
}
|
|
190
|
+
$et->HandleTag($tagTbl, $tag, $val);
|
|
191
|
+
}
|
|
192
|
+
return 1;
|
|
193
|
+
}
|
|
194
|
+
|
|
137
195
|
__END__
|
|
138
196
|
|
|
139
197
|
=head1 NAME
|
|
@@ -680,8 +680,14 @@ sub ProcessAdobeMakN($$$)
|
|
|
680
680
|
my $dataPos = $$dirInfo{DataPos};
|
|
681
681
|
my $hdrLen = 6;
|
|
682
682
|
|
|
683
|
-
# hack for extra 12 bytes in MakN header of JPEG converted to DNG
|
|
684
|
-
# (4 bytes "00 00 00 01" followed by 8 unknown bytes)
|
|
683
|
+
# 2018-09-27: hack for extra 12 bytes in MakN header of JPEG converted to DNG
|
|
684
|
+
# by Adobe Camera Raw (4 bytes "00 00 00 01" followed by 8 unknown bytes)
|
|
685
|
+
# - this is because CameraRaw copies the maker notes from the wrong location
|
|
686
|
+
# in a JPG image (off by 12 bytes presumably due to the JPEG headers)
|
|
687
|
+
# - this hack won't work in most cases because the extra bytes are not consistent
|
|
688
|
+
# since they are just the data that existed in the JPG before the maker notes
|
|
689
|
+
# - also, the last 12 bytes of the maker notes will be missing
|
|
690
|
+
# - 2022-04-26: this bug still exists in Camera Raw 14.3
|
|
685
691
|
$hdrLen += 12 if $len >= 18 and substr($$dataPt, $start+6, 4) eq "\0\0\0\x01";
|
|
686
692
|
|
|
687
693
|
my $dirStart = $start + $hdrLen; # pointer to maker note directory
|
|
@@ -3397,6 +3397,15 @@ my %opcodeInfo = (
|
|
|
3397
3397
|
},
|
|
3398
3398
|
# the DJI FC2103 writes some interesting stuff here (with sections labelled
|
|
3399
3399
|
# awb_dbg_info, ae_dbg_info, ae_histogram_info, af_dbg_info, hiso, xidiri) - PH
|
|
3400
|
+
{
|
|
3401
|
+
Name => 'MakerNoteDJIInfo',
|
|
3402
|
+
Condition => '$$valPt =~ /^\[ae_dbg_info:/',
|
|
3403
|
+
MakerNotes => 1,
|
|
3404
|
+
Binary => 1,
|
|
3405
|
+
WriteGroup => 'IFD0', # (for Validate)
|
|
3406
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
|
|
3407
|
+
Format => 'undef',
|
|
3408
|
+
},
|
|
3400
3409
|
{
|
|
3401
3410
|
Name => 'DNGPrivateData',
|
|
3402
3411
|
Flags => [ 'Binary', 'Protected' ],
|
|
@@ -25,7 +25,7 @@ use strict;
|
|
|
25
25
|
use vars qw($VERSION);
|
|
26
26
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
27
27
|
|
|
28
|
-
$VERSION = '1.
|
|
28
|
+
$VERSION = '1.39';
|
|
29
29
|
|
|
30
30
|
sub ProcessICC($$);
|
|
31
31
|
sub ProcessICC_Profile($$$);
|
|
@@ -522,11 +522,11 @@ my %manuSig = ( #6
|
|
|
522
522
|
prmg => 'Perceptual Reference Medium Gamut',
|
|
523
523
|
},
|
|
524
524
|
},
|
|
525
|
-
meta => { #5
|
|
525
|
+
meta => { #5
|
|
526
526
|
Name => 'Metadata',
|
|
527
527
|
SubDirectory => {
|
|
528
528
|
TagTable => 'Image::ExifTool::ICC_Profile::Metadata',
|
|
529
|
-
Validate => '$type eq "
|
|
529
|
+
Validate => '$type eq "dict"',
|
|
530
530
|
},
|
|
531
531
|
},
|
|
532
532
|
|
|
@@ -891,6 +891,7 @@ my %manuSig = ( #6
|
|
|
891
891
|
ManufacturerName => { },
|
|
892
892
|
MediaColor => { },
|
|
893
893
|
MediaWeight => { },
|
|
894
|
+
CreatorApp => { },
|
|
894
895
|
);
|
|
895
896
|
|
|
896
897
|
#------------------------------------------------------------------------------
|
|
@@ -1000,7 +1001,7 @@ sub FormatICCTag($$$)
|
|
|
1000
1001
|
}
|
|
1001
1002
|
|
|
1002
1003
|
#------------------------------------------------------------------------------
|
|
1003
|
-
# Process ICC metadata record (ref 5)
|
|
1004
|
+
# Process ICC metadata record (ref 5)
|
|
1004
1005
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
1005
1006
|
# Returns: 1 on success
|
|
1006
1007
|
sub ProcessMetadata($$$)
|
|
@@ -1032,7 +1033,7 @@ sub ProcessMetadata($$$)
|
|
|
1032
1033
|
my $namePtr = Get32u($dataPt, $entry);
|
|
1033
1034
|
my $nameLen = Get32u($dataPt, $entry + 4);
|
|
1034
1035
|
my $valuePtr = Get32u($dataPt, $entry + 8);
|
|
1035
|
-
my $valueLen = Get32u($dataPt, $entry +
|
|
1036
|
+
my $valueLen = Get32u($dataPt, $entry + 12);
|
|
1036
1037
|
next unless $namePtr and $valuePtr; # ignore if offsets are zero
|
|
1037
1038
|
if ($namePtr < $minPtr or $namePtr + $nameLen > $dirLen or
|
|
1038
1039
|
$valuePtr < $minPtr or $valuePtr + $valueLen > $dirLen)
|
|
@@ -1040,8 +1041,8 @@ sub ProcessMetadata($$$)
|
|
|
1040
1041
|
$et->Warn('Corrupted ICC meta dictionary');
|
|
1041
1042
|
last;
|
|
1042
1043
|
}
|
|
1043
|
-
my $tag = substr(
|
|
1044
|
-
my $val = substr(
|
|
1044
|
+
my $tag = substr($$dataPt, $dirStart + $namePtr, $nameLen);
|
|
1045
|
+
my $val = substr($$dataPt, $dirStart + $valuePtr, $valueLen);
|
|
1045
1046
|
$tag = $et->Decode($tag, 'UTF16', 'MM', 'UTF8');
|
|
1046
1047
|
$val = $et->Decode($val, 'UTF16', 'MM');
|
|
1047
1048
|
# generate tagInfo if it doesn't exist
|
|
@@ -1050,6 +1051,7 @@ sub ProcessMetadata($$$)
|
|
|
1050
1051
|
$name =~ s/\s+(.)/\u$1/g;
|
|
1051
1052
|
$name =~ tr/-_a-zA-Z0-9//dc;
|
|
1052
1053
|
next unless length $name;
|
|
1054
|
+
$et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
|
|
1053
1055
|
AddTagToTable($tagTablePtr, $tag, { Name => $name });
|
|
1054
1056
|
}
|
|
1055
1057
|
$et->HandleTag($tagTablePtr, $tag, $val);
|
|
@@ -1312,7 +1314,7 @@ sub ProcessICC_Profile($$$)
|
|
|
1312
1314
|
DirName => $name,
|
|
1313
1315
|
Parent => $$dirInfo{DirName},
|
|
1314
1316
|
);
|
|
1315
|
-
my $type =
|
|
1317
|
+
my $type = $fmt;
|
|
1316
1318
|
#### eval Validate ($type)
|
|
1317
1319
|
if (defined $$subdir{Validate} and not eval $$subdir{Validate}) {
|
|
1318
1320
|
$et->Warn("Invalid ICC $name data");
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Revisions: 09/12/2005 - P. Harvey Created
|
|
7
7
|
# 09/08/2020 - PH Added Lyrics3 support
|
|
8
8
|
#
|
|
9
|
-
# References: 1) http://www.id3.org/
|
|
9
|
+
# References: 1) http://www.id3.org/ (now https://id3.org)
|
|
10
10
|
# 2) http://www.mp3-tech.org/
|
|
11
11
|
# 3) http://www.fortunecity.com/underworld/sonic/3/id3tag.html
|
|
12
12
|
# 4) https://id3.org/Lyrics3
|
|
@@ -76,9 +76,9 @@ my %dateTimeConv = (
|
|
|
76
76
|
OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
|
77
77
|
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
|
78
78
|
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
|
79
|
-
"Comment-spa"). See L<
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
"Comment-spa"). See L<https://id3.org/> for the official ID3 specification
|
|
80
|
+
and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of
|
|
81
|
+
ISO 639-2 language codes.
|
|
82
82
|
},
|
|
83
83
|
ID3v1 => {
|
|
84
84
|
Name => 'ID3v1',
|
|
@@ -1661,7 +1661,7 @@ under the same terms as Perl itself.
|
|
|
1661
1661
|
|
|
1662
1662
|
=over 4
|
|
1663
1663
|
|
|
1664
|
-
=item L<
|
|
1664
|
+
=item L<https://id3.org/>
|
|
1665
1665
|
|
|
1666
1666
|
=item L<http://www.mp3-tech.org/>
|
|
1667
1667
|
|
|
@@ -89,6 +89,11 @@ my $debug; # set to 1 to enable debugging code
|
|
|
89
89
|
FixBase => 1, # necessary for AVI and MOV videos
|
|
90
90
|
},
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
Name => 'MakerNoteDJIInfo',
|
|
94
|
+
Condition => '$$valPt =~ /^\[ae_dbg_info:/',
|
|
95
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
|
|
96
|
+
},
|
|
92
97
|
{
|
|
93
98
|
Name => 'MakerNoteDJI',
|
|
94
99
|
Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s',
|
|
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
|
|
|
63
63
|
use Image::ExifTool::GPS;
|
|
64
64
|
use Image::ExifTool::XMP;
|
|
65
65
|
|
|
66
|
-
$VERSION = '4.
|
|
66
|
+
$VERSION = '4.06';
|
|
67
67
|
|
|
68
68
|
sub LensIDConv($$$);
|
|
69
69
|
sub ProcessNikonAVI($$$);
|
|
@@ -667,6 +667,7 @@ sub GetAFPointGrid($$;$);
|
|
|
667
667
|
'00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII',
|
|
668
668
|
'00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
|
|
669
669
|
'07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
|
|
670
|
+
'71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
|
|
670
671
|
#
|
|
671
672
|
'00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
|
|
672
673
|
'00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
|
|
@@ -8586,6 +8587,8 @@ my %nikonFocalConversions = (
|
|
|
8586
8587
|
4 => 'Wide (L)',
|
|
8587
8588
|
5 => '3D',
|
|
8588
8589
|
6 => 'Auto',
|
|
8590
|
+
12 => 'Wide (C1)',
|
|
8591
|
+
13 => 'Wide (C2)',
|
|
8589
8592
|
},
|
|
8590
8593
|
},
|
|
8591
8594
|
530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
|
|
@@ -8656,6 +8659,8 @@ my %nikonFocalConversions = (
|
|
|
8656
8659
|
2 => 'H.265 8-bit (MOV)',
|
|
8657
8660
|
3 => 'H.265 10-bit (MOV)',
|
|
8658
8661
|
4 => 'ProRes 422 HQ 10-bit (MOV)',
|
|
8662
|
+
5 => 'ProRes RAW HQ 12-bit (MOV)',
|
|
8663
|
+
6 => 'NRAW 12-bit (NEV)'
|
|
8659
8664
|
},
|
|
8660
8665
|
},
|
|
8661
8666
|
616 => {
|
|
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
|
|
|
15
15
|
use strict;
|
|
16
16
|
use vars qw($VERSION);
|
|
17
17
|
|
|
18
|
-
$VERSION = '1.
|
|
18
|
+
$VERSION = '1.20';
|
|
19
19
|
|
|
20
20
|
my %buttonsZ9= (
|
|
21
21
|
0 => 'None',
|
|
@@ -74,6 +74,9 @@ my %buttonsZ9= (
|
|
|
74
74
|
82 => 'Select To Send (PC)',
|
|
75
75
|
83 => 'Select To Send (FTP)',
|
|
76
76
|
85 => 'Control Lock',
|
|
77
|
+
86 => 'Save Focus Position',
|
|
78
|
+
87 => 'Recall Focus Position',
|
|
79
|
+
88 => 'Recall Shooting Functions (Hold)',
|
|
77
80
|
);
|
|
78
81
|
my %dialsZ9 = (
|
|
79
82
|
0 => '1 Frame',
|
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
40
40
|
use Image::ExifTool::Exif;
|
|
41
41
|
use Image::ExifTool::APP12;
|
|
42
42
|
|
|
43
|
-
$VERSION = '2.
|
|
43
|
+
$VERSION = '2.78';
|
|
44
44
|
|
|
45
45
|
sub PrintLensInfo($$$);
|
|
46
46
|
|
|
@@ -1911,6 +1911,23 @@ my %indexInfo = (
|
|
|
1911
1911
|
Name => 'FocusBracketStepSize',
|
|
1912
1912
|
Writable => 'int8u',
|
|
1913
1913
|
},
|
|
1914
|
+
0x309 => { #forum13341
|
|
1915
|
+
Name => 'AISubjectTrackingMode',
|
|
1916
|
+
Writable => 'int16u',
|
|
1917
|
+
ValueConv => '($val >> 8) . " " . ($val & 0xff)',
|
|
1918
|
+
ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]',
|
|
1919
|
+
PrintConv => [{
|
|
1920
|
+
0 => 'Off',
|
|
1921
|
+
1 => 'Motorsports',
|
|
1922
|
+
2 => 'Airplnes',
|
|
1923
|
+
3 => 'Trains',
|
|
1924
|
+
4 => 'Birds',
|
|
1925
|
+
5 => 'Dogs & Cats',
|
|
1926
|
+
},{
|
|
1927
|
+
0 => 'Object Not Found',
|
|
1928
|
+
1 => 'Object Found',
|
|
1929
|
+
}],
|
|
1930
|
+
},
|
|
1914
1931
|
0x400 => { #6
|
|
1915
1932
|
Name => 'FlashMode',
|
|
1916
1933
|
Writable => 'int16u',
|
|
@@ -2538,11 +2555,13 @@ my %indexInfo = (
|
|
|
2538
2555
|
'3 8' => 'ND8 (3EV)', #IB
|
|
2539
2556
|
'3 16' => 'ND16 (4EV)', #IB
|
|
2540
2557
|
'3 32' => 'ND32 (5EV)', #IB
|
|
2558
|
+
'3 64' => 'ND64 (6EV)', #forum13341
|
|
2541
2559
|
'5 4' => 'HDR1', #forum8906
|
|
2542
2560
|
'6 4' => 'HDR2', #forum8906
|
|
2543
2561
|
'8 8' => 'Tripod high resolution', #IB
|
|
2544
2562
|
'9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
|
|
2545
|
-
'11
|
|
2563
|
+
'11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1)
|
|
2564
|
+
'11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24)
|
|
2546
2565
|
OTHER => sub {
|
|
2547
2566
|
my ($val, $inv, $conv) = @_;
|
|
2548
2567
|
if ($inv) {
|
|
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
|
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
require Exporter;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.55';
|
|
25
25
|
|
|
26
26
|
sub FetchObject($$$$);
|
|
27
27
|
sub ExtractObject($$;$$);
|
|
@@ -2276,6 +2276,7 @@ XRef:
|
|
|
2276
2276
|
# load XRef stream in hybrid file if it exists
|
|
2277
2277
|
push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm};
|
|
2278
2278
|
$encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt};
|
|
2279
|
+
undef $encrypt if $encrypt and $encrypt eq 'null'; # (have seen "null")
|
|
2279
2280
|
if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') {
|
|
2280
2281
|
$id = ReadPDFValue($mainDict->{ID}->[0]);
|
|
2281
2282
|
}
|
|
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
|
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
38
38
|
use Image::ExifTool::Exif;
|
|
39
39
|
|
|
40
|
-
$VERSION = '2.
|
|
40
|
+
$VERSION = '2.17';
|
|
41
41
|
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
|
43
43
|
sub WhiteBalanceConv($;$$);
|
|
@@ -2472,6 +2472,15 @@ my %shootingMode = (
|
|
|
2472
2472
|
Start => 12,
|
|
2473
2473
|
},
|
|
2474
2474
|
},
|
|
2475
|
+
0x200080 => { # (GH6)
|
|
2476
|
+
Name => 'ExifData',
|
|
2477
|
+
Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
|
|
2478
|
+
SubDirectory => {
|
|
2479
|
+
TagTable => 'Image::ExifTool::Exif::Main',
|
|
2480
|
+
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
|
2481
|
+
Start => 12,
|
|
2482
|
+
},
|
|
2483
|
+
},
|
|
2475
2484
|
);
|
|
2476
2485
|
|
|
2477
2486
|
# Panasonic Composite tags
|
|
@@ -171,7 +171,7 @@ sub DecodeAFPoints($$$$;$);
|
|
|
171
171
|
'3 255.4' => 'Sigma DF EX Aspherical 28-70mm F2.8', #12
|
|
172
172
|
'3 255.5' => 'Sigma AF Tele 400mm F5.6 Multi-coated', #JD
|
|
173
173
|
'3 255.6' => 'Sigma 24-60mm F2.8 EX DG', #PH
|
|
174
|
-
'3 255.7' => 'Sigma 70-300mm F4-5.6 Macro', #JD
|
|
174
|
+
'3 255.7' => 'Sigma 70-300mm F4-5.6 Macro', #JD (also DG Macro, ref 27)
|
|
175
175
|
'3 255.8' => 'Sigma 55-200mm F4-5.6 DC', #JD
|
|
176
176
|
'3 255.9' => 'Sigma 18-50mm F2.8 EX DC', #JD (also Macro version - PH)
|
|
177
177
|
'4 1' => 'smc PENTAX-FA SOFT 28mm F2.8',
|
|
@@ -248,11 +248,12 @@ my %unicodeString = (
|
|
|
248
248
|
Protected => 1,
|
|
249
249
|
Notes => q{
|
|
250
250
|
this tag indicates provides a way for XMP-aware applications to indicate
|
|
251
|
-
that the XMP is synchronized with the IPTC.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
251
|
+
that the XMP is synchronized with the IPTC. The MWG recommendation is to
|
|
252
|
+
ignore the XMP if IPTCDigest exists and doesn't match the CurrentIPTCDigest.
|
|
253
|
+
When writing, special values of "new" and "old" represent the digests of the
|
|
254
|
+
IPTC from the edited and original files respectively, and are undefined if
|
|
255
|
+
the IPTC does not exist in the respective file. Set this to "new" as an
|
|
256
|
+
indication that the XMP is synchronized with the IPTC
|
|
256
257
|
},
|
|
257
258
|
# also note the 'new' feature requires that the IPTC comes before this tag is written
|
|
258
259
|
ValueConv => 'unpack("H*", $val)',
|
|
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
|
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
23
23
|
use Image::ExifTool::Exif;
|
|
24
24
|
|
|
25
|
-
$VERSION = '1.
|
|
25
|
+
$VERSION = '1.52';
|
|
26
26
|
|
|
27
27
|
sub WriteSTMN($$$);
|
|
28
28
|
sub ProcessINFO($$$);
|
|
@@ -1000,7 +1000,238 @@ my %formatMinMax = (
|
|
|
1000
1000
|
'0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161
|
|
1001
1001
|
# 0x0aa1-name - seen 'MCC_Data'
|
|
1002
1002
|
# 0x0aa1 - seen '204','222','234','302','429'
|
|
1003
|
-
'0x0aa1' =>
|
|
1003
|
+
'0x0aa1' => {
|
|
1004
|
+
Name => 'MCCData',
|
|
1005
|
+
Groups => { 2 => 'Location' },
|
|
1006
|
+
PrintConv => {
|
|
1007
|
+
202 => 'Greece',
|
|
1008
|
+
204 => 'Netherlands',
|
|
1009
|
+
206 => 'Belgium',
|
|
1010
|
+
208 => 'France',
|
|
1011
|
+
212 => 'Monaco',
|
|
1012
|
+
213 => 'Andorra',
|
|
1013
|
+
214 => 'Spain',
|
|
1014
|
+
216 => 'Hungary',
|
|
1015
|
+
218 => 'Bosnia & Herzegov.',
|
|
1016
|
+
219 => 'Croatia',
|
|
1017
|
+
220 => 'Serbia',
|
|
1018
|
+
221 => 'Kosovo',
|
|
1019
|
+
222 => 'Italy',
|
|
1020
|
+
226 => 'Romania',
|
|
1021
|
+
228 => 'Switzerland',
|
|
1022
|
+
230 => 'Czech Rep.',
|
|
1023
|
+
231 => 'Slovakia',
|
|
1024
|
+
232 => 'Austria',
|
|
1025
|
+
234 => 'United Kingdom',
|
|
1026
|
+
235 => 'United Kingdom',
|
|
1027
|
+
238 => 'Denmark',
|
|
1028
|
+
240 => 'Sweden',
|
|
1029
|
+
242 => 'Norway',
|
|
1030
|
+
244 => 'Finland',
|
|
1031
|
+
246 => 'Lithuania',
|
|
1032
|
+
247 => 'Latvia',
|
|
1033
|
+
248 => 'Estonia',
|
|
1034
|
+
250 => 'Russian Federation',
|
|
1035
|
+
255 => 'Ukraine',
|
|
1036
|
+
257 => 'Belarus',
|
|
1037
|
+
259 => 'Moldova',
|
|
1038
|
+
260 => 'Poland',
|
|
1039
|
+
262 => 'Germany',
|
|
1040
|
+
266 => 'Gibraltar',
|
|
1041
|
+
268 => 'Portugal',
|
|
1042
|
+
270 => 'Luxembourg',
|
|
1043
|
+
272 => 'Ireland',
|
|
1044
|
+
274 => 'Iceland',
|
|
1045
|
+
276 => 'Albania',
|
|
1046
|
+
278 => 'Malta',
|
|
1047
|
+
280 => 'Cyprus',
|
|
1048
|
+
282 => 'Georgia',
|
|
1049
|
+
283 => 'Armenia',
|
|
1050
|
+
284 => 'Bulgaria',
|
|
1051
|
+
286 => 'Turkey',
|
|
1052
|
+
288 => 'Faroe Islands',
|
|
1053
|
+
289 => 'Abkhazia',
|
|
1054
|
+
290 => 'Greenland',
|
|
1055
|
+
292 => 'San Marino',
|
|
1056
|
+
293 => 'Slovenia',
|
|
1057
|
+
294 => 'Macedonia',
|
|
1058
|
+
295 => 'Liechtenstein',
|
|
1059
|
+
297 => 'Montenegro',
|
|
1060
|
+
302 => 'Canada',
|
|
1061
|
+
308 => 'St. Pierre & Miquelon',
|
|
1062
|
+
310 => 'United States / Guam',
|
|
1063
|
+
311 => 'United States / Guam',
|
|
1064
|
+
312 => 'United States',
|
|
1065
|
+
316 => 'United States',
|
|
1066
|
+
330 => 'Puerto Rico',
|
|
1067
|
+
334 => 'Mexico',
|
|
1068
|
+
338 => 'Jamaica',
|
|
1069
|
+
340 => 'French Guiana / Guadeloupe / Martinique',
|
|
1070
|
+
342 => 'Barbados',
|
|
1071
|
+
344 => 'Antigua and Barbuda',
|
|
1072
|
+
346 => 'Cayman Islands',
|
|
1073
|
+
348 => 'British Virgin Islands',
|
|
1074
|
+
350 => 'Bermuda',
|
|
1075
|
+
352 => 'Grenada',
|
|
1076
|
+
354 => 'Montserrat',
|
|
1077
|
+
356 => 'Saint Kitts and Nevis',
|
|
1078
|
+
358 => 'Saint Lucia',
|
|
1079
|
+
360 => 'St. Vincent & Gren.',
|
|
1080
|
+
362 => 'Bonaire, Sint Eustatius and Saba / Curacao / Netherlands Antilles',
|
|
1081
|
+
363 => 'Aruba',
|
|
1082
|
+
364 => 'Bahamas',
|
|
1083
|
+
365 => 'Anguilla',
|
|
1084
|
+
366 => 'Dominica',
|
|
1085
|
+
368 => 'Cuba',
|
|
1086
|
+
370 => 'Dominican Republic',
|
|
1087
|
+
372 => 'Haiti',
|
|
1088
|
+
374 => 'Trinidad and Tobago',
|
|
1089
|
+
376 => 'Turks and Caicos Islands / US Virgin Islands',
|
|
1090
|
+
400 => 'Azerbaijan',
|
|
1091
|
+
401 => 'Kazakhstan',
|
|
1092
|
+
402 => 'Bhutan',
|
|
1093
|
+
404 => 'India',
|
|
1094
|
+
405 => 'India',
|
|
1095
|
+
410 => 'Pakistan',
|
|
1096
|
+
412 => 'Afghanistan',
|
|
1097
|
+
413 => 'Sri Lanka',
|
|
1098
|
+
414 => 'Myanmar (Burma)',
|
|
1099
|
+
415 => 'Lebanon',
|
|
1100
|
+
416 => 'Jordan',
|
|
1101
|
+
417 => 'Syrian Arab Republic',
|
|
1102
|
+
418 => 'Iraq',
|
|
1103
|
+
419 => 'Kuwait',
|
|
1104
|
+
420 => 'Saudi Arabia',
|
|
1105
|
+
421 => 'Yemen',
|
|
1106
|
+
422 => 'Oman',
|
|
1107
|
+
424 => 'United Arab Emirates',
|
|
1108
|
+
425 => 'Israel / Palestinian Territory',
|
|
1109
|
+
426 => 'Bahrain',
|
|
1110
|
+
427 => 'Qatar',
|
|
1111
|
+
428 => 'Mongolia',
|
|
1112
|
+
429 => 'Nepal',
|
|
1113
|
+
430 => 'United Arab Emirates',
|
|
1114
|
+
431 => 'United Arab Emirates',
|
|
1115
|
+
432 => 'Iran',
|
|
1116
|
+
434 => 'Uzbekistan',
|
|
1117
|
+
436 => 'Tajikistan',
|
|
1118
|
+
437 => 'Kyrgyzstan',
|
|
1119
|
+
438 => 'Turkmenistan',
|
|
1120
|
+
440 => 'Japan',
|
|
1121
|
+
441 => 'Japan',
|
|
1122
|
+
450 => 'South Korea',
|
|
1123
|
+
452 => 'Viet Nam',
|
|
1124
|
+
454 => 'Hongkong, China',
|
|
1125
|
+
455 => 'Macao, China',
|
|
1126
|
+
456 => 'Cambodia',
|
|
1127
|
+
457 => 'Laos P.D.R.',
|
|
1128
|
+
460 => 'China',
|
|
1129
|
+
466 => 'Taiwan',
|
|
1130
|
+
467 => 'North Korea',
|
|
1131
|
+
470 => 'Bangladesh',
|
|
1132
|
+
472 => 'Maldives',
|
|
1133
|
+
502 => 'Malaysia',
|
|
1134
|
+
505 => 'Australia',
|
|
1135
|
+
510 => 'Indonesia',
|
|
1136
|
+
514 => 'Timor-Leste',
|
|
1137
|
+
515 => 'Philippines',
|
|
1138
|
+
520 => 'Thailand',
|
|
1139
|
+
525 => 'Singapore',
|
|
1140
|
+
528 => 'Brunei Darussalam',
|
|
1141
|
+
530 => 'New Zealand',
|
|
1142
|
+
537 => 'Papua New Guinea',
|
|
1143
|
+
539 => 'Tonga',
|
|
1144
|
+
540 => 'Solomon Islands',
|
|
1145
|
+
541 => 'Vanuatu',
|
|
1146
|
+
542 => 'Fiji',
|
|
1147
|
+
544 => 'American Samoa',
|
|
1148
|
+
545 => 'Kiribati',
|
|
1149
|
+
546 => 'New Caledonia',
|
|
1150
|
+
547 => 'French Polynesia',
|
|
1151
|
+
548 => 'Cook Islands',
|
|
1152
|
+
549 => 'Samoa',
|
|
1153
|
+
550 => 'Micronesia',
|
|
1154
|
+
552 => 'Palau',
|
|
1155
|
+
553 => 'Tuvalu',
|
|
1156
|
+
555 => 'Niue',
|
|
1157
|
+
602 => 'Egypt',
|
|
1158
|
+
603 => 'Algeria',
|
|
1159
|
+
604 => 'Morocco',
|
|
1160
|
+
605 => 'Tunisia',
|
|
1161
|
+
606 => 'Libya',
|
|
1162
|
+
607 => 'Gambia',
|
|
1163
|
+
608 => 'Senegal',
|
|
1164
|
+
609 => 'Mauritania',
|
|
1165
|
+
610 => 'Mali',
|
|
1166
|
+
611 => 'Guinea',
|
|
1167
|
+
612 => 'Ivory Coast',
|
|
1168
|
+
613 => 'Burkina Faso',
|
|
1169
|
+
614 => 'Niger',
|
|
1170
|
+
615 => 'Togo',
|
|
1171
|
+
616 => 'Benin',
|
|
1172
|
+
617 => 'Mauritius',
|
|
1173
|
+
618 => 'Liberia',
|
|
1174
|
+
619 => 'Sierra Leone',
|
|
1175
|
+
620 => 'Ghana',
|
|
1176
|
+
621 => 'Nigeria',
|
|
1177
|
+
622 => 'Chad',
|
|
1178
|
+
623 => 'Central African Rep.',
|
|
1179
|
+
624 => 'Cameroon',
|
|
1180
|
+
625 => 'Cape Verde',
|
|
1181
|
+
626 => 'Sao Tome & Principe',
|
|
1182
|
+
627 => 'Equatorial Guinea',
|
|
1183
|
+
628 => 'Gabon',
|
|
1184
|
+
629 => 'Congo, Republic',
|
|
1185
|
+
630 => 'Congo, Dem. Rep.',
|
|
1186
|
+
631 => 'Angola',
|
|
1187
|
+
632 => 'Guinea-Bissau',
|
|
1188
|
+
633 => 'Seychelles',
|
|
1189
|
+
634 => 'Sudan',
|
|
1190
|
+
635 => 'Rwanda',
|
|
1191
|
+
636 => 'Ethiopia',
|
|
1192
|
+
637 => 'Somalia',
|
|
1193
|
+
638 => 'Djibouti',
|
|
1194
|
+
639 => 'Kenya',
|
|
1195
|
+
640 => 'Tanzania',
|
|
1196
|
+
641 => 'Uganda',
|
|
1197
|
+
642 => 'Burundi',
|
|
1198
|
+
643 => 'Mozambique',
|
|
1199
|
+
645 => 'Zambia',
|
|
1200
|
+
646 => 'Madagascar',
|
|
1201
|
+
647 => 'Reunion',
|
|
1202
|
+
648 => 'Zimbabwe',
|
|
1203
|
+
649 => 'Namibia',
|
|
1204
|
+
650 => 'Malawi',
|
|
1205
|
+
651 => 'Lesotho',
|
|
1206
|
+
652 => 'Botswana',
|
|
1207
|
+
653 => 'Swaziland',
|
|
1208
|
+
654 => 'Comoros',
|
|
1209
|
+
655 => 'South Africa',
|
|
1210
|
+
657 => 'Eritrea',
|
|
1211
|
+
659 => 'South Sudan',
|
|
1212
|
+
702 => 'Belize',
|
|
1213
|
+
704 => 'Guatemala',
|
|
1214
|
+
706 => 'El Salvador',
|
|
1215
|
+
708 => 'Honduras',
|
|
1216
|
+
710 => 'Nicaragua',
|
|
1217
|
+
712 => 'Costa Rica',
|
|
1218
|
+
714 => 'Panama',
|
|
1219
|
+
716 => 'Peru',
|
|
1220
|
+
722 => 'Argentina Republic',
|
|
1221
|
+
724 => 'Brazil',
|
|
1222
|
+
730 => 'Chile',
|
|
1223
|
+
732 => 'Colombia',
|
|
1224
|
+
734 => 'Venezuela',
|
|
1225
|
+
736 => 'Bolivia',
|
|
1226
|
+
738 => 'Guyana',
|
|
1227
|
+
740 => 'Ecuador',
|
|
1228
|
+
744 => 'Paraguay',
|
|
1229
|
+
746 => 'Suriname',
|
|
1230
|
+
748 => 'Uruguay',
|
|
1231
|
+
750 => 'Falkland Islands (Malvinas)',
|
|
1232
|
+
901 => 'International Networks / Satellite Networks',
|
|
1233
|
+
},
|
|
1234
|
+
},
|
|
1004
1235
|
# 0x0ab0-name - seen 'DualShot_Meta_Info'
|
|
1005
1236
|
'0x0ab1-name' => {
|
|
1006
1237
|
Name => 'DepthMapName',
|
|
@@ -19,7 +19,7 @@ package Image::ExifTool::Shortcuts;
|
|
|
19
19
|
use strict;
|
|
20
20
|
use vars qw($VERSION);
|
|
21
21
|
|
|
22
|
-
$VERSION = '1.
|
|
22
|
+
$VERSION = '1.67';
|
|
23
23
|
|
|
24
24
|
# this is a special table used to define command-line shortcuts
|
|
25
25
|
# (documentation Notes may be added for these via %shortcutNotes in BuildTagLookup.pm)
|
|
@@ -118,6 +118,7 @@ $VERSION = '1.66';
|
|
|
118
118
|
'MakerNoteCasio',
|
|
119
119
|
'MakerNoteCasio2',
|
|
120
120
|
'MakerNoteDJI',
|
|
121
|
+
'MakerNoteDJIInfo',
|
|
121
122
|
'MakerNoteFLIR',
|
|
122
123
|
'MakerNoteFujiFilm',
|
|
123
124
|
'MakerNoteGE',
|
|
@@ -894,6 +894,7 @@ my %tagLookup = (
|
|
|
894
894
|
'aiservosecondimagepriority' => { 84 => 0x51a },
|
|
895
895
|
'aiservotrackingmethod' => { 84 => 0x504 },
|
|
896
896
|
'aiservotrackingsensitivity' => { 83 => 0x14, 84 => 0x502 },
|
|
897
|
+
'aisubjecttrackingmode' => { 297 => 0x309 },
|
|
897
898
|
'album' => { 372 => ['albm',"\xa9alb"], 374 => 'album', 380 => ['albm',"\xa9alb"], 503 => 'album' },
|
|
898
899
|
'albumartist' => { 179 => 'WM/AlbumArtist', 372 => 'aART', 380 => 'albr' },
|
|
899
900
|
'albumcoverurl' => { 179 => 'WM/AlbumCoverURL' },
|
|
@@ -4024,6 +4025,7 @@ my %tagLookup = (
|
|
|
4024
4025
|
'makernotecasio' => { 117 => 'MakN', 119 => 0x927c },
|
|
4025
4026
|
'makernotecasio2' => { 117 => 'MakN', 119 => 0x927c },
|
|
4026
4027
|
'makernotedji' => { 117 => 'MakN', 119 => 0x927c },
|
|
4028
|
+
'makernotedjiinfo' => { 117 => 'MakN', 119 => 0x927c },
|
|
4027
4029
|
'makernoteflir' => { 117 => 'MakN', 119 => 0x927c },
|
|
4028
4030
|
'makernotefujifilm' => { 117 => 'MakN', 119 => 0x927c },
|
|
4029
4031
|
'makernotege' => { 117 => 'MakN', 119 => 0x927c },
|
|
@@ -7123,6 +7125,7 @@ my %tagExists = (
|
|
|
7123
7125
|
'actualsoftpostpadding' => 1,
|
|
7124
7126
|
'actualsoftprepadding' => 1,
|
|
7125
7127
|
'additionalinfo' => 1,
|
|
7128
|
+
'adjdebuginfo' => 1,
|
|
7126
7129
|
'adjustedtbnimageheight' => 1,
|
|
7127
7130
|
'adjustedtbnimagewidth' => 1,
|
|
7128
7131
|
'adobe_cm' => 1,
|
|
@@ -7142,11 +7145,16 @@ my %tagExists = (
|
|
|
7142
7145
|
'advancedscenemode' => 1,
|
|
7143
7146
|
'adventrevision' => 1,
|
|
7144
7147
|
'adventscale' => 1,
|
|
7148
|
+
'aedebuginfo' => 1,
|
|
7145
7149
|
'aeflags' => 1,
|
|
7150
|
+
'aehistograminfo' => 1,
|
|
7146
7151
|
'aeinfo' => 1,
|
|
7147
7152
|
'aeinfo2' => 1,
|
|
7148
7153
|
'aeinfo3' => 1,
|
|
7149
7154
|
'aeinfounknown' => 1,
|
|
7155
|
+
'aeliveviewhistograminfo' => 1,
|
|
7156
|
+
'aeliveviewlocalhistogram' => 1,
|
|
7157
|
+
'aelocalhistogram' => 1,
|
|
7150
7158
|
'af-cprioritysel' => 1,
|
|
7151
7159
|
'af-sprioritysel' => 1,
|
|
7152
7160
|
'afarea' => 1,
|
|
@@ -7158,6 +7166,7 @@ my %tagExists = (
|
|
|
7158
7166
|
'afcp' => 1,
|
|
7159
7167
|
'afcp_iptc' => 1,
|
|
7160
7168
|
'afcsettings' => 1,
|
|
7169
|
+
'afdebuginfo' => 1,
|
|
7161
7170
|
'aff1' => 1,
|
|
7162
7171
|
'aff5' => 1,
|
|
7163
7172
|
'affheader' => 1,
|
|
@@ -7400,6 +7409,7 @@ my %tagExists = (
|
|
|
7400
7409
|
'avi1' => 1,
|
|
7401
7410
|
'avif' => 1,
|
|
7402
7411
|
'aviheader' => 1,
|
|
7412
|
+
'awbdebuginfo' => 1,
|
|
7403
7413
|
'awbinfo' => 1,
|
|
7404
7414
|
'axisdistancex' => 1,
|
|
7405
7415
|
'axisdistancey' => 1,
|
|
@@ -8100,6 +8110,7 @@ my %tagExists = (
|
|
|
8100
8110
|
'creatingapplication' => 1,
|
|
8101
8111
|
'creatingtransform' => 1,
|
|
8102
8112
|
'creationpathvector' => 1,
|
|
8113
|
+
'creatorapp' => 1,
|
|
8103
8114
|
'creatorapplication' => 1,
|
|
8104
8115
|
'creatorappversion' => 1,
|
|
8105
8116
|
'creatoratom' => 1,
|
|
@@ -8817,6 +8828,8 @@ my %tagExists = (
|
|
|
8817
8828
|
'flashused' => 1,
|
|
8818
8829
|
'flashversion' => 1,
|
|
8819
8830
|
'flavor' => 1,
|
|
8831
|
+
'flightdegree' => 1,
|
|
8832
|
+
'flightspeed' => 1,
|
|
8820
8833
|
'flipstatus' => 1,
|
|
8821
8834
|
'flir' => 1,
|
|
8822
8835
|
'flir_gps' => 1,
|
|
@@ -8986,6 +8999,7 @@ my %tagExists = (
|
|
|
8986
8999
|
'gifplaintextextension' => 1,
|
|
8987
9000
|
'gifversion' => 1,
|
|
8988
9001
|
'gimage' => 1,
|
|
9002
|
+
'gimbaldegree' => 1,
|
|
8989
9003
|
'gimbalpitch' => 1,
|
|
8990
9004
|
'gimbalroll' => 1,
|
|
8991
9005
|
'gimbalyaw' => 1,
|
|
@@ -9159,6 +9173,7 @@ my %tagExists = (
|
|
|
9159
9173
|
'huffmantablelength' => 1,
|
|
9160
9174
|
'huffmantablevalue' => 1,
|
|
9161
9175
|
'hyperfocaldistance' => 1,
|
|
9176
|
+
'hyperlapsdebuginfo' => 1,
|
|
9162
9177
|
'hyperlinkbase' => 1,
|
|
9163
9178
|
'hyperlinks' => 1,
|
|
9164
9179
|
'hyperlinkschanged' => 1,
|
|
@@ -12093,6 +12108,7 @@ my %tagExists = (
|
|
|
12093
12108
|
'xcfversion' => 1,
|
|
12094
12109
|
'xclippathunits' => 1,
|
|
12095
12110
|
'xheight' => 1,
|
|
12111
|
+
'xidiri' => 1,
|
|
12096
12112
|
'xmag' => 1,
|
|
12097
12113
|
'xmethod' => 1,
|
|
12098
12114
|
'xmldata' => 1,
|
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
|
12
12
|
=head1 TAG TABLES
|
|
13
13
|
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
|
15
|
-
They contain a total of
|
|
15
|
+
They contain a total of 25792 tags, with 16480 unique tag names.
|
|
16
16
|
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
|
@@ -629,6 +629,7 @@ for the official EXIF 2.32 specification.
|
|
|
629
629
|
MakerNoteCanon ExifIFD Canon
|
|
630
630
|
MakerNoteCasio ExifIFD Casio
|
|
631
631
|
MakerNoteCasio2 ExifIFD Casio Type2
|
|
632
|
+
MakerNoteDJIInfo ExifIFD DJI Info
|
|
632
633
|
MakerNoteDJI ExifIFD DJI
|
|
633
634
|
MakerNoteFLIR ExifIFD FLIR
|
|
634
635
|
MakerNoteFujiFilm ExifIFD FujiFilm
|
|
@@ -854,6 +855,7 @@ for the official EXIF 2.32 specification.
|
|
|
854
855
|
MakerNotePentax IFD0 Pentax
|
|
855
856
|
MakerNotePentax5 IFD0 Pentax
|
|
856
857
|
MakerNoteRicohPentax IFD0 Pentax
|
|
858
|
+
MakerNoteDJIInfo IFD0 DJI Info
|
|
857
859
|
DNGPrivateData IFD0 int8u!
|
|
858
860
|
0xc635 MakerNoteSafety IFD0 int16u
|
|
859
861
|
0xc640 RawImageSegmentation - no
|
|
@@ -6755,6 +6757,7 @@ Metadata tags that exist.
|
|
|
6755
6757
|
|
|
6756
6758
|
Tag Name Writable
|
|
6757
6759
|
-------- --------
|
|
6760
|
+
CreatorApp no
|
|
6758
6761
|
ManufacturerName no
|
|
6759
6762
|
MediaColor no
|
|
6760
6763
|
MediaWeight no
|
|
@@ -10651,6 +10654,30 @@ These tags belong to the ExifTool XMP-drone-dji family 1 group.
|
|
|
10651
10654
|
RtkStdLon real
|
|
10652
10655
|
SelfData string
|
|
10653
10656
|
|
|
10657
|
+
=head3 DJI Info Tags
|
|
10658
|
+
|
|
10659
|
+
Tags written by some DJI drones.
|
|
10660
|
+
|
|
10661
|
+
Tag ID Tag Name Writable
|
|
10662
|
+
------ -------- --------
|
|
10663
|
+
'FlightDegree(Y,P,R)' FlightDegree no
|
|
10664
|
+
'FlightSpeed(X,Y,Z)' FlightSpeed no
|
|
10665
|
+
'GimbalDegree(Y,P,R)' GimbalDegree no
|
|
10666
|
+
'adj_dbg_info' ADJDebugInfo no
|
|
10667
|
+
'ae_dbg_info' AEDebugInfo no
|
|
10668
|
+
'ae_histogram_info' AEHistogramInfo no
|
|
10669
|
+
'ae_liveview_histogram_info'
|
|
10670
|
+
AELiveViewHistogramInfo no
|
|
10671
|
+
'ae_liveview_local_histogram'
|
|
10672
|
+
AELiveViewLocalHistogram no
|
|
10673
|
+
'ae_local_histogram' AELocalHistogram no
|
|
10674
|
+
'af_dbg_info' AFDebugInfo no
|
|
10675
|
+
'awb_dbg_info' AWBDebugInfo no
|
|
10676
|
+
'hiso' Histogram no
|
|
10677
|
+
'hyperlapse_dbg_info' HyperlapsDebugInfo no
|
|
10678
|
+
'sensor_id' SensorID no
|
|
10679
|
+
'xidiri' Xidiri no
|
|
10680
|
+
|
|
10654
10681
|
=head3 DJI ThermalParams Tags
|
|
10655
10682
|
|
|
10656
10683
|
Thermal parameters extracted from APP4 of DJI RJPEG files from the ZH20T.
|
|
@@ -16641,6 +16668,7 @@ any information found here will be extracted, even if the tag is not listed.
|
|
|
16641
16668
|
0x0306 AFFineTune int8u
|
|
16642
16669
|
0x0307 AFFineTuneAdj int16s[3]
|
|
16643
16670
|
0x0308 FocusBracketStepSize int8u
|
|
16671
|
+
0x0309 AISubjectTrackingMode int16u
|
|
16644
16672
|
0x0400 FlashMode int16u
|
|
16645
16673
|
0x0401 FlashExposureComp rational64s
|
|
16646
16674
|
0x0403 FlashRemoteControl int16u
|
|
@@ -17432,29 +17460,30 @@ iPalm.
|
|
|
17432
17460
|
Tags extracted from the PANA and LEIC user data found in MP4 videos from
|
|
17433
17461
|
various Panasonic and Leica models.
|
|
17434
17462
|
|
|
17435
|
-
Index1
|
|
17436
|
-
------
|
|
17437
|
-
|
|
17438
|
-
|
|
17439
|
-
|
|
17440
|
-
|
|
17441
|
-
|
|
17442
|
-
|
|
17443
|
-
|
|
17444
|
-
|
|
17445
|
-
|
|
17446
|
-
|
|
17447
|
-
|
|
17448
|
-
|
|
17449
|
-
|
|
17450
|
-
|
|
17451
|
-
|
|
17452
|
-
|
|
17453
|
-
|
|
17454
|
-
|
|
17455
|
-
|
|
17456
|
-
|
|
17457
|
-
|
|
17463
|
+
Index1 Tag Name Writable
|
|
17464
|
+
------ -------- --------
|
|
17465
|
+
0 Make no
|
|
17466
|
+
4 Model no
|
|
17467
|
+
12 Model no
|
|
17468
|
+
16 JPEG-likeData EXIF
|
|
17469
|
+
22 Model no
|
|
17470
|
+
52 Version1 no
|
|
17471
|
+
62 Version2 no
|
|
17472
|
+
80 MakerNoteLeica5 Panasonic Leica5
|
|
17473
|
+
88 ThumbnailWidth no
|
|
17474
|
+
90 ThumbnailHeight no
|
|
17475
|
+
92 ThumbnailImage no
|
|
17476
|
+
1334 ThumbnailWidth no
|
|
17477
|
+
1338 ThumbnailHeight no
|
|
17478
|
+
1342 ThumbnailLength no
|
|
17479
|
+
1350 ThumbnailImage no
|
|
17480
|
+
1358 ThumbnailWidth no
|
|
17481
|
+
1362 ThumbnailHeight no
|
|
17482
|
+
1366 ThumbnailLength no
|
|
17483
|
+
1374 ThumbnailImage no
|
|
17484
|
+
16488 ExifData EXIF
|
|
17485
|
+
16512 ExifData EXIF
|
|
17486
|
+
0x00200080 ExifData EXIF
|
|
17458
17487
|
|
|
17459
17488
|
=head2 Pentax Tags
|
|
17460
17489
|
|
|
@@ -20955,6 +20984,7 @@ still proprietary) Adobe format.
|
|
|
20955
20984
|
MakerNoteCanon Canon
|
|
20956
20985
|
MakerNoteCasio Casio
|
|
20957
20986
|
MakerNoteCasio2 Casio Type2
|
|
20987
|
+
MakerNoteDJIInfo DJI Info
|
|
20958
20988
|
MakerNoteDJI DJI
|
|
20959
20989
|
MakerNoteFLIR FLIR
|
|
20960
20990
|
MakerNoteFujiFilm FujiFilm
|
|
@@ -26755,9 +26785,9 @@ ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF,
|
|
|
26755
26785
|
OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
|
|
26756
26786
|
languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
|
|
26757
26787
|
followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
|
|
26758
|
-
"Comment-spa"). See L<
|
|
26759
|
-
|
|
26760
|
-
|
|
26788
|
+
"Comment-spa"). See L<https://id3.org/> for the official ID3 specification
|
|
26789
|
+
and L<http://www.loc.gov/standards/iso639-2/php/code_list.php> for a list of
|
|
26790
|
+
ISO 639-2 language codes.
|
|
26761
26791
|
|
|
26762
26792
|
Tag Name Writable
|
|
26763
26793
|
-------- --------
|
|
@@ -37496,6 +37526,7 @@ for more details.
|
|
|
37496
37526
|
MakerNoteCasio
|
|
37497
37527
|
MakerNoteCasio2
|
|
37498
37528
|
MakerNoteDJI
|
|
37529
|
+
MakerNoteDJIInfo
|
|
37499
37530
|
MakerNoteFLIR
|
|
37500
37531
|
MakerNoteFujiFilm
|
|
37501
37532
|
MakerNoteGE
|
|
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
|
30
30
|
%static_vars);
|
|
31
31
|
|
|
32
|
-
$VERSION = '12.
|
|
32
|
+
$VERSION = '12.42';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -5896,13 +5896,13 @@ sub GetUnixTime($;$)
|
|
|
5896
5896
|
sub ConvertFileSize($)
|
|
5897
5897
|
{
|
|
5898
5898
|
my $val = shift;
|
|
5899
|
-
$val <
|
|
5900
|
-
$val <
|
|
5901
|
-
$val <
|
|
5902
|
-
$val <
|
|
5903
|
-
$val <
|
|
5904
|
-
$val <
|
|
5905
|
-
return sprintf('%.0f
|
|
5899
|
+
$val < 2000 and return "$val bytes";
|
|
5900
|
+
$val < 10000 and return sprintf('%.1f kB', $val / 1000);
|
|
5901
|
+
$val < 2000000 and return sprintf('%.0f kB', $val / 1000);
|
|
5902
|
+
$val < 10000000 and return sprintf('%.1f MB', $val / 1000000);
|
|
5903
|
+
$val < 2000000000 and return sprintf('%.0f MB', $val / 1000000);
|
|
5904
|
+
$val < 10000000000 and return sprintf('%.1f GB', $val / 1000000000);
|
|
5905
|
+
return sprintf('%.0f GB', $val / 1000000000);
|
|
5906
5906
|
}
|
|
5907
5907
|
|
|
5908
5908
|
#------------------------------------------------------------------------------
|
|
@@ -7686,8 +7686,8 @@ sub DoProcessTIFF($$;$)
|
|
|
7686
7686
|
# check DNG version
|
|
7687
7687
|
if ($$self{DNGVersion}) {
|
|
7688
7688
|
my $ver = $$self{DNGVersion};
|
|
7689
|
-
# currently support up to DNG version 1.
|
|
7690
|
-
unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.
|
|
7689
|
+
# currently support up to DNG version 1.6
|
|
7690
|
+
unless ($ver =~ /^(\d+) (\d+)/ and "$1.$2" <= 1.6) {
|
|
7691
7691
|
$ver =~ tr/ /./;
|
|
7692
7692
|
$self->Error("DNG Version $ver not yet tested", 1);
|
|
7693
7693
|
}
|
package/bin/pp_build_exe.args
CHANGED
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
# 10) Copy zip archive to web servers.
|
|
22
22
|
# 11) Update zip file version in link and text of html/index.html.
|
|
23
23
|
#------------------------------------------------------------------------------
|
|
24
|
-
-T exiftool-12.
|
|
25
|
-
#--info=FileVersion=12.4.
|
|
26
|
-
#--info=ProductVersion=12.4.
|
|
27
|
-
##"--info=Build Date=2022:
|
|
24
|
+
-T exiftool-12.42
|
|
25
|
+
#--info=FileVersion=12.4.2.0
|
|
26
|
+
#--info=ProductVersion=12.4.2.0
|
|
27
|
+
##"--info=Build Date=2022:06:01 14:21:21-04:00"
|
|
28
28
|
##"--info=Bundled Perl Version=ActivePerl 5.24.0"
|
|
29
29
|
##"--info=LegalCopyright=Copyright (c) 2003-2022, Phil Harvey"
|
|
30
30
|
##"--info=ProductName=ExifTool"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "exiftool-vendored.pl",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.42.0",
|
|
4
4
|
"description": "Vendored perl ExifTool for Node.js",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"homepage": "https://github.com/mceachen/exiftool-vendored.pl#readme",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"mocha": "^
|
|
46
|
-
"prettier": "^2.
|
|
45
|
+
"mocha": "^10.0.0",
|
|
46
|
+
"prettier": "^2.7.1",
|
|
47
47
|
"rimraf": "^3.0.2"
|
|
48
48
|
}
|
|
49
49
|
}
|