← Index
NYTProf Performance Profile   « line view »
For examples/Atom-timer.pl
  Run on Mon Aug 12 14:45:28 2013
Reported on Mon Aug 12 14:46:14 2013

Filename/Users/dde/perl5/perlbrew/perls/5.18.0t/lib/site_perl/5.18.0/darwin-thread-multi-2level/Class/MOP/Method/Accessor.pm
StatementsExecuted 6036 statements in 17.1ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
223116.46ms66.3msClass::MOP::Method::Accessor::::_initialize_bodyClass::MOP::Method::Accessor::_initialize_body
280335.35ms19.2msClass::MOP::Method::Accessor::::_newClass::MOP::Method::Accessor::_new
249224.71ms123msClass::MOP::Method::Accessor::::newClass::MOP::Method::Accessor::new
5822516µs20.9msClass::MOP::Method::Accessor::::_generate_reader_method_inlineClass::MOP::Method::Accessor::_generate_reader_method_inline
4422403µs32.1msClass::MOP::Method::Accessor::::_generate_accessor_method_inlineClass::MOP::Method::Accessor::_generate_accessor_method_inline
5311264µs301µsClass::MOP::Method::Accessor::::_generate_reader_methodClass::MOP::Method::Accessor::_generate_reader_method
2422234µs4.92msClass::MOP::Method::Accessor::::_generate_predicate_method_inlineClass::MOP::Method::Accessor::_generate_predicate_method_inline
2211112µs127µsClass::MOP::Method::Accessor::::_generate_accessor_methodClass::MOP::Method::Accessor::_generate_accessor_method
161175µs86µsClass::MOP::Method::Accessor::::_generate_predicate_methodClass::MOP::Method::Accessor::_generate_predicate_method
531164µs64µsClass::MOP::Method::Accessor::::_inline_throw_errorClass::MOP::Method::Accessor::_inline_throw_error
31136µs484µsClass::MOP::Method::Accessor::::_generate_writer_method_inlineClass::MOP::Method::Accessor::_generate_writer_method_inline
31117µs19µsClass::MOP::Method::Accessor::::_generate_writer_methodClass::MOP::Method::Accessor::_generate_writer_method
1118µs8µsClass::MOP::Method::Accessor::::BEGIN@3Class::MOP::Method::Accessor::BEGIN@3
1117µs10µsClass::MOP::Method::Accessor::::BEGIN@11Class::MOP::Method::Accessor::BEGIN@11
1116µs41µsClass::MOP::Method::Accessor::::BEGIN@15Class::MOP::Method::Accessor::BEGIN@15
1116µs1.91msClass::MOP::Method::Accessor::::BEGIN@17Class::MOP::Method::Accessor::BEGIN@17
1116µs29µsClass::MOP::Method::Accessor::::BEGIN@14Class::MOP::Method::Accessor::BEGIN@14
1116µs17µsClass::MOP::Method::Accessor::::BEGIN@10Class::MOP::Method::Accessor::BEGIN@10
1115µs26µsClass::MOP::Method::Accessor::::BEGIN@13Class::MOP::Method::Accessor::BEGIN@13
0000s0sClass::MOP::Method::Accessor::::__ANON__[:104]Class::MOP::Method::Accessor::__ANON__[:104]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:120]Class::MOP::Method::Accessor::__ANON__[:120]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:123]Class::MOP::Method::Accessor::__ANON__[:123]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:134]Class::MOP::Method::Accessor::__ANON__[:134]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:154]Class::MOP::Method::Accessor::__ANON__[:154]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:157]Class::MOP::Method::Accessor::__ANON__[:157]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:171]Class::MOP::Method::Accessor::__ANON__[:171]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:184]Class::MOP::Method::Accessor::__ANON__[:184]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:187]Class::MOP::Method::Accessor::__ANON__[:187]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:196]Class::MOP::Method::Accessor::__ANON__[:196]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:209]Class::MOP::Method::Accessor::__ANON__[:209]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:212]Class::MOP::Method::Accessor::__ANON__[:212]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:221]Class::MOP::Method::Accessor::__ANON__[:221]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:234]Class::MOP::Method::Accessor::__ANON__[:234]
0000s0sClass::MOP::Method::Accessor::::__ANON__[:237]Class::MOP::Method::Accessor::__ANON__[:237]
0000s0sClass::MOP::Method::Accessor::::_generate_clearer_methodClass::MOP::Method::Accessor::_generate_clearer_method
0000s0sClass::MOP::Method::Accessor::::_generate_clearer_method_inlineClass::MOP::Method::Accessor::_generate_clearer_method_inline
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1
2package Class::MOP::Method::Accessor;
3
# spent 8µs within Class::MOP::Method::Accessor::BEGIN@3 which was called: # once (8µs+0s) by Class::MOP::Class::BEGIN@15 at line 5
BEGIN {
414µs $Class::MOP::Method::Accessor::AUTHORITY = 'cpan:STEVAN';
5126µs18µs}
# spent 8µs making 1 call to Class::MOP::Method::Accessor::BEGIN@3
6{
72900ns $Class::MOP::Method::Accessor::VERSION = '2.1005';
8}
9
10219µs228µs
# spent 17µs (6+11) within Class::MOP::Method::Accessor::BEGIN@10 which was called: # once (6µs+11µs) by Class::MOP::Class::BEGIN@15 at line 10
use strict;
# spent 17µs making 1 call to Class::MOP::Method::Accessor::BEGIN@10 # spent 11µs making 1 call to strict::import
11220µs213µs
# spent 10µs (7+3) within Class::MOP::Method::Accessor::BEGIN@11 which was called: # once (7µs+3µs) by Class::MOP::Class::BEGIN@15 at line 11
use warnings;
# spent 10µs making 1 call to Class::MOP::Method::Accessor::BEGIN@11 # spent 3µs making 1 call to warnings::import
12
13225µs247µs
# spent 26µs (5+21) within Class::MOP::Method::Accessor::BEGIN@13 which was called: # once (5µs+21µs) by Class::MOP::Class::BEGIN@15 at line 13
use Carp 'confess';
# spent 26µs making 1 call to Class::MOP::Method::Accessor::BEGIN@13 # spent 21µs making 1 call to Exporter::import
14220µs253µs
# spent 29µs (6+24) within Class::MOP::Method::Accessor::BEGIN@14 which was called: # once (6µs+24µs) by Class::MOP::Class::BEGIN@15 at line 14
use Scalar::Util 'blessed', 'weaken';
# spent 29µs making 1 call to Class::MOP::Method::Accessor::BEGIN@14 # spent 24µs making 1 call to Exporter::import
15223µs276µs
# spent 41µs (6+35) within Class::MOP::Method::Accessor::BEGIN@15 which was called: # once (6µs+35µs) by Class::MOP::Class::BEGIN@15 at line 15
use Try::Tiny;
# spent 41µs making 1 call to Class::MOP::Method::Accessor::BEGIN@15 # spent 35µs making 1 call to Exporter::import
16
172994µs23.81ms
# spent 1.91ms (6µs+1.90) within Class::MOP::Method::Accessor::BEGIN@17 which was called: # once (6µs+1.90ms) by Class::MOP::Class::BEGIN@15 at line 17
use base 'Class::MOP::Method::Generated';
# spent 1.91ms making 1 call to Class::MOP::Method::Accessor::BEGIN@17 # spent 1.90ms making 1 call to base::import
18
19
# spent 123ms (4.71+118) within Class::MOP::Method::Accessor::new which was called 249 times, avg 493µs/call: # 188 times (2.77ms+28.9ms) by Class::MOP::Attribute::try {...} at line 389 of Class/MOP/Attribute.pm, avg 169µs/call # 61 times (1.94ms+89.2ms) by Class::MOP::Attribute::try {...} or Class::MOP::Class:::around at line 20 of Moose/Meta/Method/Accessor.pm, avg 1.49ms/call
sub new {
2024932µs my $class = shift;
21249481µs my %options = @_;
22
2324958µs (exists $options{attribute})
24 || confess "You must supply an attribute to construct with";
25
2624931µs (exists $options{accessor_type})
27 || confess "You must supply an accessor_type to construct with";
28
292491.03ms498308µs (blessed($options{attribute}) && $options{attribute}->isa('Class::MOP::Attribute'))
# spent 166µs making 249 calls to Scalar::Util::blessed, avg 665ns/call # spent 143µs making 249 calls to UNIVERSAL::isa, avg 573ns/call
30 || confess "You must supply an attribute which is a 'Class::MOP::Attribute' instance";
31
3224954µs ($options{package_name} && $options{name})
33 || confess "You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT";
34
35249249µs2491.13ms my $self = $class->_new(\%options);
# spent 1.03ms making 188 calls to Class::MOP::Method::Accessor::_new, avg 5µs/call # spent 65µs making 26 calls to Moose::Meta::Method::Accessor::Native::_new, avg 3µs/call # spent 36µs making 35 calls to Moose::Meta::Method::Accessor::_new, avg 1µs/call
36
37 # we don't want this creating
38 # a cycle in the code, if not
39 # needed
402491.56ms249219µs weaken($self->{'attribute'});
# spent 219µs making 249 calls to Scalar::Util::weaken, avg 879ns/call
41
42249602µs24998.6ms $self->_initialize_body;
# spent 66.3ms making 223 calls to Class::MOP::Method::Accessor::_initialize_body, avg 297µs/call # spent 32.4ms making 26 calls to Moose::Meta::Method::Accessor::Native::_initialize_body, avg 1.25ms/call
43
44249521µs return $self;
45}
46
47
# spent 19.2ms (5.35+13.8) within Class::MOP::Method::Accessor::_new which was called 280 times, avg 68µs/call: # 188 times (1.03ms+0s) by Class::MOP::Method::Accessor::new at line 35, avg 5µs/call # 57 times (305µs+0s) by Class::MOP::Method::wrap at line 46 of Class/MOP/Method.pm, avg 5µs/call # 35 times (4.01ms+13.8ms) by Class::MOP::Method::Accessor::new at line 24 of Moose/Meta/Method/Accessor.pm, avg 510µs/call
sub _new {
4828039µs my $class = shift;
49
50280144µs7013.8ms return Class::MOP::Class->initialize($class)->new_object(@_)
# spent 13.4ms making 35 calls to Class::MOP::Class::new_object, avg 382µs/call # spent 468µs making 35 calls to Class::MOP::Class::initialize, avg 13µs/call
51 if $class ne __PACKAGE__;
52
5324574µs my $params = @_ == 1 ? $_[0] : {@_};
54
552451.35ms return bless {
56 # inherited from Class::MOP::Method
57 body => $params->{body},
58 associated_metaclass => $params->{associated_metaclass},
59 package_name => $params->{package_name},
60 name => $params->{name},
61 original_method => $params->{original_method},
62
63 # inherit from Class::MOP::Generated
64 is_inline => $params->{is_inline} || 0,
65 definition_context => $params->{definition_context},
66
67 # defined in this class
68 attribute => $params->{attribute},
69 accessor_type => $params->{accessor_type},
70 } => $class;
71}
72
73## accessors
74
756481.09mssub associated_attribute { (shift)->{'attribute'} }
76223381µssub accessor_type { (shift)->{'accessor_type'} }
77
78## factory
79
80
# spent 66.3ms (6.46+59.8) within Class::MOP::Method::Accessor::_initialize_body which was called 223 times, avg 297µs/call: # 223 times (6.46ms+59.8ms) by Class::MOP::Method::Accessor::new at line 42, avg 297µs/call
sub _initialize_body {
8122327µs my $self = shift;
82
832235.53ms446304µs my $method_name = join "_" => (
# spent 190µs making 223 calls to Class::MOP::Method::Accessor::accessor_type, avg 852ns/call # spent 114µs making 223 calls to Class::MOP::Method::Generated::is_inline, avg 510ns/call
84 '_generate',
85 $self->accessor_type,
86 'method',
87 ($self->is_inline ? 'inline' : ())
88 );
89
90223653µs22359.5ms $self->{'body'} = $self->$method_name();
# spent 27.3ms making 22 calls to Moose::Meta::Method::Accessor::_generate_accessor_method, avg 1.24ms/call # spent 17.8ms making 54 calls to Class::MOP::Method::Accessor::_generate_reader_method_inline, avg 330µs/call # spent 5.12ms making 22 calls to Class::MOP::Method::Accessor::_generate_accessor_method_inline, avg 233µs/call # spent 3.21ms making 4 calls to Moose::Meta::Method::Accessor::_generate_reader_method, avg 802µs/call # spent 2.59ms making 16 calls to Class::MOP::Method::Accessor::_generate_predicate_method_inline, avg 162µs/call # spent 2.45ms making 8 calls to Moose::Meta::Method::Accessor::_generate_predicate_method, avg 306µs/call # spent 484µs making 3 calls to Class::MOP::Method::Accessor::_generate_writer_method_inline, avg 161µs/call # spent 301µs making 53 calls to Class::MOP::Method::Accessor::_generate_reader_method, avg 6µs/call # spent 127µs making 22 calls to Class::MOP::Method::Accessor::_generate_accessor_method, avg 6µs/call # spent 86µs making 16 calls to Class::MOP::Method::Accessor::_generate_predicate_method, avg 5µs/call # spent 19µs making 3 calls to Class::MOP::Method::Accessor::_generate_writer_method, avg 6µs/call
91}
92
93## generators
94
95
# spent 127µs (112+15) within Class::MOP::Method::Accessor::_generate_accessor_method which was called 22 times, avg 6µs/call: # 22 times (112µs+15µs) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 6µs/call
sub _generate_accessor_method {
96222µs my $self = shift;
972214µs2215µs my $attr = $self->associated_attribute;
# spent 15µs making 22 calls to Class::MOP::Method::Accessor::associated_attribute, avg 682ns/call
98
99 return sub {
100 if (@_ >= 2) {
101 $attr->set_value($_[0], $_[1]);
102 }
103 $attr->get_value($_[0]);
1042283µs };
105}
106
107
# spent 32.1ms (403µs+31.7) within Class::MOP::Method::Accessor::_generate_accessor_method_inline which was called 44 times, avg 730µs/call: # 22 times (205µs+26.8ms) by Moose::Meta::Method::Accessor::_generate_accessor_method at line 74 of Moose/Meta/Method/Accessor.pm, avg 1.23ms/call # 22 times (197µs+4.93ms) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 233µs/call
sub _generate_accessor_method_inline {
108446µs my $self = shift;
1094429µs4428µs my $attr = $self->associated_attribute;
# spent 28µs making 44 calls to Class::MOP::Method::Accessor::associated_attribute, avg 639ns/call
110
111 return try {
11244235µs13230.4ms $self->_compile_code([
# spent 11.8ms making 22 calls to Moose::Meta::Attribute::_inline_set_value, avg 535µs/call # spent 9.08ms making 22 calls to Moose::Meta::Method::Accessor::_compile_code, avg 413µs/call # spent 5.19ms making 22 calls to Moose::Meta::Attribute::_inline_get_value, avg 236µs/call # spent 2.93ms making 22 calls to Class::MOP::Method::Generated::_compile_code, avg 133µs/call # spent 1.10ms making 22 calls to Class::MOP::Attribute::_inline_set_value, avg 50µs/call # spent 332µs making 22 calls to Class::MOP::Attribute::_inline_get_value, avg 15µs/call
113 'sub {',
114 'if (@_ > 1) {',
115 $attr->_inline_set_value('$_[0]', '$_[1]'),
116 '}',
117 $attr->_inline_get_value('$_[0]'),
118 '}',
119 ]);
120 }
121 catch {
122 confess "Could not generate inline accessor because : $_";
12344248µs8892µs };
# spent 92µs making 44 calls to Try::Tiny::catch, avg 2µs/call # spent 31.6ms making 44 calls to Try::Tiny::try, avg 718µs/call, recursion: max depth 3, sum of overlapping time 31.6ms
124}
125
126
# spent 301µs (264+37) within Class::MOP::Method::Accessor::_generate_reader_method which was called 53 times, avg 6µs/call: # 53 times (264µs+37µs) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 6µs/call
sub _generate_reader_method {
127536µs my $self = shift;
1285334µs5337µs my $attr = $self->associated_attribute;
# spent 37µs making 53 calls to Class::MOP::Method::Accessor::associated_attribute, avg 700ns/call
129
130 return sub {
131122µs confess "Cannot assign a value to a read-only accessor"
132 if @_ > 1;
1331233µs12229µs $attr->get_value($_[0]);
# spent 229µs making 12 calls to Class::MOP::Attribute::get_value, avg 19µs/call
13453190µs };
135}
136
137
# spent 20.9ms (516µs+20.4) within Class::MOP::Method::Accessor::_generate_reader_method_inline which was called 58 times, avg 361µs/call: # 54 times (474µs+17.3ms) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 330µs/call # 4 times (42µs+3.09ms) by Moose::Meta::Method::Accessor::_generate_reader_method at line 62 of Moose/Meta/Method/Accessor.pm, avg 782µs/call
sub _generate_reader_method_inline {
138586µs my $self = shift;
1395838µs5839µs my $attr = $self->associated_attribute;
# spent 39µs making 58 calls to Class::MOP::Method::Accessor::associated_attribute, avg 679ns/call
140
141 return try {
14258264µs17418.9ms $self->_compile_code([
# spent 8.51ms making 53 calls to Class::MOP::Attribute::_inline_get_value, avg 161µs/call # spent 6.81ms making 53 calls to Class::MOP::Method::Generated::_compile_code, avg 128µs/call # spent 1.60ms making 5 calls to Moose::Meta::Method::Accessor::_compile_code, avg 320µs/call # spent 1.19ms making 5 calls to Moose::Meta::Attribute::_inline_get_value, avg 238µs/call # spent 685µs making 5 calls to Moose::Meta::Method::_inline_throw_error, avg 137µs/call # spent 64µs making 53 calls to Class::MOP::Method::Accessor::_inline_throw_error, avg 1µs/call
143 'sub {',
144 'if (@_ > 1) {',
145 # XXX: this is a hack, but our error stuff is terrible
146 $self->_inline_throw_error(
147 '"Cannot assign a value to a read-only accessor"',
148 'data => \@_'
149 ) . ';',
150 '}',
151 $attr->_inline_get_value('$_[0]'),
152 '}',
153 ]);
154 }
155 catch {
156 confess "Could not generate inline reader because : $_";
15758321µs116119µs };
# spent 119µs making 58 calls to Try::Tiny::catch, avg 2µs/call # spent 20.3ms making 58 calls to Try::Tiny::try, avg 349µs/call, recursion: max depth 3, sum of overlapping time 20.3ms
158}
159
160
# spent 64µs within Class::MOP::Method::Accessor::_inline_throw_error which was called 53 times, avg 1µs/call: # 53 times (64µs+0s) by Class::MOP::Method::Accessor::try {...} at line 142, avg 1µs/call
sub _inline_throw_error {
161536µs my $self = shift;
1625395µs return 'Carp::confess ' . $_[0];
163}
164
165
# spent 19µs (17+2) within Class::MOP::Method::Accessor::_generate_writer_method which was called 3 times, avg 6µs/call: # 3 times (17µs+2µs) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 6µs/call
sub _generate_writer_method {
1663600ns my $self = shift;
16732µs32µs my $attr = $self->associated_attribute;
# spent 2µs making 3 calls to Class::MOP::Method::Accessor::associated_attribute, avg 700ns/call
168
169 return sub {
170 $attr->set_value($_[0], $_[1]);
171311µs };
172}
173
174
# spent 484µs (36+449) within Class::MOP::Method::Accessor::_generate_writer_method_inline which was called 3 times, avg 161µs/call: # 3 times (36µs+449µs) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 161µs/call
sub _generate_writer_method_inline {
1753800ns my $self = shift;
17633µs32µs my $attr = $self->associated_attribute;
# spent 2µs making 3 calls to Class::MOP::Method::Accessor::associated_attribute, avg 633ns/call
177
178 return try {
179310µs6377µs $self->_compile_code([
# spent 329µs making 3 calls to Class::MOP::Method::Generated::_compile_code, avg 110µs/call # spent 49µs making 3 calls to Class::MOP::Attribute::_inline_set_value, avg 16µs/call
180 'sub {',
181 $attr->_inline_set_value('$_[0]', '$_[1]'),
182 '}',
183 ]);
184 }
185 catch {
186 confess "Could not generate inline writer because : $_";
187362µs66µs };
# spent 6µs making 3 calls to Try::Tiny::catch, avg 2µs/call # spent 441µs making 3 calls to Try::Tiny::try, avg 147µs/call, recursion: max depth 1, sum of overlapping time 441µs
188}
189
190
# spent 86µs (75+11) within Class::MOP::Method::Accessor::_generate_predicate_method which was called 16 times, avg 5µs/call: # 16 times (75µs+11µs) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 5µs/call
sub _generate_predicate_method {
191162µs my $self = shift;
1921610µs1611µs my $attr = $self->associated_attribute;
# spent 11µs making 16 calls to Class::MOP::Method::Accessor::associated_attribute, avg 681ns/call
193
194 return sub {
1951229µs12210µs $attr->has_value($_[0])
# spent 210µs making 12 calls to Class::MOP::Attribute::has_value, avg 17µs/call
1961653µs };
197}
198
199
# spent 4.92ms (234µs+4.68) within Class::MOP::Method::Accessor::_generate_predicate_method_inline which was called 24 times, avg 205µs/call: # 16 times (154µs+2.43ms) by Class::MOP::Method::Accessor::_initialize_body at line 90, avg 162µs/call # 8 times (80µs+2.25ms) by Moose::Meta::Method::Accessor::_generate_predicate_method at line 80 of Moose/Meta/Method/Accessor.pm, avg 291µs/call
sub _generate_predicate_method_inline {
200244µs my $self = shift;
2012418µs2416µs my $attr = $self->associated_attribute;
# spent 16µs making 24 calls to Class::MOP::Method::Accessor::associated_attribute, avg 683ns/call
202
203 return try {
2042477µs484.09ms $self->_compile_code([
# spent 1.88ms making 8 calls to Moose::Meta::Method::Accessor::_compile_code, avg 235µs/call # spent 1.78ms making 16 calls to Class::MOP::Method::Generated::_compile_code, avg 111µs/call # spent 434µs making 24 calls to Class::MOP::Attribute::_inline_has_value, avg 18µs/call
205 'sub {',
206 $attr->_inline_has_value('$_[0]'),
207 '}',
208 ]);
209 }
210 catch {
211 confess "Could not generate inline predicate because : $_";
21224136µs4849µs };
# spent 49µs making 24 calls to Try::Tiny::catch, avg 2µs/call # spent 4.62ms making 24 calls to Try::Tiny::try, avg 192µs/call, recursion: max depth 3, sum of overlapping time 4.62ms
213}
214
215sub _generate_clearer_method {
216 my $self = shift;
217 my $attr = $self->associated_attribute;
218
219 return sub {
220 $attr->clear_value($_[0])
221 };
222}
223
224sub _generate_clearer_method_inline {
225 my $self = shift;
226 my $attr = $self->associated_attribute;
227
228 return try {
229 $self->_compile_code([
230 'sub {',
231 $attr->_inline_clear_value('$_[0]'),
232 '}',
233 ]);
234 }
235 catch {
236 confess "Could not generate inline clearer because : $_";
237 };
238}
239
24013µs1;
241
242# ABSTRACT: Method Meta Object for accessors
243
244__END__