View Javadoc

1   /*
2    * Copyright 2016 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package io.netty.buffer;
17  
18  import java.io.IOException;
19  import java.io.InputStream;
20  import java.io.OutputStream;
21  import java.nio.ByteBuffer;
22  import java.nio.ByteOrder;
23  import java.nio.channels.GatheringByteChannel;
24  import java.nio.channels.ScatteringByteChannel;
25  import java.nio.charset.Charset;
26  import java.util.Iterator;
27  import java.util.List;
28  
29  class WrappedCompositeByteBuf extends CompositeByteBuf {
30  
31      private final CompositeByteBuf wrapped;
32  
33      WrappedCompositeByteBuf(CompositeByteBuf wrapped) {
34          super(wrapped.alloc());
35          this.wrapped = wrapped;
36      }
37  
38      @Override
39      public boolean release() {
40          return wrapped.release();
41      }
42  
43      @Override
44      public boolean release(int decrement) {
45          return wrapped.release(decrement);
46      }
47  
48      @Override
49      public final int maxCapacity() {
50          return wrapped.maxCapacity();
51      }
52  
53      @Override
54      public final int readerIndex() {
55          return wrapped.readerIndex();
56      }
57  
58      @Override
59      public final int writerIndex() {
60          return wrapped.writerIndex();
61      }
62  
63      @Override
64      public final boolean isReadable() {
65          return wrapped.isReadable();
66      }
67  
68      @Override
69      public final boolean isReadable(int numBytes) {
70          return wrapped.isReadable(numBytes);
71      }
72  
73      @Override
74      public final boolean isWritable() {
75          return wrapped.isWritable();
76      }
77  
78      @Override
79      public final boolean isWritable(int numBytes) {
80          return wrapped.isWritable(numBytes);
81      }
82  
83      @Override
84      public final int readableBytes() {
85          return wrapped.readableBytes();
86      }
87  
88      @Override
89      public final int writableBytes() {
90          return wrapped.writableBytes();
91      }
92  
93      @Override
94      public final int maxWritableBytes() {
95          return wrapped.maxWritableBytes();
96      }
97  
98      @Override
99      public int ensureWritable(int minWritableBytes, boolean force) {
100         return wrapped.ensureWritable(minWritableBytes, force);
101     }
102 
103     @Override
104     public ByteBuf order(ByteOrder endianness) {
105         return wrapped.order(endianness);
106     }
107 
108     @Override
109     public boolean getBoolean(int index) {
110         return wrapped.getBoolean(index);
111     }
112 
113     @Override
114     public short getUnsignedByte(int index) {
115         return wrapped.getUnsignedByte(index);
116     }
117 
118     @Override
119     public short getShort(int index) {
120         return wrapped.getShort(index);
121     }
122 
123     @Override
124     public int getUnsignedShort(int index) {
125         return wrapped.getUnsignedShort(index);
126     }
127 
128     @Override
129     public int getUnsignedMedium(int index) {
130         return wrapped.getUnsignedMedium(index);
131     }
132 
133     @Override
134     public int getMedium(int index) {
135         return wrapped.getMedium(index);
136     }
137 
138     @Override
139     public int getInt(int index) {
140         return wrapped.getInt(index);
141     }
142 
143     @Override
144     public long getUnsignedInt(int index) {
145         return wrapped.getUnsignedInt(index);
146     }
147 
148     @Override
149     public long getLong(int index) {
150         return wrapped.getLong(index);
151     }
152 
153     @Override
154     public char getChar(int index) {
155         return wrapped.getChar(index);
156     }
157 
158     @Override
159     public float getFloat(int index) {
160         return wrapped.getFloat(index);
161     }
162 
163     @Override
164     public double getDouble(int index) {
165         return wrapped.getDouble(index);
166     }
167 
168     @Override
169     public byte readByte() {
170         return wrapped.readByte();
171     }
172 
173     @Override
174     public boolean readBoolean() {
175         return wrapped.readBoolean();
176     }
177 
178     @Override
179     public short readUnsignedByte() {
180         return wrapped.readUnsignedByte();
181     }
182 
183     @Override
184     public short readShort() {
185         return wrapped.readShort();
186     }
187 
188     @Override
189     public int readUnsignedShort() {
190         return wrapped.readUnsignedShort();
191     }
192 
193     @Override
194     public int readMedium() {
195         return wrapped.readMedium();
196     }
197 
198     @Override
199     public int readUnsignedMedium() {
200         return wrapped.readUnsignedMedium();
201     }
202 
203     @Override
204     public int readInt() {
205         return wrapped.readInt();
206     }
207 
208     @Override
209     public long readUnsignedInt() {
210         return wrapped.readUnsignedInt();
211     }
212 
213     @Override
214     public long readLong() {
215         return wrapped.readLong();
216     }
217 
218     @Override
219     public char readChar() {
220         return wrapped.readChar();
221     }
222 
223     @Override
224     public float readFloat() {
225         return wrapped.readFloat();
226     }
227 
228     @Override
229     public double readDouble() {
230         return wrapped.readDouble();
231     }
232 
233     @Override
234     public ByteBuf readBytes(int length) {
235         return wrapped.readBytes(length);
236     }
237 
238     @Override
239     public ByteBuf slice() {
240         return wrapped.slice();
241     }
242 
243     @Override
244     public ByteBuf slice(int index, int length) {
245         return wrapped.slice(index, length);
246     }
247 
248     @Override
249     public ByteBuffer nioBuffer() {
250         return wrapped.nioBuffer();
251     }
252 
253     @Override
254     public String toString(Charset charset) {
255         return wrapped.toString(charset);
256     }
257 
258     @Override
259     public String toString(int index, int length, Charset charset) {
260         return wrapped.toString(index, length, charset);
261     }
262 
263     @Override
264     public int indexOf(int fromIndex, int toIndex, byte value) {
265         return wrapped.indexOf(fromIndex, toIndex, value);
266     }
267 
268     @Override
269     public int bytesBefore(byte value) {
270         return wrapped.bytesBefore(value);
271     }
272 
273     @Override
274     public int bytesBefore(int length, byte value) {
275         return wrapped.bytesBefore(length, value);
276     }
277 
278     @Override
279     public int bytesBefore(int index, int length, byte value) {
280         return wrapped.bytesBefore(index, length, value);
281     }
282 
283     @Override
284     public int forEachByte(ByteBufProcessor processor) {
285         return wrapped.forEachByte(processor);
286     }
287 
288     @Override
289     public int forEachByte(int index, int length, ByteBufProcessor processor) {
290         return wrapped.forEachByte(index, length, processor);
291     }
292 
293     @Override
294     public int forEachByteDesc(ByteBufProcessor processor) {
295         return wrapped.forEachByteDesc(processor);
296     }
297 
298     @Override
299     public int forEachByteDesc(int index, int length, ByteBufProcessor processor) {
300         return wrapped.forEachByteDesc(index, length, processor);
301     }
302 
303     @Override
304     public final int hashCode() {
305         return wrapped.hashCode();
306     }
307 
308     @Override
309     public final boolean equals(Object o) {
310         return wrapped.equals(o);
311     }
312 
313     @Override
314     public final int compareTo(ByteBuf that) {
315         return wrapped.compareTo(that);
316     }
317 
318     @Override
319     public final int refCnt() {
320         return wrapped.refCnt();
321     }
322 
323     @Override
324     public ByteBuf duplicate() {
325         return wrapped.duplicate();
326     }
327 
328     @Override
329     public ByteBuf readSlice(int length) {
330         return wrapped.readSlice(length);
331     }
332 
333     @Override
334     public int readBytes(GatheringByteChannel out, int length) throws IOException {
335         return wrapped.readBytes(out, length);
336     }
337 
338     @Override
339     public int writeBytes(InputStream in, int length) throws IOException {
340         return wrapped.writeBytes(in, length);
341     }
342 
343     @Override
344     public int writeBytes(ScatteringByteChannel in, int length) throws IOException {
345         return wrapped.writeBytes(in, length);
346     }
347 
348     @Override
349     public ByteBuf copy() {
350         return wrapped.copy();
351     }
352 
353     @Override
354     public CompositeByteBuf addComponent(ByteBuf buffer) {
355         wrapped.addComponent(buffer);
356         return this;
357     }
358 
359     @Override
360     public CompositeByteBuf addComponents(ByteBuf... buffers) {
361         wrapped.addComponents(buffers);
362         return this;
363     }
364 
365     @Override
366     public CompositeByteBuf addComponents(Iterable<ByteBuf> buffers) {
367         wrapped.addComponents(buffers);
368         return this;
369     }
370 
371     @Override
372     public CompositeByteBuf addComponent(int cIndex, ByteBuf buffer) {
373         wrapped.addComponent(cIndex, buffer);
374         return this;
375     }
376 
377     @Override
378     public CompositeByteBuf addComponents(int cIndex, ByteBuf... buffers) {
379         wrapped.addComponents(cIndex, buffers);
380         return this;
381     }
382 
383     @Override
384     public CompositeByteBuf addComponents(int cIndex, Iterable<ByteBuf> buffers) {
385         wrapped.addComponents(cIndex, buffers);
386         return this;
387     }
388 
389     @Override
390     public CompositeByteBuf removeComponent(int cIndex) {
391         wrapped.removeComponent(cIndex);
392         return this;
393     }
394 
395     @Override
396     public CompositeByteBuf removeComponents(int cIndex, int numComponents) {
397         wrapped.removeComponents(cIndex, numComponents);
398         return this;
399     }
400 
401     @Override
402     public Iterator<ByteBuf> iterator() {
403         return wrapped.iterator();
404     }
405 
406     @Override
407     public List<ByteBuf> decompose(int offset, int length) {
408         return wrapped.decompose(offset, length);
409     }
410 
411     @Override
412     public final boolean isDirect() {
413         return wrapped.isDirect();
414     }
415 
416     @Override
417     public final boolean hasArray() {
418         return wrapped.hasArray();
419     }
420 
421     @Override
422     public final byte[] array() {
423         return wrapped.array();
424     }
425 
426     @Override
427     public final int arrayOffset() {
428         return wrapped.arrayOffset();
429     }
430 
431     @Override
432     public final boolean hasMemoryAddress() {
433         return wrapped.hasMemoryAddress();
434     }
435 
436     @Override
437     public final long memoryAddress() {
438         return wrapped.memoryAddress();
439     }
440 
441     @Override
442     public final int capacity() {
443         return wrapped.capacity();
444     }
445 
446     @Override
447     public CompositeByteBuf capacity(int newCapacity) {
448         wrapped.capacity(newCapacity);
449         return this;
450     }
451 
452     @Override
453     public final ByteBufAllocator alloc() {
454         return wrapped.alloc();
455     }
456 
457     @Override
458     public final ByteOrder order() {
459         return wrapped.order();
460     }
461 
462     @Override
463     public final int numComponents() {
464         return wrapped.numComponents();
465     }
466 
467     @Override
468     public final int maxNumComponents() {
469         return wrapped.maxNumComponents();
470     }
471 
472     @Override
473     public final int toComponentIndex(int offset) {
474         return wrapped.toComponentIndex(offset);
475     }
476 
477     @Override
478     public final int toByteIndex(int cIndex) {
479         return wrapped.toByteIndex(cIndex);
480     }
481 
482     @Override
483     public byte getByte(int index) {
484         return wrapped.getByte(index);
485     }
486 
487     @Override
488     protected final byte _getByte(int index) {
489         return wrapped._getByte(index);
490     }
491 
492     @Override
493     protected final short _getShort(int index) {
494         return wrapped._getShort(index);
495     }
496 
497     @Override
498     protected final int _getUnsignedMedium(int index) {
499         return wrapped._getUnsignedMedium(index);
500     }
501 
502     @Override
503     protected final int _getInt(int index) {
504         return wrapped._getInt(index);
505     }
506 
507     @Override
508     protected final long _getLong(int index) {
509         return wrapped._getLong(index);
510     }
511 
512     @Override
513     public CompositeByteBuf getBytes(int index, byte[] dst, int dstIndex, int length) {
514         wrapped.getBytes(index, dst, dstIndex, length);
515         return this;
516     }
517 
518     @Override
519     public CompositeByteBuf getBytes(int index, ByteBuffer dst) {
520         wrapped.getBytes(index, dst);
521         return this;
522     }
523 
524     @Override
525     public CompositeByteBuf getBytes(int index, ByteBuf dst, int dstIndex, int length) {
526         wrapped.getBytes(index, dst, dstIndex, length);
527         return this;
528     }
529 
530     @Override
531     public int getBytes(int index, GatheringByteChannel out, int length) throws IOException {
532         return wrapped.getBytes(index, out, length);
533     }
534 
535     @Override
536     public CompositeByteBuf getBytes(int index, OutputStream out, int length) throws IOException {
537         wrapped.getBytes(index, out, length);
538         return this;
539     }
540 
541     @Override
542     public CompositeByteBuf setByte(int index, int value) {
543         wrapped.setByte(index, value);
544         return this;
545     }
546 
547     @Override
548     protected final void _setByte(int index, int value) {
549         wrapped._setByte(index, value);
550     }
551 
552     @Override
553     public CompositeByteBuf setShort(int index, int value) {
554         wrapped.setShort(index, value);
555         return this;
556     }
557 
558     @Override
559     protected final void _setShort(int index, int value) {
560         wrapped._setShort(index, value);
561     }
562 
563     @Override
564     public CompositeByteBuf setMedium(int index, int value) {
565         wrapped.setMedium(index, value);
566         return this;
567     }
568 
569     @Override
570     protected final void _setMedium(int index, int value) {
571         wrapped._setMedium(index, value);
572     }
573 
574     @Override
575     public CompositeByteBuf setInt(int index, int value) {
576         wrapped.setInt(index, value);
577         return this;
578     }
579 
580     @Override
581     protected final void _setInt(int index, int value) {
582         wrapped._setInt(index, value);
583     }
584 
585     @Override
586     public CompositeByteBuf setLong(int index, long value) {
587         wrapped.setLong(index, value);
588         return this;
589     }
590 
591     @Override
592     protected final void _setLong(int index, long value) {
593         wrapped._setLong(index, value);
594     }
595 
596     @Override
597     public CompositeByteBuf setBytes(int index, byte[] src, int srcIndex, int length) {
598         wrapped.setBytes(index, src, srcIndex, length);
599         return this;
600     }
601 
602     @Override
603     public CompositeByteBuf setBytes(int index, ByteBuffer src) {
604         wrapped.setBytes(index, src);
605         return this;
606     }
607 
608     @Override
609     public CompositeByteBuf setBytes(int index, ByteBuf src, int srcIndex, int length) {
610         wrapped.setBytes(index, src, srcIndex, length);
611         return this;
612     }
613 
614     @Override
615     public int setBytes(int index, InputStream in, int length) throws IOException {
616         return wrapped.setBytes(index, in, length);
617     }
618 
619     @Override
620     public int setBytes(int index, ScatteringByteChannel in, int length) throws IOException {
621         return wrapped.setBytes(index, in, length);
622     }
623 
624     @Override
625     public ByteBuf copy(int index, int length) {
626         return wrapped.copy(index, length);
627     }
628 
629     @Override
630     public final ByteBuf component(int cIndex) {
631         return wrapped.component(cIndex);
632     }
633 
634     @Override
635     public final ByteBuf componentAtOffset(int offset) {
636         return wrapped.componentAtOffset(offset);
637     }
638 
639     @Override
640     public final ByteBuf internalComponent(int cIndex) {
641         return wrapped.internalComponent(cIndex);
642     }
643 
644     @Override
645     public final ByteBuf internalComponentAtOffset(int offset) {
646         return wrapped.internalComponentAtOffset(offset);
647     }
648 
649     @Override
650     public int nioBufferCount() {
651         return wrapped.nioBufferCount();
652     }
653 
654     @Override
655     public ByteBuffer internalNioBuffer(int index, int length) {
656         return wrapped.internalNioBuffer(index, length);
657     }
658 
659     @Override
660     public ByteBuffer nioBuffer(int index, int length) {
661         return wrapped.nioBuffer(index, length);
662     }
663 
664     @Override
665     public ByteBuffer[] nioBuffers(int index, int length) {
666         return wrapped.nioBuffers(index, length);
667     }
668 
669     @Override
670     public CompositeByteBuf consolidate() {
671         wrapped.consolidate();
672         return this;
673     }
674 
675     @Override
676     public CompositeByteBuf consolidate(int cIndex, int numComponents) {
677         wrapped.consolidate(cIndex, numComponents);
678         return this;
679     }
680 
681     @Override
682     public CompositeByteBuf discardReadComponents() {
683         wrapped.discardReadComponents();
684         return this;
685     }
686 
687     @Override
688     public CompositeByteBuf discardReadBytes() {
689         wrapped.discardReadBytes();
690         return this;
691     }
692 
693     @Override
694     public final String toString() {
695         return wrapped.toString();
696     }
697 
698     @Override
699     public final CompositeByteBuf readerIndex(int readerIndex) {
700         wrapped.readerIndex(readerIndex);
701         return this;
702     }
703 
704     @Override
705     public final CompositeByteBuf writerIndex(int writerIndex) {
706         wrapped.writerIndex(writerIndex);
707         return this;
708     }
709 
710     @Override
711     public final CompositeByteBuf setIndex(int readerIndex, int writerIndex) {
712         wrapped.setIndex(readerIndex, writerIndex);
713         return this;
714     }
715 
716     @Override
717     public final CompositeByteBuf clear() {
718         wrapped.clear();
719         return this;
720     }
721 
722     @Override
723     public final CompositeByteBuf markReaderIndex() {
724         wrapped.markReaderIndex();
725         return this;
726     }
727 
728     @Override
729     public final CompositeByteBuf resetReaderIndex() {
730         wrapped.resetReaderIndex();
731         return this;
732     }
733 
734     @Override
735     public final CompositeByteBuf markWriterIndex() {
736         wrapped.markWriterIndex();
737         return this;
738     }
739 
740     @Override
741     public final CompositeByteBuf resetWriterIndex() {
742         wrapped.resetWriterIndex();
743         return this;
744     }
745 
746     @Override
747     public CompositeByteBuf ensureWritable(int minWritableBytes) {
748         wrapped.ensureWritable(minWritableBytes);
749         return this;
750     }
751 
752     @Override
753     public CompositeByteBuf getBytes(int index, ByteBuf dst) {
754         wrapped.getBytes(index, dst);
755         return this;
756     }
757 
758     @Override
759     public CompositeByteBuf getBytes(int index, ByteBuf dst, int length) {
760         wrapped.getBytes(index, dst, length);
761         return this;
762     }
763 
764     @Override
765     public CompositeByteBuf getBytes(int index, byte[] dst) {
766         wrapped.getBytes(index, dst);
767         return this;
768     }
769 
770     @Override
771     public CompositeByteBuf setBoolean(int index, boolean value) {
772         wrapped.setBoolean(index, value);
773         return this;
774     }
775 
776     @Override
777     public CompositeByteBuf setChar(int index, int value) {
778         wrapped.setChar(index, value);
779         return this;
780     }
781 
782     @Override
783     public CompositeByteBuf setFloat(int index, float value) {
784         wrapped.setFloat(index, value);
785         return this;
786     }
787 
788     @Override
789     public CompositeByteBuf setDouble(int index, double value) {
790         wrapped.setDouble(index, value);
791         return this;
792     }
793 
794     @Override
795     public CompositeByteBuf setBytes(int index, ByteBuf src) {
796         wrapped.setBytes(index, src);
797         return this;
798     }
799 
800     @Override
801     public CompositeByteBuf setBytes(int index, ByteBuf src, int length) {
802         wrapped.setBytes(index, src, length);
803         return this;
804     }
805 
806     @Override
807     public CompositeByteBuf setBytes(int index, byte[] src) {
808         wrapped.setBytes(index, src);
809         return this;
810     }
811 
812     @Override
813     public CompositeByteBuf setZero(int index, int length) {
814         wrapped.setZero(index, length);
815         return this;
816     }
817 
818     @Override
819     public CompositeByteBuf readBytes(ByteBuf dst) {
820         wrapped.readBytes(dst);
821         return this;
822     }
823 
824     @Override
825     public CompositeByteBuf readBytes(ByteBuf dst, int length) {
826         wrapped.readBytes(dst, length);
827         return this;
828     }
829 
830     @Override
831     public CompositeByteBuf readBytes(ByteBuf dst, int dstIndex, int length) {
832         wrapped.readBytes(dst, dstIndex, length);
833         return this;
834     }
835 
836     @Override
837     public CompositeByteBuf readBytes(byte[] dst) {
838         wrapped.readBytes(dst);
839         return this;
840     }
841 
842     @Override
843     public CompositeByteBuf readBytes(byte[] dst, int dstIndex, int length) {
844         wrapped.readBytes(dst, dstIndex, length);
845         return this;
846     }
847 
848     @Override
849     public CompositeByteBuf readBytes(ByteBuffer dst) {
850         wrapped.readBytes(dst);
851         return this;
852     }
853 
854     @Override
855     public CompositeByteBuf readBytes(OutputStream out, int length) throws IOException {
856         wrapped.readBytes(out, length);
857         return this;
858     }
859 
860     @Override
861     public CompositeByteBuf skipBytes(int length) {
862         wrapped.skipBytes(length);
863         return this;
864     }
865 
866     @Override
867     public CompositeByteBuf writeBoolean(boolean value) {
868         wrapped.writeBoolean(value);
869         return this;
870     }
871 
872     @Override
873     public CompositeByteBuf writeByte(int value) {
874         wrapped.writeByte(value);
875         return this;
876     }
877 
878     @Override
879     public CompositeByteBuf writeShort(int value) {
880         wrapped.writeShort(value);
881         return this;
882     }
883 
884     @Override
885     public CompositeByteBuf writeMedium(int value) {
886         wrapped.writeMedium(value);
887         return this;
888     }
889 
890     @Override
891     public CompositeByteBuf writeInt(int value) {
892         wrapped.writeInt(value);
893         return this;
894     }
895 
896     @Override
897     public CompositeByteBuf writeLong(long value) {
898         wrapped.writeLong(value);
899         return this;
900     }
901 
902     @Override
903     public CompositeByteBuf writeChar(int value) {
904         wrapped.writeChar(value);
905         return this;
906     }
907 
908     @Override
909     public CompositeByteBuf writeFloat(float value) {
910         wrapped.writeFloat(value);
911         return this;
912     }
913 
914     @Override
915     public CompositeByteBuf writeDouble(double value) {
916         wrapped.writeDouble(value);
917         return this;
918     }
919 
920     @Override
921     public CompositeByteBuf writeBytes(ByteBuf src) {
922         wrapped.writeBytes(src);
923         return this;
924     }
925 
926     @Override
927     public CompositeByteBuf writeBytes(ByteBuf src, int length) {
928         wrapped.writeBytes(src, length);
929         return this;
930     }
931 
932     @Override
933     public CompositeByteBuf writeBytes(ByteBuf src, int srcIndex, int length) {
934         wrapped.writeBytes(src, srcIndex, length);
935         return this;
936     }
937 
938     @Override
939     public CompositeByteBuf writeBytes(byte[] src) {
940         wrapped.writeBytes(src);
941         return this;
942     }
943 
944     @Override
945     public CompositeByteBuf writeBytes(byte[] src, int srcIndex, int length) {
946         wrapped.writeBytes(src, srcIndex, length);
947         return this;
948     }
949 
950     @Override
951     public CompositeByteBuf writeBytes(ByteBuffer src) {
952         wrapped.writeBytes(src);
953         return this;
954     }
955 
956     @Override
957     public CompositeByteBuf writeZero(int length) {
958         wrapped.writeZero(length);
959         return this;
960     }
961 
962     @Override
963     public CompositeByteBuf retain(int increment) {
964         wrapped.retain(increment);
965         return this;
966     }
967 
968     @Override
969     public CompositeByteBuf retain() {
970         wrapped.retain();
971         return this;
972     }
973 
974     @Override
975     public ByteBuffer[] nioBuffers() {
976         return wrapped.nioBuffers();
977     }
978 
979     @Override
980     public CompositeByteBuf discardSomeReadBytes() {
981         wrapped.discardSomeReadBytes();
982         return this;
983     }
984 
985     @Override
986     public final void deallocate() {
987         wrapped.deallocate();
988     }
989 
990     @Override
991     public final ByteBuf unwrap() {
992         return wrapped;
993     }
994 }