001package org.hl7.fhir.r5.model;
002
003
004/*
005  Copyright (c) 2011+, HL7, Inc.
006  All rights reserved.
007  
008  Redistribution and use in source and binary forms, with or without modification, \
009  are permitted provided that the following conditions are met:
010  
011   * Redistributions of source code must retain the above copyright notice, this \
012     list of conditions and the following disclaimer.
013   * Redistributions in binary form must reproduce the above copyright notice, \
014     this list of conditions and the following disclaimer in the documentation \
015     and/or other materials provided with the distribution.
016   * Neither the name of HL7 nor the names of its contributors may be used to 
017     endorse or promote products derived from this software without specific 
018     prior written permission.
019  
020  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \
021  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \
022  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \
023  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \
024  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \
025  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \
026  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \
027  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
028  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
029  POSSIBILITY OF SUCH DAMAGE.
030  */
031
032// Generated on Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037import java.math.*;
038import org.hl7.fhir.utilities.Utilities;
039import org.hl7.fhir.r5.model.Enumerations.*;
040import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
041import org.hl7.fhir.exceptions.FHIRException;
042import org.hl7.fhir.instance.model.api.ICompositeType;
043import ca.uhn.fhir.model.api.annotation.ResourceDef;
044import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
045import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
046import ca.uhn.fhir.model.api.annotation.Child;
047import ca.uhn.fhir.model.api.annotation.ChildOrder;
048import ca.uhn.fhir.model.api.annotation.Description;
049import ca.uhn.fhir.model.api.annotation.Block;
050
051/**
052 * This resource provides: the claim details; adjudication details from the processing of a Claim; and optionally account balance information, for informing the subscriber of the benefits provided.
053 */
054@ResourceDef(name="ExplanationOfBenefit", profile="http://hl7.org/fhir/StructureDefinition/ExplanationOfBenefit")
055public class ExplanationOfBenefit extends DomainResource {
056
057    public enum ExplanationOfBenefitStatus {
058        /**
059         * The resource instance is currently in-force.
060         */
061        ACTIVE, 
062        /**
063         * The resource instance is withdrawn, rescinded or reversed.
064         */
065        CANCELLED, 
066        /**
067         * A new resource instance the contents of which is not complete.
068         */
069        DRAFT, 
070        /**
071         * The resource instance was entered in error.
072         */
073        ENTEREDINERROR, 
074        /**
075         * added to help the parsers with the generic types
076         */
077        NULL;
078        public static ExplanationOfBenefitStatus fromCode(String codeString) throws FHIRException {
079            if (codeString == null || "".equals(codeString))
080                return null;
081        if ("active".equals(codeString))
082          return ACTIVE;
083        if ("cancelled".equals(codeString))
084          return CANCELLED;
085        if ("draft".equals(codeString))
086          return DRAFT;
087        if ("entered-in-error".equals(codeString))
088          return ENTEREDINERROR;
089        if (Configuration.isAcceptInvalidEnums())
090          return null;
091        else
092          throw new FHIRException("Unknown ExplanationOfBenefitStatus code '"+codeString+"'");
093        }
094        public String toCode() {
095          switch (this) {
096            case ACTIVE: return "active";
097            case CANCELLED: return "cancelled";
098            case DRAFT: return "draft";
099            case ENTEREDINERROR: return "entered-in-error";
100            case NULL: return null;
101            default: return "?";
102          }
103        }
104        public String getSystem() {
105          switch (this) {
106            case ACTIVE: return "http://hl7.org/fhir/explanationofbenefit-status";
107            case CANCELLED: return "http://hl7.org/fhir/explanationofbenefit-status";
108            case DRAFT: return "http://hl7.org/fhir/explanationofbenefit-status";
109            case ENTEREDINERROR: return "http://hl7.org/fhir/explanationofbenefit-status";
110            case NULL: return null;
111            default: return "?";
112          }
113        }
114        public String getDefinition() {
115          switch (this) {
116            case ACTIVE: return "The resource instance is currently in-force.";
117            case CANCELLED: return "The resource instance is withdrawn, rescinded or reversed.";
118            case DRAFT: return "A new resource instance the contents of which is not complete.";
119            case ENTEREDINERROR: return "The resource instance was entered in error.";
120            case NULL: return null;
121            default: return "?";
122          }
123        }
124        public String getDisplay() {
125          switch (this) {
126            case ACTIVE: return "Active";
127            case CANCELLED: return "Cancelled";
128            case DRAFT: return "Draft";
129            case ENTEREDINERROR: return "Entered In Error";
130            case NULL: return null;
131            default: return "?";
132          }
133        }
134    }
135
136  public static class ExplanationOfBenefitStatusEnumFactory implements EnumFactory<ExplanationOfBenefitStatus> {
137    public ExplanationOfBenefitStatus fromCode(String codeString) throws IllegalArgumentException {
138      if (codeString == null || "".equals(codeString))
139            if (codeString == null || "".equals(codeString))
140                return null;
141        if ("active".equals(codeString))
142          return ExplanationOfBenefitStatus.ACTIVE;
143        if ("cancelled".equals(codeString))
144          return ExplanationOfBenefitStatus.CANCELLED;
145        if ("draft".equals(codeString))
146          return ExplanationOfBenefitStatus.DRAFT;
147        if ("entered-in-error".equals(codeString))
148          return ExplanationOfBenefitStatus.ENTEREDINERROR;
149        throw new IllegalArgumentException("Unknown ExplanationOfBenefitStatus code '"+codeString+"'");
150        }
151        public Enumeration<ExplanationOfBenefitStatus> fromType(PrimitiveType<?> code) throws FHIRException {
152          if (code == null)
153            return null;
154          if (code.isEmpty())
155            return new Enumeration<ExplanationOfBenefitStatus>(this, ExplanationOfBenefitStatus.NULL, code);
156          String codeString = ((PrimitiveType) code).asStringValue();
157          if (codeString == null || "".equals(codeString))
158            return new Enumeration<ExplanationOfBenefitStatus>(this, ExplanationOfBenefitStatus.NULL, code);
159        if ("active".equals(codeString))
160          return new Enumeration<ExplanationOfBenefitStatus>(this, ExplanationOfBenefitStatus.ACTIVE, code);
161        if ("cancelled".equals(codeString))
162          return new Enumeration<ExplanationOfBenefitStatus>(this, ExplanationOfBenefitStatus.CANCELLED, code);
163        if ("draft".equals(codeString))
164          return new Enumeration<ExplanationOfBenefitStatus>(this, ExplanationOfBenefitStatus.DRAFT, code);
165        if ("entered-in-error".equals(codeString))
166          return new Enumeration<ExplanationOfBenefitStatus>(this, ExplanationOfBenefitStatus.ENTEREDINERROR, code);
167        throw new FHIRException("Unknown ExplanationOfBenefitStatus code '"+codeString+"'");
168        }
169    public String toCode(ExplanationOfBenefitStatus code) {
170       if (code == ExplanationOfBenefitStatus.NULL)
171           return null;
172       if (code == ExplanationOfBenefitStatus.ACTIVE)
173        return "active";
174      if (code == ExplanationOfBenefitStatus.CANCELLED)
175        return "cancelled";
176      if (code == ExplanationOfBenefitStatus.DRAFT)
177        return "draft";
178      if (code == ExplanationOfBenefitStatus.ENTEREDINERROR)
179        return "entered-in-error";
180      return "?";
181   }
182    public String toSystem(ExplanationOfBenefitStatus code) {
183      return code.getSystem();
184      }
185    }
186
187    @Block()
188    public static class RelatedClaimComponent extends BackboneElement implements IBaseBackboneElement {
189        /**
190         * Reference to a related claim.
191         */
192        @Child(name = "claim", type = {Claim.class}, order=1, min=0, max=1, modifier=false, summary=false)
193        @Description(shortDefinition="Reference to the related claim", formalDefinition="Reference to a related claim." )
194        protected Reference claim;
195
196        /**
197         * A code to convey how the claims are related.
198         */
199        @Child(name = "relationship", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=false)
200        @Description(shortDefinition="How the reference claim is related", formalDefinition="A code to convey how the claims are related." )
201        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/related-claim-relationship")
202        protected CodeableConcept relationship;
203
204        /**
205         * An alternate organizational reference to the case or file to which this particular claim pertains.
206         */
207        @Child(name = "reference", type = {Identifier.class}, order=3, min=0, max=1, modifier=false, summary=false)
208        @Description(shortDefinition="File or case reference", formalDefinition="An alternate organizational reference to the case or file to which this particular claim pertains." )
209        protected Identifier reference;
210
211        private static final long serialVersionUID = 1047077926L;
212
213    /**
214     * Constructor
215     */
216      public RelatedClaimComponent() {
217        super();
218      }
219
220        /**
221         * @return {@link #claim} (Reference to a related claim.)
222         */
223        public Reference getClaim() { 
224          if (this.claim == null)
225            if (Configuration.errorOnAutoCreate())
226              throw new Error("Attempt to auto-create RelatedClaimComponent.claim");
227            else if (Configuration.doAutoCreate())
228              this.claim = new Reference(); // cc
229          return this.claim;
230        }
231
232        public boolean hasClaim() { 
233          return this.claim != null && !this.claim.isEmpty();
234        }
235
236        /**
237         * @param value {@link #claim} (Reference to a related claim.)
238         */
239        public RelatedClaimComponent setClaim(Reference value) { 
240          this.claim = value;
241          return this;
242        }
243
244        /**
245         * @return {@link #relationship} (A code to convey how the claims are related.)
246         */
247        public CodeableConcept getRelationship() { 
248          if (this.relationship == null)
249            if (Configuration.errorOnAutoCreate())
250              throw new Error("Attempt to auto-create RelatedClaimComponent.relationship");
251            else if (Configuration.doAutoCreate())
252              this.relationship = new CodeableConcept(); // cc
253          return this.relationship;
254        }
255
256        public boolean hasRelationship() { 
257          return this.relationship != null && !this.relationship.isEmpty();
258        }
259
260        /**
261         * @param value {@link #relationship} (A code to convey how the claims are related.)
262         */
263        public RelatedClaimComponent setRelationship(CodeableConcept value) { 
264          this.relationship = value;
265          return this;
266        }
267
268        /**
269         * @return {@link #reference} (An alternate organizational reference to the case or file to which this particular claim pertains.)
270         */
271        public Identifier getReference() { 
272          if (this.reference == null)
273            if (Configuration.errorOnAutoCreate())
274              throw new Error("Attempt to auto-create RelatedClaimComponent.reference");
275            else if (Configuration.doAutoCreate())
276              this.reference = new Identifier(); // cc
277          return this.reference;
278        }
279
280        public boolean hasReference() { 
281          return this.reference != null && !this.reference.isEmpty();
282        }
283
284        /**
285         * @param value {@link #reference} (An alternate organizational reference to the case or file to which this particular claim pertains.)
286         */
287        public RelatedClaimComponent setReference(Identifier value) { 
288          this.reference = value;
289          return this;
290        }
291
292        protected void listChildren(List<Property> children) {
293          super.listChildren(children);
294          children.add(new Property("claim", "Reference(Claim)", "Reference to a related claim.", 0, 1, claim));
295          children.add(new Property("relationship", "CodeableConcept", "A code to convey how the claims are related.", 0, 1, relationship));
296          children.add(new Property("reference", "Identifier", "An alternate organizational reference to the case or file to which this particular claim pertains.", 0, 1, reference));
297        }
298
299        @Override
300        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
301          switch (_hash) {
302          case 94742588: /*claim*/  return new Property("claim", "Reference(Claim)", "Reference to a related claim.", 0, 1, claim);
303          case -261851592: /*relationship*/  return new Property("relationship", "CodeableConcept", "A code to convey how the claims are related.", 0, 1, relationship);
304          case -925155509: /*reference*/  return new Property("reference", "Identifier", "An alternate organizational reference to the case or file to which this particular claim pertains.", 0, 1, reference);
305          default: return super.getNamedProperty(_hash, _name, _checkValid);
306          }
307
308        }
309
310      @Override
311      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
312        switch (hash) {
313        case 94742588: /*claim*/ return this.claim == null ? new Base[0] : new Base[] {this.claim}; // Reference
314        case -261851592: /*relationship*/ return this.relationship == null ? new Base[0] : new Base[] {this.relationship}; // CodeableConcept
315        case -925155509: /*reference*/ return this.reference == null ? new Base[0] : new Base[] {this.reference}; // Identifier
316        default: return super.getProperty(hash, name, checkValid);
317        }
318
319      }
320
321      @Override
322      public Base setProperty(int hash, String name, Base value) throws FHIRException {
323        switch (hash) {
324        case 94742588: // claim
325          this.claim = TypeConvertor.castToReference(value); // Reference
326          return value;
327        case -261851592: // relationship
328          this.relationship = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
329          return value;
330        case -925155509: // reference
331          this.reference = TypeConvertor.castToIdentifier(value); // Identifier
332          return value;
333        default: return super.setProperty(hash, name, value);
334        }
335
336      }
337
338      @Override
339      public Base setProperty(String name, Base value) throws FHIRException {
340        if (name.equals("claim")) {
341          this.claim = TypeConvertor.castToReference(value); // Reference
342        } else if (name.equals("relationship")) {
343          this.relationship = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
344        } else if (name.equals("reference")) {
345          this.reference = TypeConvertor.castToIdentifier(value); // Identifier
346        } else
347          return super.setProperty(name, value);
348        return value;
349      }
350
351  @Override
352  public void removeChild(String name, Base value) throws FHIRException {
353        if (name.equals("claim")) {
354          this.claim = null;
355        } else if (name.equals("relationship")) {
356          this.relationship = null;
357        } else if (name.equals("reference")) {
358          this.reference = null;
359        } else
360          super.removeChild(name, value);
361        
362      }
363
364      @Override
365      public Base makeProperty(int hash, String name) throws FHIRException {
366        switch (hash) {
367        case 94742588:  return getClaim();
368        case -261851592:  return getRelationship();
369        case -925155509:  return getReference();
370        default: return super.makeProperty(hash, name);
371        }
372
373      }
374
375      @Override
376      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
377        switch (hash) {
378        case 94742588: /*claim*/ return new String[] {"Reference"};
379        case -261851592: /*relationship*/ return new String[] {"CodeableConcept"};
380        case -925155509: /*reference*/ return new String[] {"Identifier"};
381        default: return super.getTypesForProperty(hash, name);
382        }
383
384      }
385
386      @Override
387      public Base addChild(String name) throws FHIRException {
388        if (name.equals("claim")) {
389          this.claim = new Reference();
390          return this.claim;
391        }
392        else if (name.equals("relationship")) {
393          this.relationship = new CodeableConcept();
394          return this.relationship;
395        }
396        else if (name.equals("reference")) {
397          this.reference = new Identifier();
398          return this.reference;
399        }
400        else
401          return super.addChild(name);
402      }
403
404      public RelatedClaimComponent copy() {
405        RelatedClaimComponent dst = new RelatedClaimComponent();
406        copyValues(dst);
407        return dst;
408      }
409
410      public void copyValues(RelatedClaimComponent dst) {
411        super.copyValues(dst);
412        dst.claim = claim == null ? null : claim.copy();
413        dst.relationship = relationship == null ? null : relationship.copy();
414        dst.reference = reference == null ? null : reference.copy();
415      }
416
417      @Override
418      public boolean equalsDeep(Base other_) {
419        if (!super.equalsDeep(other_))
420          return false;
421        if (!(other_ instanceof RelatedClaimComponent))
422          return false;
423        RelatedClaimComponent o = (RelatedClaimComponent) other_;
424        return compareDeep(claim, o.claim, true) && compareDeep(relationship, o.relationship, true) && compareDeep(reference, o.reference, true)
425          ;
426      }
427
428      @Override
429      public boolean equalsShallow(Base other_) {
430        if (!super.equalsShallow(other_))
431          return false;
432        if (!(other_ instanceof RelatedClaimComponent))
433          return false;
434        RelatedClaimComponent o = (RelatedClaimComponent) other_;
435        return true;
436      }
437
438      public boolean isEmpty() {
439        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(claim, relationship, reference
440          );
441      }
442
443  public String fhirType() {
444    return "ExplanationOfBenefit.related";
445
446  }
447
448  }
449
450    @Block()
451    public static class ExplanationOfBenefitEventComponent extends BackboneElement implements IBaseBackboneElement {
452        /**
453         * A coded event such as when a service is expected or a card printed.
454         */
455        @Child(name = "type", type = {CodeableConcept.class}, order=1, min=1, max=1, modifier=false, summary=false)
456        @Description(shortDefinition="Specific event", formalDefinition="A coded event such as when a service is expected or a card printed." )
457        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/datestype")
458        protected CodeableConcept type;
459
460        /**
461         * A date or period in the past or future indicating when the event occurred or is expectd to occur.
462         */
463        @Child(name = "when", type = {DateTimeType.class, Period.class}, order=2, min=1, max=1, modifier=false, summary=false)
464        @Description(shortDefinition="Occurance date or period", formalDefinition="A date or period in the past or future indicating when the event occurred or is expectd to occur." )
465        protected DataType when;
466
467        private static final long serialVersionUID = -634897375L;
468
469    /**
470     * Constructor
471     */
472      public ExplanationOfBenefitEventComponent() {
473        super();
474      }
475
476    /**
477     * Constructor
478     */
479      public ExplanationOfBenefitEventComponent(CodeableConcept type, DataType when) {
480        super();
481        this.setType(type);
482        this.setWhen(when);
483      }
484
485        /**
486         * @return {@link #type} (A coded event such as when a service is expected or a card printed.)
487         */
488        public CodeableConcept getType() { 
489          if (this.type == null)
490            if (Configuration.errorOnAutoCreate())
491              throw new Error("Attempt to auto-create ExplanationOfBenefitEventComponent.type");
492            else if (Configuration.doAutoCreate())
493              this.type = new CodeableConcept(); // cc
494          return this.type;
495        }
496
497        public boolean hasType() { 
498          return this.type != null && !this.type.isEmpty();
499        }
500
501        /**
502         * @param value {@link #type} (A coded event such as when a service is expected or a card printed.)
503         */
504        public ExplanationOfBenefitEventComponent setType(CodeableConcept value) { 
505          this.type = value;
506          return this;
507        }
508
509        /**
510         * @return {@link #when} (A date or period in the past or future indicating when the event occurred or is expectd to occur.)
511         */
512        public DataType getWhen() { 
513          return this.when;
514        }
515
516        /**
517         * @return {@link #when} (A date or period in the past or future indicating when the event occurred or is expectd to occur.)
518         */
519        public DateTimeType getWhenDateTimeType() throws FHIRException { 
520          if (this.when == null)
521            this.when = new DateTimeType();
522          if (!(this.when instanceof DateTimeType))
523            throw new FHIRException("Type mismatch: the type DateTimeType was expected, but "+this.when.getClass().getName()+" was encountered");
524          return (DateTimeType) this.when;
525        }
526
527        public boolean hasWhenDateTimeType() { 
528          return this != null && this.when instanceof DateTimeType;
529        }
530
531        /**
532         * @return {@link #when} (A date or period in the past or future indicating when the event occurred or is expectd to occur.)
533         */
534        public Period getWhenPeriod() throws FHIRException { 
535          if (this.when == null)
536            this.when = new Period();
537          if (!(this.when instanceof Period))
538            throw new FHIRException("Type mismatch: the type Period was expected, but "+this.when.getClass().getName()+" was encountered");
539          return (Period) this.when;
540        }
541
542        public boolean hasWhenPeriod() { 
543          return this != null && this.when instanceof Period;
544        }
545
546        public boolean hasWhen() { 
547          return this.when != null && !this.when.isEmpty();
548        }
549
550        /**
551         * @param value {@link #when} (A date or period in the past or future indicating when the event occurred or is expectd to occur.)
552         */
553        public ExplanationOfBenefitEventComponent setWhen(DataType value) { 
554          if (value != null && !(value instanceof DateTimeType || value instanceof Period))
555            throw new FHIRException("Not the right type for ExplanationOfBenefit.event.when[x]: "+value.fhirType());
556          this.when = value;
557          return this;
558        }
559
560        protected void listChildren(List<Property> children) {
561          super.listChildren(children);
562          children.add(new Property("type", "CodeableConcept", "A coded event such as when a service is expected or a card printed.", 0, 1, type));
563          children.add(new Property("when[x]", "dateTime|Period", "A date or period in the past or future indicating when the event occurred or is expectd to occur.", 0, 1, when));
564        }
565
566        @Override
567        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
568          switch (_hash) {
569          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "A coded event such as when a service is expected or a card printed.", 0, 1, type);
570          case 1312831238: /*when[x]*/  return new Property("when[x]", "dateTime|Period", "A date or period in the past or future indicating when the event occurred or is expectd to occur.", 0, 1, when);
571          case 3648314: /*when*/  return new Property("when[x]", "dateTime|Period", "A date or period in the past or future indicating when the event occurred or is expectd to occur.", 0, 1, when);
572          case -1785502475: /*whenDateTime*/  return new Property("when[x]", "dateTime", "A date or period in the past or future indicating when the event occurred or is expectd to occur.", 0, 1, when);
573          case 251476379: /*whenPeriod*/  return new Property("when[x]", "Period", "A date or period in the past or future indicating when the event occurred or is expectd to occur.", 0, 1, when);
574          default: return super.getNamedProperty(_hash, _name, _checkValid);
575          }
576
577        }
578
579      @Override
580      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
581        switch (hash) {
582        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
583        case 3648314: /*when*/ return this.when == null ? new Base[0] : new Base[] {this.when}; // DataType
584        default: return super.getProperty(hash, name, checkValid);
585        }
586
587      }
588
589      @Override
590      public Base setProperty(int hash, String name, Base value) throws FHIRException {
591        switch (hash) {
592        case 3575610: // type
593          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
594          return value;
595        case 3648314: // when
596          this.when = TypeConvertor.castToType(value); // DataType
597          return value;
598        default: return super.setProperty(hash, name, value);
599        }
600
601      }
602
603      @Override
604      public Base setProperty(String name, Base value) throws FHIRException {
605        if (name.equals("type")) {
606          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
607        } else if (name.equals("when[x]")) {
608          this.when = TypeConvertor.castToType(value); // DataType
609        } else
610          return super.setProperty(name, value);
611        return value;
612      }
613
614  @Override
615  public void removeChild(String name, Base value) throws FHIRException {
616        if (name.equals("type")) {
617          this.type = null;
618        } else if (name.equals("when[x]")) {
619          this.when = null;
620        } else
621          super.removeChild(name, value);
622        
623      }
624
625      @Override
626      public Base makeProperty(int hash, String name) throws FHIRException {
627        switch (hash) {
628        case 3575610:  return getType();
629        case 1312831238:  return getWhen();
630        case 3648314:  return getWhen();
631        default: return super.makeProperty(hash, name);
632        }
633
634      }
635
636      @Override
637      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
638        switch (hash) {
639        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
640        case 3648314: /*when*/ return new String[] {"dateTime", "Period"};
641        default: return super.getTypesForProperty(hash, name);
642        }
643
644      }
645
646      @Override
647      public Base addChild(String name) throws FHIRException {
648        if (name.equals("type")) {
649          this.type = new CodeableConcept();
650          return this.type;
651        }
652        else if (name.equals("whenDateTime")) {
653          this.when = new DateTimeType();
654          return this.when;
655        }
656        else if (name.equals("whenPeriod")) {
657          this.when = new Period();
658          return this.when;
659        }
660        else
661          return super.addChild(name);
662      }
663
664      public ExplanationOfBenefitEventComponent copy() {
665        ExplanationOfBenefitEventComponent dst = new ExplanationOfBenefitEventComponent();
666        copyValues(dst);
667        return dst;
668      }
669
670      public void copyValues(ExplanationOfBenefitEventComponent dst) {
671        super.copyValues(dst);
672        dst.type = type == null ? null : type.copy();
673        dst.when = when == null ? null : when.copy();
674      }
675
676      @Override
677      public boolean equalsDeep(Base other_) {
678        if (!super.equalsDeep(other_))
679          return false;
680        if (!(other_ instanceof ExplanationOfBenefitEventComponent))
681          return false;
682        ExplanationOfBenefitEventComponent o = (ExplanationOfBenefitEventComponent) other_;
683        return compareDeep(type, o.type, true) && compareDeep(when, o.when, true);
684      }
685
686      @Override
687      public boolean equalsShallow(Base other_) {
688        if (!super.equalsShallow(other_))
689          return false;
690        if (!(other_ instanceof ExplanationOfBenefitEventComponent))
691          return false;
692        ExplanationOfBenefitEventComponent o = (ExplanationOfBenefitEventComponent) other_;
693        return true;
694      }
695
696      public boolean isEmpty() {
697        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, when);
698      }
699
700  public String fhirType() {
701    return "ExplanationOfBenefit.event";
702
703  }
704
705  }
706
707    @Block()
708    public static class PayeeComponent extends BackboneElement implements IBaseBackboneElement {
709        /**
710         * Type of Party to be reimbursed: Subscriber, provider, other.
711         */
712        @Child(name = "type", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=false)
713        @Description(shortDefinition="Category of recipient", formalDefinition="Type of Party to be reimbursed: Subscriber, provider, other." )
714        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/payeetype")
715        protected CodeableConcept type;
716
717        /**
718         * Reference to the individual or organization to whom any payment will be made.
719         */
720        @Child(name = "party", type = {Practitioner.class, PractitionerRole.class, Organization.class, Patient.class, RelatedPerson.class}, order=2, min=0, max=1, modifier=false, summary=false)
721        @Description(shortDefinition="Recipient reference", formalDefinition="Reference to the individual or organization to whom any payment will be made." )
722        protected Reference party;
723
724        private static final long serialVersionUID = -1948897146L;
725
726    /**
727     * Constructor
728     */
729      public PayeeComponent() {
730        super();
731      }
732
733        /**
734         * @return {@link #type} (Type of Party to be reimbursed: Subscriber, provider, other.)
735         */
736        public CodeableConcept getType() { 
737          if (this.type == null)
738            if (Configuration.errorOnAutoCreate())
739              throw new Error("Attempt to auto-create PayeeComponent.type");
740            else if (Configuration.doAutoCreate())
741              this.type = new CodeableConcept(); // cc
742          return this.type;
743        }
744
745        public boolean hasType() { 
746          return this.type != null && !this.type.isEmpty();
747        }
748
749        /**
750         * @param value {@link #type} (Type of Party to be reimbursed: Subscriber, provider, other.)
751         */
752        public PayeeComponent setType(CodeableConcept value) { 
753          this.type = value;
754          return this;
755        }
756
757        /**
758         * @return {@link #party} (Reference to the individual or organization to whom any payment will be made.)
759         */
760        public Reference getParty() { 
761          if (this.party == null)
762            if (Configuration.errorOnAutoCreate())
763              throw new Error("Attempt to auto-create PayeeComponent.party");
764            else if (Configuration.doAutoCreate())
765              this.party = new Reference(); // cc
766          return this.party;
767        }
768
769        public boolean hasParty() { 
770          return this.party != null && !this.party.isEmpty();
771        }
772
773        /**
774         * @param value {@link #party} (Reference to the individual or organization to whom any payment will be made.)
775         */
776        public PayeeComponent setParty(Reference value) { 
777          this.party = value;
778          return this;
779        }
780
781        protected void listChildren(List<Property> children) {
782          super.listChildren(children);
783          children.add(new Property("type", "CodeableConcept", "Type of Party to be reimbursed: Subscriber, provider, other.", 0, 1, type));
784          children.add(new Property("party", "Reference(Practitioner|PractitionerRole|Organization|Patient|RelatedPerson)", "Reference to the individual or organization to whom any payment will be made.", 0, 1, party));
785        }
786
787        @Override
788        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
789          switch (_hash) {
790          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "Type of Party to be reimbursed: Subscriber, provider, other.", 0, 1, type);
791          case 106437350: /*party*/  return new Property("party", "Reference(Practitioner|PractitionerRole|Organization|Patient|RelatedPerson)", "Reference to the individual or organization to whom any payment will be made.", 0, 1, party);
792          default: return super.getNamedProperty(_hash, _name, _checkValid);
793          }
794
795        }
796
797      @Override
798      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
799        switch (hash) {
800        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
801        case 106437350: /*party*/ return this.party == null ? new Base[0] : new Base[] {this.party}; // Reference
802        default: return super.getProperty(hash, name, checkValid);
803        }
804
805      }
806
807      @Override
808      public Base setProperty(int hash, String name, Base value) throws FHIRException {
809        switch (hash) {
810        case 3575610: // type
811          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
812          return value;
813        case 106437350: // party
814          this.party = TypeConvertor.castToReference(value); // Reference
815          return value;
816        default: return super.setProperty(hash, name, value);
817        }
818
819      }
820
821      @Override
822      public Base setProperty(String name, Base value) throws FHIRException {
823        if (name.equals("type")) {
824          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
825        } else if (name.equals("party")) {
826          this.party = TypeConvertor.castToReference(value); // Reference
827        } else
828          return super.setProperty(name, value);
829        return value;
830      }
831
832  @Override
833  public void removeChild(String name, Base value) throws FHIRException {
834        if (name.equals("type")) {
835          this.type = null;
836        } else if (name.equals("party")) {
837          this.party = null;
838        } else
839          super.removeChild(name, value);
840        
841      }
842
843      @Override
844      public Base makeProperty(int hash, String name) throws FHIRException {
845        switch (hash) {
846        case 3575610:  return getType();
847        case 106437350:  return getParty();
848        default: return super.makeProperty(hash, name);
849        }
850
851      }
852
853      @Override
854      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
855        switch (hash) {
856        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
857        case 106437350: /*party*/ return new String[] {"Reference"};
858        default: return super.getTypesForProperty(hash, name);
859        }
860
861      }
862
863      @Override
864      public Base addChild(String name) throws FHIRException {
865        if (name.equals("type")) {
866          this.type = new CodeableConcept();
867          return this.type;
868        }
869        else if (name.equals("party")) {
870          this.party = new Reference();
871          return this.party;
872        }
873        else
874          return super.addChild(name);
875      }
876
877      public PayeeComponent copy() {
878        PayeeComponent dst = new PayeeComponent();
879        copyValues(dst);
880        return dst;
881      }
882
883      public void copyValues(PayeeComponent dst) {
884        super.copyValues(dst);
885        dst.type = type == null ? null : type.copy();
886        dst.party = party == null ? null : party.copy();
887      }
888
889      @Override
890      public boolean equalsDeep(Base other_) {
891        if (!super.equalsDeep(other_))
892          return false;
893        if (!(other_ instanceof PayeeComponent))
894          return false;
895        PayeeComponent o = (PayeeComponent) other_;
896        return compareDeep(type, o.type, true) && compareDeep(party, o.party, true);
897      }
898
899      @Override
900      public boolean equalsShallow(Base other_) {
901        if (!super.equalsShallow(other_))
902          return false;
903        if (!(other_ instanceof PayeeComponent))
904          return false;
905        PayeeComponent o = (PayeeComponent) other_;
906        return true;
907      }
908
909      public boolean isEmpty() {
910        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, party);
911      }
912
913  public String fhirType() {
914    return "ExplanationOfBenefit.payee";
915
916  }
917
918  }
919
920    @Block()
921    public static class CareTeamComponent extends BackboneElement implements IBaseBackboneElement {
922        /**
923         * A number to uniquely identify care team entries.
924         */
925        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
926        @Description(shortDefinition="Order of care team", formalDefinition="A number to uniquely identify care team entries." )
927        protected PositiveIntType sequence;
928
929        /**
930         * Member of the team who provided the product or service.
931         */
932        @Child(name = "provider", type = {Practitioner.class, PractitionerRole.class, Organization.class}, order=2, min=1, max=1, modifier=false, summary=false)
933        @Description(shortDefinition="Practitioner or organization", formalDefinition="Member of the team who provided the product or service." )
934        protected Reference provider;
935
936        /**
937         * The party who is billing and/or responsible for the claimed products or services.
938         */
939        @Child(name = "responsible", type = {BooleanType.class}, order=3, min=0, max=1, modifier=false, summary=false)
940        @Description(shortDefinition="Indicator of the lead practitioner", formalDefinition="The party who is billing and/or responsible for the claimed products or services." )
941        protected BooleanType responsible;
942
943        /**
944         * The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.
945         */
946        @Child(name = "role", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
947        @Description(shortDefinition="Function within the team", formalDefinition="The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team." )
948        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-careteamrole")
949        protected CodeableConcept role;
950
951        /**
952         * The specialization of the practitioner or provider which is applicable for this service.
953         */
954        @Child(name = "specialty", type = {CodeableConcept.class}, order=5, min=0, max=1, modifier=false, summary=false)
955        @Description(shortDefinition="Practitioner or provider specialization", formalDefinition="The specialization of the practitioner or provider which is applicable for this service." )
956        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/provider-qualification")
957        protected CodeableConcept specialty;
958
959        private static final long serialVersionUID = 1238813503L;
960
961    /**
962     * Constructor
963     */
964      public CareTeamComponent() {
965        super();
966      }
967
968    /**
969     * Constructor
970     */
971      public CareTeamComponent(int sequence, Reference provider) {
972        super();
973        this.setSequence(sequence);
974        this.setProvider(provider);
975      }
976
977        /**
978         * @return {@link #sequence} (A number to uniquely identify care team entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
979         */
980        public PositiveIntType getSequenceElement() { 
981          if (this.sequence == null)
982            if (Configuration.errorOnAutoCreate())
983              throw new Error("Attempt to auto-create CareTeamComponent.sequence");
984            else if (Configuration.doAutoCreate())
985              this.sequence = new PositiveIntType(); // bb
986          return this.sequence;
987        }
988
989        public boolean hasSequenceElement() { 
990          return this.sequence != null && !this.sequence.isEmpty();
991        }
992
993        public boolean hasSequence() { 
994          return this.sequence != null && !this.sequence.isEmpty();
995        }
996
997        /**
998         * @param value {@link #sequence} (A number to uniquely identify care team entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
999         */
1000        public CareTeamComponent setSequenceElement(PositiveIntType value) { 
1001          this.sequence = value;
1002          return this;
1003        }
1004
1005        /**
1006         * @return A number to uniquely identify care team entries.
1007         */
1008        public int getSequence() { 
1009          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
1010        }
1011
1012        /**
1013         * @param value A number to uniquely identify care team entries.
1014         */
1015        public CareTeamComponent setSequence(int value) { 
1016            if (this.sequence == null)
1017              this.sequence = new PositiveIntType();
1018            this.sequence.setValue(value);
1019          return this;
1020        }
1021
1022        /**
1023         * @return {@link #provider} (Member of the team who provided the product or service.)
1024         */
1025        public Reference getProvider() { 
1026          if (this.provider == null)
1027            if (Configuration.errorOnAutoCreate())
1028              throw new Error("Attempt to auto-create CareTeamComponent.provider");
1029            else if (Configuration.doAutoCreate())
1030              this.provider = new Reference(); // cc
1031          return this.provider;
1032        }
1033
1034        public boolean hasProvider() { 
1035          return this.provider != null && !this.provider.isEmpty();
1036        }
1037
1038        /**
1039         * @param value {@link #provider} (Member of the team who provided the product or service.)
1040         */
1041        public CareTeamComponent setProvider(Reference value) { 
1042          this.provider = value;
1043          return this;
1044        }
1045
1046        /**
1047         * @return {@link #responsible} (The party who is billing and/or responsible for the claimed products or services.). This is the underlying object with id, value and extensions. The accessor "getResponsible" gives direct access to the value
1048         */
1049        public BooleanType getResponsibleElement() { 
1050          if (this.responsible == null)
1051            if (Configuration.errorOnAutoCreate())
1052              throw new Error("Attempt to auto-create CareTeamComponent.responsible");
1053            else if (Configuration.doAutoCreate())
1054              this.responsible = new BooleanType(); // bb
1055          return this.responsible;
1056        }
1057
1058        public boolean hasResponsibleElement() { 
1059          return this.responsible != null && !this.responsible.isEmpty();
1060        }
1061
1062        public boolean hasResponsible() { 
1063          return this.responsible != null && !this.responsible.isEmpty();
1064        }
1065
1066        /**
1067         * @param value {@link #responsible} (The party who is billing and/or responsible for the claimed products or services.). This is the underlying object with id, value and extensions. The accessor "getResponsible" gives direct access to the value
1068         */
1069        public CareTeamComponent setResponsibleElement(BooleanType value) { 
1070          this.responsible = value;
1071          return this;
1072        }
1073
1074        /**
1075         * @return The party who is billing and/or responsible for the claimed products or services.
1076         */
1077        public boolean getResponsible() { 
1078          return this.responsible == null || this.responsible.isEmpty() ? false : this.responsible.getValue();
1079        }
1080
1081        /**
1082         * @param value The party who is billing and/or responsible for the claimed products or services.
1083         */
1084        public CareTeamComponent setResponsible(boolean value) { 
1085            if (this.responsible == null)
1086              this.responsible = new BooleanType();
1087            this.responsible.setValue(value);
1088          return this;
1089        }
1090
1091        /**
1092         * @return {@link #role} (The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.)
1093         */
1094        public CodeableConcept getRole() { 
1095          if (this.role == null)
1096            if (Configuration.errorOnAutoCreate())
1097              throw new Error("Attempt to auto-create CareTeamComponent.role");
1098            else if (Configuration.doAutoCreate())
1099              this.role = new CodeableConcept(); // cc
1100          return this.role;
1101        }
1102
1103        public boolean hasRole() { 
1104          return this.role != null && !this.role.isEmpty();
1105        }
1106
1107        /**
1108         * @param value {@link #role} (The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.)
1109         */
1110        public CareTeamComponent setRole(CodeableConcept value) { 
1111          this.role = value;
1112          return this;
1113        }
1114
1115        /**
1116         * @return {@link #specialty} (The specialization of the practitioner or provider which is applicable for this service.)
1117         */
1118        public CodeableConcept getSpecialty() { 
1119          if (this.specialty == null)
1120            if (Configuration.errorOnAutoCreate())
1121              throw new Error("Attempt to auto-create CareTeamComponent.specialty");
1122            else if (Configuration.doAutoCreate())
1123              this.specialty = new CodeableConcept(); // cc
1124          return this.specialty;
1125        }
1126
1127        public boolean hasSpecialty() { 
1128          return this.specialty != null && !this.specialty.isEmpty();
1129        }
1130
1131        /**
1132         * @param value {@link #specialty} (The specialization of the practitioner or provider which is applicable for this service.)
1133         */
1134        public CareTeamComponent setSpecialty(CodeableConcept value) { 
1135          this.specialty = value;
1136          return this;
1137        }
1138
1139        protected void listChildren(List<Property> children) {
1140          super.listChildren(children);
1141          children.add(new Property("sequence", "positiveInt", "A number to uniquely identify care team entries.", 0, 1, sequence));
1142          children.add(new Property("provider", "Reference(Practitioner|PractitionerRole|Organization)", "Member of the team who provided the product or service.", 0, 1, provider));
1143          children.add(new Property("responsible", "boolean", "The party who is billing and/or responsible for the claimed products or services.", 0, 1, responsible));
1144          children.add(new Property("role", "CodeableConcept", "The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.", 0, 1, role));
1145          children.add(new Property("specialty", "CodeableConcept", "The specialization of the practitioner or provider which is applicable for this service.", 0, 1, specialty));
1146        }
1147
1148        @Override
1149        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1150          switch (_hash) {
1151          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A number to uniquely identify care team entries.", 0, 1, sequence);
1152          case -987494927: /*provider*/  return new Property("provider", "Reference(Practitioner|PractitionerRole|Organization)", "Member of the team who provided the product or service.", 0, 1, provider);
1153          case 1847674614: /*responsible*/  return new Property("responsible", "boolean", "The party who is billing and/or responsible for the claimed products or services.", 0, 1, responsible);
1154          case 3506294: /*role*/  return new Property("role", "CodeableConcept", "The lead, assisting or supervising practitioner and their discipline if a multidisciplinary team.", 0, 1, role);
1155          case -1694759682: /*specialty*/  return new Property("specialty", "CodeableConcept", "The specialization of the practitioner or provider which is applicable for this service.", 0, 1, specialty);
1156          default: return super.getNamedProperty(_hash, _name, _checkValid);
1157          }
1158
1159        }
1160
1161      @Override
1162      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1163        switch (hash) {
1164        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
1165        case -987494927: /*provider*/ return this.provider == null ? new Base[0] : new Base[] {this.provider}; // Reference
1166        case 1847674614: /*responsible*/ return this.responsible == null ? new Base[0] : new Base[] {this.responsible}; // BooleanType
1167        case 3506294: /*role*/ return this.role == null ? new Base[0] : new Base[] {this.role}; // CodeableConcept
1168        case -1694759682: /*specialty*/ return this.specialty == null ? new Base[0] : new Base[] {this.specialty}; // CodeableConcept
1169        default: return super.getProperty(hash, name, checkValid);
1170        }
1171
1172      }
1173
1174      @Override
1175      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1176        switch (hash) {
1177        case 1349547969: // sequence
1178          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
1179          return value;
1180        case -987494927: // provider
1181          this.provider = TypeConvertor.castToReference(value); // Reference
1182          return value;
1183        case 1847674614: // responsible
1184          this.responsible = TypeConvertor.castToBoolean(value); // BooleanType
1185          return value;
1186        case 3506294: // role
1187          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1188          return value;
1189        case -1694759682: // specialty
1190          this.specialty = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1191          return value;
1192        default: return super.setProperty(hash, name, value);
1193        }
1194
1195      }
1196
1197      @Override
1198      public Base setProperty(String name, Base value) throws FHIRException {
1199        if (name.equals("sequence")) {
1200          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
1201        } else if (name.equals("provider")) {
1202          this.provider = TypeConvertor.castToReference(value); // Reference
1203        } else if (name.equals("responsible")) {
1204          this.responsible = TypeConvertor.castToBoolean(value); // BooleanType
1205        } else if (name.equals("role")) {
1206          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1207        } else if (name.equals("specialty")) {
1208          this.specialty = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1209        } else
1210          return super.setProperty(name, value);
1211        return value;
1212      }
1213
1214  @Override
1215  public void removeChild(String name, Base value) throws FHIRException {
1216        if (name.equals("sequence")) {
1217          this.sequence = null;
1218        } else if (name.equals("provider")) {
1219          this.provider = null;
1220        } else if (name.equals("responsible")) {
1221          this.responsible = null;
1222        } else if (name.equals("role")) {
1223          this.role = null;
1224        } else if (name.equals("specialty")) {
1225          this.specialty = null;
1226        } else
1227          super.removeChild(name, value);
1228        
1229      }
1230
1231      @Override
1232      public Base makeProperty(int hash, String name) throws FHIRException {
1233        switch (hash) {
1234        case 1349547969:  return getSequenceElement();
1235        case -987494927:  return getProvider();
1236        case 1847674614:  return getResponsibleElement();
1237        case 3506294:  return getRole();
1238        case -1694759682:  return getSpecialty();
1239        default: return super.makeProperty(hash, name);
1240        }
1241
1242      }
1243
1244      @Override
1245      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1246        switch (hash) {
1247        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
1248        case -987494927: /*provider*/ return new String[] {"Reference"};
1249        case 1847674614: /*responsible*/ return new String[] {"boolean"};
1250        case 3506294: /*role*/ return new String[] {"CodeableConcept"};
1251        case -1694759682: /*specialty*/ return new String[] {"CodeableConcept"};
1252        default: return super.getTypesForProperty(hash, name);
1253        }
1254
1255      }
1256
1257      @Override
1258      public Base addChild(String name) throws FHIRException {
1259        if (name.equals("sequence")) {
1260          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.careTeam.sequence");
1261        }
1262        else if (name.equals("provider")) {
1263          this.provider = new Reference();
1264          return this.provider;
1265        }
1266        else if (name.equals("responsible")) {
1267          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.careTeam.responsible");
1268        }
1269        else if (name.equals("role")) {
1270          this.role = new CodeableConcept();
1271          return this.role;
1272        }
1273        else if (name.equals("specialty")) {
1274          this.specialty = new CodeableConcept();
1275          return this.specialty;
1276        }
1277        else
1278          return super.addChild(name);
1279      }
1280
1281      public CareTeamComponent copy() {
1282        CareTeamComponent dst = new CareTeamComponent();
1283        copyValues(dst);
1284        return dst;
1285      }
1286
1287      public void copyValues(CareTeamComponent dst) {
1288        super.copyValues(dst);
1289        dst.sequence = sequence == null ? null : sequence.copy();
1290        dst.provider = provider == null ? null : provider.copy();
1291        dst.responsible = responsible == null ? null : responsible.copy();
1292        dst.role = role == null ? null : role.copy();
1293        dst.specialty = specialty == null ? null : specialty.copy();
1294      }
1295
1296      @Override
1297      public boolean equalsDeep(Base other_) {
1298        if (!super.equalsDeep(other_))
1299          return false;
1300        if (!(other_ instanceof CareTeamComponent))
1301          return false;
1302        CareTeamComponent o = (CareTeamComponent) other_;
1303        return compareDeep(sequence, o.sequence, true) && compareDeep(provider, o.provider, true) && compareDeep(responsible, o.responsible, true)
1304           && compareDeep(role, o.role, true) && compareDeep(specialty, o.specialty, true);
1305      }
1306
1307      @Override
1308      public boolean equalsShallow(Base other_) {
1309        if (!super.equalsShallow(other_))
1310          return false;
1311        if (!(other_ instanceof CareTeamComponent))
1312          return false;
1313        CareTeamComponent o = (CareTeamComponent) other_;
1314        return compareValues(sequence, o.sequence, true) && compareValues(responsible, o.responsible, true)
1315          ;
1316      }
1317
1318      public boolean isEmpty() {
1319        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, provider, responsible
1320          , role, specialty);
1321      }
1322
1323  public String fhirType() {
1324    return "ExplanationOfBenefit.careTeam";
1325
1326  }
1327
1328  }
1329
1330    @Block()
1331    public static class SupportingInformationComponent extends BackboneElement implements IBaseBackboneElement {
1332        /**
1333         * A number to uniquely identify supporting information entries.
1334         */
1335        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
1336        @Description(shortDefinition="Information instance identifier", formalDefinition="A number to uniquely identify supporting information entries." )
1337        protected PositiveIntType sequence;
1338
1339        /**
1340         * The general class of the information supplied: information; exception; accident, employment; onset, etc.
1341         */
1342        @Child(name = "category", type = {CodeableConcept.class}, order=2, min=1, max=1, modifier=false, summary=false)
1343        @Description(shortDefinition="Classification of the supplied information", formalDefinition="The general class of the information supplied: information; exception; accident, employment; onset, etc." )
1344        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-informationcategory")
1345        protected CodeableConcept category;
1346
1347        /**
1348         * System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.
1349         */
1350        @Child(name = "code", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=false)
1351        @Description(shortDefinition="Type of information", formalDefinition="System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought." )
1352        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-exception")
1353        protected CodeableConcept code;
1354
1355        /**
1356         * The date when or period to which this information refers.
1357         */
1358        @Child(name = "timing", type = {DateType.class, Period.class}, order=4, min=0, max=1, modifier=false, summary=false)
1359        @Description(shortDefinition="When it occurred", formalDefinition="The date when or period to which this information refers." )
1360        protected DataType timing;
1361
1362        /**
1363         * Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.
1364         */
1365        @Child(name = "value", type = {BooleanType.class, StringType.class, Quantity.class, Attachment.class, Reference.class, Identifier.class}, order=5, min=0, max=1, modifier=false, summary=false)
1366        @Description(shortDefinition="Data to be provided", formalDefinition="Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data." )
1367        protected DataType value;
1368
1369        /**
1370         * Provides the reason in the situation where a reason code is required in addition to the content.
1371         */
1372        @Child(name = "reason", type = {Coding.class}, order=6, min=0, max=1, modifier=false, summary=false)
1373        @Description(shortDefinition="Explanation for the information", formalDefinition="Provides the reason in the situation where a reason code is required in addition to the content." )
1374        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/missing-tooth-reason")
1375        protected Coding reason;
1376
1377        private static final long serialVersionUID = 1577205655L;
1378
1379    /**
1380     * Constructor
1381     */
1382      public SupportingInformationComponent() {
1383        super();
1384      }
1385
1386    /**
1387     * Constructor
1388     */
1389      public SupportingInformationComponent(int sequence, CodeableConcept category) {
1390        super();
1391        this.setSequence(sequence);
1392        this.setCategory(category);
1393      }
1394
1395        /**
1396         * @return {@link #sequence} (A number to uniquely identify supporting information entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
1397         */
1398        public PositiveIntType getSequenceElement() { 
1399          if (this.sequence == null)
1400            if (Configuration.errorOnAutoCreate())
1401              throw new Error("Attempt to auto-create SupportingInformationComponent.sequence");
1402            else if (Configuration.doAutoCreate())
1403              this.sequence = new PositiveIntType(); // bb
1404          return this.sequence;
1405        }
1406
1407        public boolean hasSequenceElement() { 
1408          return this.sequence != null && !this.sequence.isEmpty();
1409        }
1410
1411        public boolean hasSequence() { 
1412          return this.sequence != null && !this.sequence.isEmpty();
1413        }
1414
1415        /**
1416         * @param value {@link #sequence} (A number to uniquely identify supporting information entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
1417         */
1418        public SupportingInformationComponent setSequenceElement(PositiveIntType value) { 
1419          this.sequence = value;
1420          return this;
1421        }
1422
1423        /**
1424         * @return A number to uniquely identify supporting information entries.
1425         */
1426        public int getSequence() { 
1427          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
1428        }
1429
1430        /**
1431         * @param value A number to uniquely identify supporting information entries.
1432         */
1433        public SupportingInformationComponent setSequence(int value) { 
1434            if (this.sequence == null)
1435              this.sequence = new PositiveIntType();
1436            this.sequence.setValue(value);
1437          return this;
1438        }
1439
1440        /**
1441         * @return {@link #category} (The general class of the information supplied: information; exception; accident, employment; onset, etc.)
1442         */
1443        public CodeableConcept getCategory() { 
1444          if (this.category == null)
1445            if (Configuration.errorOnAutoCreate())
1446              throw new Error("Attempt to auto-create SupportingInformationComponent.category");
1447            else if (Configuration.doAutoCreate())
1448              this.category = new CodeableConcept(); // cc
1449          return this.category;
1450        }
1451
1452        public boolean hasCategory() { 
1453          return this.category != null && !this.category.isEmpty();
1454        }
1455
1456        /**
1457         * @param value {@link #category} (The general class of the information supplied: information; exception; accident, employment; onset, etc.)
1458         */
1459        public SupportingInformationComponent setCategory(CodeableConcept value) { 
1460          this.category = value;
1461          return this;
1462        }
1463
1464        /**
1465         * @return {@link #code} (System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.)
1466         */
1467        public CodeableConcept getCode() { 
1468          if (this.code == null)
1469            if (Configuration.errorOnAutoCreate())
1470              throw new Error("Attempt to auto-create SupportingInformationComponent.code");
1471            else if (Configuration.doAutoCreate())
1472              this.code = new CodeableConcept(); // cc
1473          return this.code;
1474        }
1475
1476        public boolean hasCode() { 
1477          return this.code != null && !this.code.isEmpty();
1478        }
1479
1480        /**
1481         * @param value {@link #code} (System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.)
1482         */
1483        public SupportingInformationComponent setCode(CodeableConcept value) { 
1484          this.code = value;
1485          return this;
1486        }
1487
1488        /**
1489         * @return {@link #timing} (The date when or period to which this information refers.)
1490         */
1491        public DataType getTiming() { 
1492          return this.timing;
1493        }
1494
1495        /**
1496         * @return {@link #timing} (The date when or period to which this information refers.)
1497         */
1498        public DateType getTimingDateType() throws FHIRException { 
1499          if (this.timing == null)
1500            this.timing = new DateType();
1501          if (!(this.timing instanceof DateType))
1502            throw new FHIRException("Type mismatch: the type DateType was expected, but "+this.timing.getClass().getName()+" was encountered");
1503          return (DateType) this.timing;
1504        }
1505
1506        public boolean hasTimingDateType() { 
1507          return this != null && this.timing instanceof DateType;
1508        }
1509
1510        /**
1511         * @return {@link #timing} (The date when or period to which this information refers.)
1512         */
1513        public Period getTimingPeriod() throws FHIRException { 
1514          if (this.timing == null)
1515            this.timing = new Period();
1516          if (!(this.timing instanceof Period))
1517            throw new FHIRException("Type mismatch: the type Period was expected, but "+this.timing.getClass().getName()+" was encountered");
1518          return (Period) this.timing;
1519        }
1520
1521        public boolean hasTimingPeriod() { 
1522          return this != null && this.timing instanceof Period;
1523        }
1524
1525        public boolean hasTiming() { 
1526          return this.timing != null && !this.timing.isEmpty();
1527        }
1528
1529        /**
1530         * @param value {@link #timing} (The date when or period to which this information refers.)
1531         */
1532        public SupportingInformationComponent setTiming(DataType value) { 
1533          if (value != null && !(value instanceof DateType || value instanceof Period))
1534            throw new FHIRException("Not the right type for ExplanationOfBenefit.supportingInfo.timing[x]: "+value.fhirType());
1535          this.timing = value;
1536          return this;
1537        }
1538
1539        /**
1540         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1541         */
1542        public DataType getValue() { 
1543          return this.value;
1544        }
1545
1546        /**
1547         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1548         */
1549        public BooleanType getValueBooleanType() throws FHIRException { 
1550          if (this.value == null)
1551            this.value = new BooleanType();
1552          if (!(this.value instanceof BooleanType))
1553            throw new FHIRException("Type mismatch: the type BooleanType was expected, but "+this.value.getClass().getName()+" was encountered");
1554          return (BooleanType) this.value;
1555        }
1556
1557        public boolean hasValueBooleanType() { 
1558          return this != null && this.value instanceof BooleanType;
1559        }
1560
1561        /**
1562         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1563         */
1564        public StringType getValueStringType() throws FHIRException { 
1565          if (this.value == null)
1566            this.value = new StringType();
1567          if (!(this.value instanceof StringType))
1568            throw new FHIRException("Type mismatch: the type StringType was expected, but "+this.value.getClass().getName()+" was encountered");
1569          return (StringType) this.value;
1570        }
1571
1572        public boolean hasValueStringType() { 
1573          return this != null && this.value instanceof StringType;
1574        }
1575
1576        /**
1577         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1578         */
1579        public Quantity getValueQuantity() throws FHIRException { 
1580          if (this.value == null)
1581            this.value = new Quantity();
1582          if (!(this.value instanceof Quantity))
1583            throw new FHIRException("Type mismatch: the type Quantity was expected, but "+this.value.getClass().getName()+" was encountered");
1584          return (Quantity) this.value;
1585        }
1586
1587        public boolean hasValueQuantity() { 
1588          return this != null && this.value instanceof Quantity;
1589        }
1590
1591        /**
1592         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1593         */
1594        public Attachment getValueAttachment() throws FHIRException { 
1595          if (this.value == null)
1596            this.value = new Attachment();
1597          if (!(this.value instanceof Attachment))
1598            throw new FHIRException("Type mismatch: the type Attachment was expected, but "+this.value.getClass().getName()+" was encountered");
1599          return (Attachment) this.value;
1600        }
1601
1602        public boolean hasValueAttachment() { 
1603          return this != null && this.value instanceof Attachment;
1604        }
1605
1606        /**
1607         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1608         */
1609        public Reference getValueReference() throws FHIRException { 
1610          if (this.value == null)
1611            this.value = new Reference();
1612          if (!(this.value instanceof Reference))
1613            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.value.getClass().getName()+" was encountered");
1614          return (Reference) this.value;
1615        }
1616
1617        public boolean hasValueReference() { 
1618          return this != null && this.value instanceof Reference;
1619        }
1620
1621        /**
1622         * @return {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1623         */
1624        public Identifier getValueIdentifier() throws FHIRException { 
1625          if (this.value == null)
1626            this.value = new Identifier();
1627          if (!(this.value instanceof Identifier))
1628            throw new FHIRException("Type mismatch: the type Identifier was expected, but "+this.value.getClass().getName()+" was encountered");
1629          return (Identifier) this.value;
1630        }
1631
1632        public boolean hasValueIdentifier() { 
1633          return this != null && this.value instanceof Identifier;
1634        }
1635
1636        public boolean hasValue() { 
1637          return this.value != null && !this.value.isEmpty();
1638        }
1639
1640        /**
1641         * @param value {@link #value} (Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.)
1642         */
1643        public SupportingInformationComponent setValue(DataType value) { 
1644          if (value != null && !(value instanceof BooleanType || value instanceof StringType || value instanceof Quantity || value instanceof Attachment || value instanceof Reference || value instanceof Identifier))
1645            throw new FHIRException("Not the right type for ExplanationOfBenefit.supportingInfo.value[x]: "+value.fhirType());
1646          this.value = value;
1647          return this;
1648        }
1649
1650        /**
1651         * @return {@link #reason} (Provides the reason in the situation where a reason code is required in addition to the content.)
1652         */
1653        public Coding getReason() { 
1654          if (this.reason == null)
1655            if (Configuration.errorOnAutoCreate())
1656              throw new Error("Attempt to auto-create SupportingInformationComponent.reason");
1657            else if (Configuration.doAutoCreate())
1658              this.reason = new Coding(); // cc
1659          return this.reason;
1660        }
1661
1662        public boolean hasReason() { 
1663          return this.reason != null && !this.reason.isEmpty();
1664        }
1665
1666        /**
1667         * @param value {@link #reason} (Provides the reason in the situation where a reason code is required in addition to the content.)
1668         */
1669        public SupportingInformationComponent setReason(Coding value) { 
1670          this.reason = value;
1671          return this;
1672        }
1673
1674        protected void listChildren(List<Property> children) {
1675          super.listChildren(children);
1676          children.add(new Property("sequence", "positiveInt", "A number to uniquely identify supporting information entries.", 0, 1, sequence));
1677          children.add(new Property("category", "CodeableConcept", "The general class of the information supplied: information; exception; accident, employment; onset, etc.", 0, 1, category));
1678          children.add(new Property("code", "CodeableConcept", "System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.", 0, 1, code));
1679          children.add(new Property("timing[x]", "date|Period", "The date when or period to which this information refers.", 0, 1, timing));
1680          children.add(new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)|Identifier", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value));
1681          children.add(new Property("reason", "Coding", "Provides the reason in the situation where a reason code is required in addition to the content.", 0, 1, reason));
1682        }
1683
1684        @Override
1685        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1686          switch (_hash) {
1687          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A number to uniquely identify supporting information entries.", 0, 1, sequence);
1688          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "The general class of the information supplied: information; exception; accident, employment; onset, etc.", 0, 1, category);
1689          case 3059181: /*code*/  return new Property("code", "CodeableConcept", "System and code pertaining to the specific information regarding special conditions relating to the setting, treatment or patient  for which care is sought.", 0, 1, code);
1690          case 164632566: /*timing[x]*/  return new Property("timing[x]", "date|Period", "The date when or period to which this information refers.", 0, 1, timing);
1691          case -873664438: /*timing*/  return new Property("timing[x]", "date|Period", "The date when or period to which this information refers.", 0, 1, timing);
1692          case 807935768: /*timingDate*/  return new Property("timing[x]", "date", "The date when or period to which this information refers.", 0, 1, timing);
1693          case -615615829: /*timingPeriod*/  return new Property("timing[x]", "Period", "The date when or period to which this information refers.", 0, 1, timing);
1694          case -1410166417: /*value[x]*/  return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)|Identifier", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1695          case 111972721: /*value*/  return new Property("value[x]", "boolean|string|Quantity|Attachment|Reference(Any)|Identifier", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1696          case 733421943: /*valueBoolean*/  return new Property("value[x]", "boolean", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1697          case -1424603934: /*valueString*/  return new Property("value[x]", "string", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1698          case -2029823716: /*valueQuantity*/  return new Property("value[x]", "Quantity", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1699          case -475566732: /*valueAttachment*/  return new Property("value[x]", "Attachment", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1700          case 1755241690: /*valueReference*/  return new Property("value[x]", "Reference(Any)", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1701          case -130498310: /*valueIdentifier*/  return new Property("value[x]", "Identifier", "Additional data or information such as resources, documents, images etc. including references to the data or the actual inclusion of the data.", 0, 1, value);
1702          case -934964668: /*reason*/  return new Property("reason", "Coding", "Provides the reason in the situation where a reason code is required in addition to the content.", 0, 1, reason);
1703          default: return super.getNamedProperty(_hash, _name, _checkValid);
1704          }
1705
1706        }
1707
1708      @Override
1709      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1710        switch (hash) {
1711        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
1712        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
1713        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // CodeableConcept
1714        case -873664438: /*timing*/ return this.timing == null ? new Base[0] : new Base[] {this.timing}; // DataType
1715        case 111972721: /*value*/ return this.value == null ? new Base[0] : new Base[] {this.value}; // DataType
1716        case -934964668: /*reason*/ return this.reason == null ? new Base[0] : new Base[] {this.reason}; // Coding
1717        default: return super.getProperty(hash, name, checkValid);
1718        }
1719
1720      }
1721
1722      @Override
1723      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1724        switch (hash) {
1725        case 1349547969: // sequence
1726          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
1727          return value;
1728        case 50511102: // category
1729          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1730          return value;
1731        case 3059181: // code
1732          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1733          return value;
1734        case -873664438: // timing
1735          this.timing = TypeConvertor.castToType(value); // DataType
1736          return value;
1737        case 111972721: // value
1738          this.value = TypeConvertor.castToType(value); // DataType
1739          return value;
1740        case -934964668: // reason
1741          this.reason = TypeConvertor.castToCoding(value); // Coding
1742          return value;
1743        default: return super.setProperty(hash, name, value);
1744        }
1745
1746      }
1747
1748      @Override
1749      public Base setProperty(String name, Base value) throws FHIRException {
1750        if (name.equals("sequence")) {
1751          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
1752        } else if (name.equals("category")) {
1753          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1754        } else if (name.equals("code")) {
1755          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1756        } else if (name.equals("timing[x]")) {
1757          this.timing = TypeConvertor.castToType(value); // DataType
1758        } else if (name.equals("value[x]")) {
1759          this.value = TypeConvertor.castToType(value); // DataType
1760        } else if (name.equals("reason")) {
1761          this.reason = TypeConvertor.castToCoding(value); // Coding
1762        } else
1763          return super.setProperty(name, value);
1764        return value;
1765      }
1766
1767  @Override
1768  public void removeChild(String name, Base value) throws FHIRException {
1769        if (name.equals("sequence")) {
1770          this.sequence = null;
1771        } else if (name.equals("category")) {
1772          this.category = null;
1773        } else if (name.equals("code")) {
1774          this.code = null;
1775        } else if (name.equals("timing[x]")) {
1776          this.timing = null;
1777        } else if (name.equals("value[x]")) {
1778          this.value = null;
1779        } else if (name.equals("reason")) {
1780          this.reason = null;
1781        } else
1782          super.removeChild(name, value);
1783        
1784      }
1785
1786      @Override
1787      public Base makeProperty(int hash, String name) throws FHIRException {
1788        switch (hash) {
1789        case 1349547969:  return getSequenceElement();
1790        case 50511102:  return getCategory();
1791        case 3059181:  return getCode();
1792        case 164632566:  return getTiming();
1793        case -873664438:  return getTiming();
1794        case -1410166417:  return getValue();
1795        case 111972721:  return getValue();
1796        case -934964668:  return getReason();
1797        default: return super.makeProperty(hash, name);
1798        }
1799
1800      }
1801
1802      @Override
1803      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1804        switch (hash) {
1805        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
1806        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
1807        case 3059181: /*code*/ return new String[] {"CodeableConcept"};
1808        case -873664438: /*timing*/ return new String[] {"date", "Period"};
1809        case 111972721: /*value*/ return new String[] {"boolean", "string", "Quantity", "Attachment", "Reference", "Identifier"};
1810        case -934964668: /*reason*/ return new String[] {"Coding"};
1811        default: return super.getTypesForProperty(hash, name);
1812        }
1813
1814      }
1815
1816      @Override
1817      public Base addChild(String name) throws FHIRException {
1818        if (name.equals("sequence")) {
1819          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.supportingInfo.sequence");
1820        }
1821        else if (name.equals("category")) {
1822          this.category = new CodeableConcept();
1823          return this.category;
1824        }
1825        else if (name.equals("code")) {
1826          this.code = new CodeableConcept();
1827          return this.code;
1828        }
1829        else if (name.equals("timingDate")) {
1830          this.timing = new DateType();
1831          return this.timing;
1832        }
1833        else if (name.equals("timingPeriod")) {
1834          this.timing = new Period();
1835          return this.timing;
1836        }
1837        else if (name.equals("valueBoolean")) {
1838          this.value = new BooleanType();
1839          return this.value;
1840        }
1841        else if (name.equals("valueString")) {
1842          this.value = new StringType();
1843          return this.value;
1844        }
1845        else if (name.equals("valueQuantity")) {
1846          this.value = new Quantity();
1847          return this.value;
1848        }
1849        else if (name.equals("valueAttachment")) {
1850          this.value = new Attachment();
1851          return this.value;
1852        }
1853        else if (name.equals("valueReference")) {
1854          this.value = new Reference();
1855          return this.value;
1856        }
1857        else if (name.equals("valueIdentifier")) {
1858          this.value = new Identifier();
1859          return this.value;
1860        }
1861        else if (name.equals("reason")) {
1862          this.reason = new Coding();
1863          return this.reason;
1864        }
1865        else
1866          return super.addChild(name);
1867      }
1868
1869      public SupportingInformationComponent copy() {
1870        SupportingInformationComponent dst = new SupportingInformationComponent();
1871        copyValues(dst);
1872        return dst;
1873      }
1874
1875      public void copyValues(SupportingInformationComponent dst) {
1876        super.copyValues(dst);
1877        dst.sequence = sequence == null ? null : sequence.copy();
1878        dst.category = category == null ? null : category.copy();
1879        dst.code = code == null ? null : code.copy();
1880        dst.timing = timing == null ? null : timing.copy();
1881        dst.value = value == null ? null : value.copy();
1882        dst.reason = reason == null ? null : reason.copy();
1883      }
1884
1885      @Override
1886      public boolean equalsDeep(Base other_) {
1887        if (!super.equalsDeep(other_))
1888          return false;
1889        if (!(other_ instanceof SupportingInformationComponent))
1890          return false;
1891        SupportingInformationComponent o = (SupportingInformationComponent) other_;
1892        return compareDeep(sequence, o.sequence, true) && compareDeep(category, o.category, true) && compareDeep(code, o.code, true)
1893           && compareDeep(timing, o.timing, true) && compareDeep(value, o.value, true) && compareDeep(reason, o.reason, true)
1894          ;
1895      }
1896
1897      @Override
1898      public boolean equalsShallow(Base other_) {
1899        if (!super.equalsShallow(other_))
1900          return false;
1901        if (!(other_ instanceof SupportingInformationComponent))
1902          return false;
1903        SupportingInformationComponent o = (SupportingInformationComponent) other_;
1904        return compareValues(sequence, o.sequence, true);
1905      }
1906
1907      public boolean isEmpty() {
1908        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, category, code
1909          , timing, value, reason);
1910      }
1911
1912  public String fhirType() {
1913    return "ExplanationOfBenefit.supportingInfo";
1914
1915  }
1916
1917  }
1918
1919    @Block()
1920    public static class DiagnosisComponent extends BackboneElement implements IBaseBackboneElement {
1921        /**
1922         * A number to uniquely identify diagnosis entries.
1923         */
1924        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
1925        @Description(shortDefinition="Diagnosis instance identifier", formalDefinition="A number to uniquely identify diagnosis entries." )
1926        protected PositiveIntType sequence;
1927
1928        /**
1929         * The nature of illness or problem in a coded form or as a reference to an external defined Condition.
1930         */
1931        @Child(name = "diagnosis", type = {CodeableConcept.class, Condition.class}, order=2, min=1, max=1, modifier=false, summary=false)
1932        @Description(shortDefinition="Nature of illness or problem", formalDefinition="The nature of illness or problem in a coded form or as a reference to an external defined Condition." )
1933        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/icd-10")
1934        protected DataType diagnosis;
1935
1936        /**
1937         * When the condition was observed or the relative ranking.
1938         */
1939        @Child(name = "type", type = {CodeableConcept.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1940        @Description(shortDefinition="Timing or nature of the diagnosis", formalDefinition="When the condition was observed or the relative ranking." )
1941        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-diagnosistype")
1942        protected List<CodeableConcept> type;
1943
1944        /**
1945         * Indication of whether the diagnosis was present on admission to a facility.
1946         */
1947        @Child(name = "onAdmission", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
1948        @Description(shortDefinition="Present on admission", formalDefinition="Indication of whether the diagnosis was present on admission to a facility." )
1949        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-diagnosis-on-admission")
1950        protected CodeableConcept onAdmission;
1951
1952        private static final long serialVersionUID = -320261526L;
1953
1954    /**
1955     * Constructor
1956     */
1957      public DiagnosisComponent() {
1958        super();
1959      }
1960
1961    /**
1962     * Constructor
1963     */
1964      public DiagnosisComponent(int sequence, DataType diagnosis) {
1965        super();
1966        this.setSequence(sequence);
1967        this.setDiagnosis(diagnosis);
1968      }
1969
1970        /**
1971         * @return {@link #sequence} (A number to uniquely identify diagnosis entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
1972         */
1973        public PositiveIntType getSequenceElement() { 
1974          if (this.sequence == null)
1975            if (Configuration.errorOnAutoCreate())
1976              throw new Error("Attempt to auto-create DiagnosisComponent.sequence");
1977            else if (Configuration.doAutoCreate())
1978              this.sequence = new PositiveIntType(); // bb
1979          return this.sequence;
1980        }
1981
1982        public boolean hasSequenceElement() { 
1983          return this.sequence != null && !this.sequence.isEmpty();
1984        }
1985
1986        public boolean hasSequence() { 
1987          return this.sequence != null && !this.sequence.isEmpty();
1988        }
1989
1990        /**
1991         * @param value {@link #sequence} (A number to uniquely identify diagnosis entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
1992         */
1993        public DiagnosisComponent setSequenceElement(PositiveIntType value) { 
1994          this.sequence = value;
1995          return this;
1996        }
1997
1998        /**
1999         * @return A number to uniquely identify diagnosis entries.
2000         */
2001        public int getSequence() { 
2002          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
2003        }
2004
2005        /**
2006         * @param value A number to uniquely identify diagnosis entries.
2007         */
2008        public DiagnosisComponent setSequence(int value) { 
2009            if (this.sequence == null)
2010              this.sequence = new PositiveIntType();
2011            this.sequence.setValue(value);
2012          return this;
2013        }
2014
2015        /**
2016         * @return {@link #diagnosis} (The nature of illness or problem in a coded form or as a reference to an external defined Condition.)
2017         */
2018        public DataType getDiagnosis() { 
2019          return this.diagnosis;
2020        }
2021
2022        /**
2023         * @return {@link #diagnosis} (The nature of illness or problem in a coded form or as a reference to an external defined Condition.)
2024         */
2025        public CodeableConcept getDiagnosisCodeableConcept() throws FHIRException { 
2026          if (this.diagnosis == null)
2027            this.diagnosis = new CodeableConcept();
2028          if (!(this.diagnosis instanceof CodeableConcept))
2029            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.diagnosis.getClass().getName()+" was encountered");
2030          return (CodeableConcept) this.diagnosis;
2031        }
2032
2033        public boolean hasDiagnosisCodeableConcept() { 
2034          return this != null && this.diagnosis instanceof CodeableConcept;
2035        }
2036
2037        /**
2038         * @return {@link #diagnosis} (The nature of illness or problem in a coded form or as a reference to an external defined Condition.)
2039         */
2040        public Reference getDiagnosisReference() throws FHIRException { 
2041          if (this.diagnosis == null)
2042            this.diagnosis = new Reference();
2043          if (!(this.diagnosis instanceof Reference))
2044            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.diagnosis.getClass().getName()+" was encountered");
2045          return (Reference) this.diagnosis;
2046        }
2047
2048        public boolean hasDiagnosisReference() { 
2049          return this != null && this.diagnosis instanceof Reference;
2050        }
2051
2052        public boolean hasDiagnosis() { 
2053          return this.diagnosis != null && !this.diagnosis.isEmpty();
2054        }
2055
2056        /**
2057         * @param value {@link #diagnosis} (The nature of illness or problem in a coded form or as a reference to an external defined Condition.)
2058         */
2059        public DiagnosisComponent setDiagnosis(DataType value) { 
2060          if (value != null && !(value instanceof CodeableConcept || value instanceof Reference))
2061            throw new FHIRException("Not the right type for ExplanationOfBenefit.diagnosis.diagnosis[x]: "+value.fhirType());
2062          this.diagnosis = value;
2063          return this;
2064        }
2065
2066        /**
2067         * @return {@link #type} (When the condition was observed or the relative ranking.)
2068         */
2069        public List<CodeableConcept> getType() { 
2070          if (this.type == null)
2071            this.type = new ArrayList<CodeableConcept>();
2072          return this.type;
2073        }
2074
2075        /**
2076         * @return Returns a reference to <code>this</code> for easy method chaining
2077         */
2078        public DiagnosisComponent setType(List<CodeableConcept> theType) { 
2079          this.type = theType;
2080          return this;
2081        }
2082
2083        public boolean hasType() { 
2084          if (this.type == null)
2085            return false;
2086          for (CodeableConcept item : this.type)
2087            if (!item.isEmpty())
2088              return true;
2089          return false;
2090        }
2091
2092        public CodeableConcept addType() { //3
2093          CodeableConcept t = new CodeableConcept();
2094          if (this.type == null)
2095            this.type = new ArrayList<CodeableConcept>();
2096          this.type.add(t);
2097          return t;
2098        }
2099
2100        public DiagnosisComponent addType(CodeableConcept t) { //3
2101          if (t == null)
2102            return this;
2103          if (this.type == null)
2104            this.type = new ArrayList<CodeableConcept>();
2105          this.type.add(t);
2106          return this;
2107        }
2108
2109        /**
2110         * @return The first repetition of repeating field {@link #type}, creating it if it does not already exist {3}
2111         */
2112        public CodeableConcept getTypeFirstRep() { 
2113          if (getType().isEmpty()) {
2114            addType();
2115          }
2116          return getType().get(0);
2117        }
2118
2119        /**
2120         * @return {@link #onAdmission} (Indication of whether the diagnosis was present on admission to a facility.)
2121         */
2122        public CodeableConcept getOnAdmission() { 
2123          if (this.onAdmission == null)
2124            if (Configuration.errorOnAutoCreate())
2125              throw new Error("Attempt to auto-create DiagnosisComponent.onAdmission");
2126            else if (Configuration.doAutoCreate())
2127              this.onAdmission = new CodeableConcept(); // cc
2128          return this.onAdmission;
2129        }
2130
2131        public boolean hasOnAdmission() { 
2132          return this.onAdmission != null && !this.onAdmission.isEmpty();
2133        }
2134
2135        /**
2136         * @param value {@link #onAdmission} (Indication of whether the diagnosis was present on admission to a facility.)
2137         */
2138        public DiagnosisComponent setOnAdmission(CodeableConcept value) { 
2139          this.onAdmission = value;
2140          return this;
2141        }
2142
2143        protected void listChildren(List<Property> children) {
2144          super.listChildren(children);
2145          children.add(new Property("sequence", "positiveInt", "A number to uniquely identify diagnosis entries.", 0, 1, sequence));
2146          children.add(new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)", "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0, 1, diagnosis));
2147          children.add(new Property("type", "CodeableConcept", "When the condition was observed or the relative ranking.", 0, java.lang.Integer.MAX_VALUE, type));
2148          children.add(new Property("onAdmission", "CodeableConcept", "Indication of whether the diagnosis was present on admission to a facility.", 0, 1, onAdmission));
2149        }
2150
2151        @Override
2152        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2153          switch (_hash) {
2154          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A number to uniquely identify diagnosis entries.", 0, 1, sequence);
2155          case -1487009809: /*diagnosis[x]*/  return new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)", "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0, 1, diagnosis);
2156          case 1196993265: /*diagnosis*/  return new Property("diagnosis[x]", "CodeableConcept|Reference(Condition)", "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0, 1, diagnosis);
2157          case 277781616: /*diagnosisCodeableConcept*/  return new Property("diagnosis[x]", "CodeableConcept", "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0, 1, diagnosis);
2158          case 2050454362: /*diagnosisReference*/  return new Property("diagnosis[x]", "Reference(Condition)", "The nature of illness or problem in a coded form or as a reference to an external defined Condition.", 0, 1, diagnosis);
2159          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "When the condition was observed or the relative ranking.", 0, java.lang.Integer.MAX_VALUE, type);
2160          case -3386134: /*onAdmission*/  return new Property("onAdmission", "CodeableConcept", "Indication of whether the diagnosis was present on admission to a facility.", 0, 1, onAdmission);
2161          default: return super.getNamedProperty(_hash, _name, _checkValid);
2162          }
2163
2164        }
2165
2166      @Override
2167      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2168        switch (hash) {
2169        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
2170        case 1196993265: /*diagnosis*/ return this.diagnosis == null ? new Base[0] : new Base[] {this.diagnosis}; // DataType
2171        case 3575610: /*type*/ return this.type == null ? new Base[0] : this.type.toArray(new Base[this.type.size()]); // CodeableConcept
2172        case -3386134: /*onAdmission*/ return this.onAdmission == null ? new Base[0] : new Base[] {this.onAdmission}; // CodeableConcept
2173        default: return super.getProperty(hash, name, checkValid);
2174        }
2175
2176      }
2177
2178      @Override
2179      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2180        switch (hash) {
2181        case 1349547969: // sequence
2182          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
2183          return value;
2184        case 1196993265: // diagnosis
2185          this.diagnosis = TypeConvertor.castToType(value); // DataType
2186          return value;
2187        case 3575610: // type
2188          this.getType().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
2189          return value;
2190        case -3386134: // onAdmission
2191          this.onAdmission = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2192          return value;
2193        default: return super.setProperty(hash, name, value);
2194        }
2195
2196      }
2197
2198      @Override
2199      public Base setProperty(String name, Base value) throws FHIRException {
2200        if (name.equals("sequence")) {
2201          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
2202        } else if (name.equals("diagnosis[x]")) {
2203          this.diagnosis = TypeConvertor.castToType(value); // DataType
2204        } else if (name.equals("type")) {
2205          this.getType().add(TypeConvertor.castToCodeableConcept(value));
2206        } else if (name.equals("onAdmission")) {
2207          this.onAdmission = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
2208        } else
2209          return super.setProperty(name, value);
2210        return value;
2211      }
2212
2213  @Override
2214  public void removeChild(String name, Base value) throws FHIRException {
2215        if (name.equals("sequence")) {
2216          this.sequence = null;
2217        } else if (name.equals("diagnosis[x]")) {
2218          this.diagnosis = null;
2219        } else if (name.equals("type")) {
2220          this.getType().remove(value);
2221        } else if (name.equals("onAdmission")) {
2222          this.onAdmission = null;
2223        } else
2224          super.removeChild(name, value);
2225        
2226      }
2227
2228      @Override
2229      public Base makeProperty(int hash, String name) throws FHIRException {
2230        switch (hash) {
2231        case 1349547969:  return getSequenceElement();
2232        case -1487009809:  return getDiagnosis();
2233        case 1196993265:  return getDiagnosis();
2234        case 3575610:  return addType(); 
2235        case -3386134:  return getOnAdmission();
2236        default: return super.makeProperty(hash, name);
2237        }
2238
2239      }
2240
2241      @Override
2242      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2243        switch (hash) {
2244        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
2245        case 1196993265: /*diagnosis*/ return new String[] {"CodeableConcept", "Reference"};
2246        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
2247        case -3386134: /*onAdmission*/ return new String[] {"CodeableConcept"};
2248        default: return super.getTypesForProperty(hash, name);
2249        }
2250
2251      }
2252
2253      @Override
2254      public Base addChild(String name) throws FHIRException {
2255        if (name.equals("sequence")) {
2256          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.diagnosis.sequence");
2257        }
2258        else if (name.equals("diagnosisCodeableConcept")) {
2259          this.diagnosis = new CodeableConcept();
2260          return this.diagnosis;
2261        }
2262        else if (name.equals("diagnosisReference")) {
2263          this.diagnosis = new Reference();
2264          return this.diagnosis;
2265        }
2266        else if (name.equals("type")) {
2267          return addType();
2268        }
2269        else if (name.equals("onAdmission")) {
2270          this.onAdmission = new CodeableConcept();
2271          return this.onAdmission;
2272        }
2273        else
2274          return super.addChild(name);
2275      }
2276
2277      public DiagnosisComponent copy() {
2278        DiagnosisComponent dst = new DiagnosisComponent();
2279        copyValues(dst);
2280        return dst;
2281      }
2282
2283      public void copyValues(DiagnosisComponent dst) {
2284        super.copyValues(dst);
2285        dst.sequence = sequence == null ? null : sequence.copy();
2286        dst.diagnosis = diagnosis == null ? null : diagnosis.copy();
2287        if (type != null) {
2288          dst.type = new ArrayList<CodeableConcept>();
2289          for (CodeableConcept i : type)
2290            dst.type.add(i.copy());
2291        };
2292        dst.onAdmission = onAdmission == null ? null : onAdmission.copy();
2293      }
2294
2295      @Override
2296      public boolean equalsDeep(Base other_) {
2297        if (!super.equalsDeep(other_))
2298          return false;
2299        if (!(other_ instanceof DiagnosisComponent))
2300          return false;
2301        DiagnosisComponent o = (DiagnosisComponent) other_;
2302        return compareDeep(sequence, o.sequence, true) && compareDeep(diagnosis, o.diagnosis, true) && compareDeep(type, o.type, true)
2303           && compareDeep(onAdmission, o.onAdmission, true);
2304      }
2305
2306      @Override
2307      public boolean equalsShallow(Base other_) {
2308        if (!super.equalsShallow(other_))
2309          return false;
2310        if (!(other_ instanceof DiagnosisComponent))
2311          return false;
2312        DiagnosisComponent o = (DiagnosisComponent) other_;
2313        return compareValues(sequence, o.sequence, true);
2314      }
2315
2316      public boolean isEmpty() {
2317        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, diagnosis, type
2318          , onAdmission);
2319      }
2320
2321  public String fhirType() {
2322    return "ExplanationOfBenefit.diagnosis";
2323
2324  }
2325
2326  }
2327
2328    @Block()
2329    public static class ProcedureComponent extends BackboneElement implements IBaseBackboneElement {
2330        /**
2331         * A number to uniquely identify procedure entries.
2332         */
2333        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
2334        @Description(shortDefinition="Procedure instance identifier", formalDefinition="A number to uniquely identify procedure entries." )
2335        protected PositiveIntType sequence;
2336
2337        /**
2338         * When the condition was observed or the relative ranking.
2339         */
2340        @Child(name = "type", type = {CodeableConcept.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
2341        @Description(shortDefinition="Category of Procedure", formalDefinition="When the condition was observed or the relative ranking." )
2342        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-procedure-type")
2343        protected List<CodeableConcept> type;
2344
2345        /**
2346         * Date and optionally time the procedure was performed.
2347         */
2348        @Child(name = "date", type = {DateTimeType.class}, order=3, min=0, max=1, modifier=false, summary=false)
2349        @Description(shortDefinition="When the procedure was performed", formalDefinition="Date and optionally time the procedure was performed." )
2350        protected DateTimeType date;
2351
2352        /**
2353         * The code or reference to a Procedure resource which identifies the clinical intervention performed.
2354         */
2355        @Child(name = "procedure", type = {CodeableConcept.class, Procedure.class}, order=4, min=1, max=1, modifier=false, summary=false)
2356        @Description(shortDefinition="Specific clinical procedure", formalDefinition="The code or reference to a Procedure resource which identifies the clinical intervention performed." )
2357        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/icd-10-procedures")
2358        protected DataType procedure;
2359
2360        /**
2361         * Unique Device Identifiers associated with this line item.
2362         */
2363        @Child(name = "udi", type = {Device.class}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
2364        @Description(shortDefinition="Unique device identifier", formalDefinition="Unique Device Identifiers associated with this line item." )
2365        protected List<Reference> udi;
2366
2367        private static final long serialVersionUID = 1165684715L;
2368
2369    /**
2370     * Constructor
2371     */
2372      public ProcedureComponent() {
2373        super();
2374      }
2375
2376    /**
2377     * Constructor
2378     */
2379      public ProcedureComponent(int sequence, DataType procedure) {
2380        super();
2381        this.setSequence(sequence);
2382        this.setProcedure(procedure);
2383      }
2384
2385        /**
2386         * @return {@link #sequence} (A number to uniquely identify procedure entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
2387         */
2388        public PositiveIntType getSequenceElement() { 
2389          if (this.sequence == null)
2390            if (Configuration.errorOnAutoCreate())
2391              throw new Error("Attempt to auto-create ProcedureComponent.sequence");
2392            else if (Configuration.doAutoCreate())
2393              this.sequence = new PositiveIntType(); // bb
2394          return this.sequence;
2395        }
2396
2397        public boolean hasSequenceElement() { 
2398          return this.sequence != null && !this.sequence.isEmpty();
2399        }
2400
2401        public boolean hasSequence() { 
2402          return this.sequence != null && !this.sequence.isEmpty();
2403        }
2404
2405        /**
2406         * @param value {@link #sequence} (A number to uniquely identify procedure entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
2407         */
2408        public ProcedureComponent setSequenceElement(PositiveIntType value) { 
2409          this.sequence = value;
2410          return this;
2411        }
2412
2413        /**
2414         * @return A number to uniquely identify procedure entries.
2415         */
2416        public int getSequence() { 
2417          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
2418        }
2419
2420        /**
2421         * @param value A number to uniquely identify procedure entries.
2422         */
2423        public ProcedureComponent setSequence(int value) { 
2424            if (this.sequence == null)
2425              this.sequence = new PositiveIntType();
2426            this.sequence.setValue(value);
2427          return this;
2428        }
2429
2430        /**
2431         * @return {@link #type} (When the condition was observed or the relative ranking.)
2432         */
2433        public List<CodeableConcept> getType() { 
2434          if (this.type == null)
2435            this.type = new ArrayList<CodeableConcept>();
2436          return this.type;
2437        }
2438
2439        /**
2440         * @return Returns a reference to <code>this</code> for easy method chaining
2441         */
2442        public ProcedureComponent setType(List<CodeableConcept> theType) { 
2443          this.type = theType;
2444          return this;
2445        }
2446
2447        public boolean hasType() { 
2448          if (this.type == null)
2449            return false;
2450          for (CodeableConcept item : this.type)
2451            if (!item.isEmpty())
2452              return true;
2453          return false;
2454        }
2455
2456        public CodeableConcept addType() { //3
2457          CodeableConcept t = new CodeableConcept();
2458          if (this.type == null)
2459            this.type = new ArrayList<CodeableConcept>();
2460          this.type.add(t);
2461          return t;
2462        }
2463
2464        public ProcedureComponent addType(CodeableConcept t) { //3
2465          if (t == null)
2466            return this;
2467          if (this.type == null)
2468            this.type = new ArrayList<CodeableConcept>();
2469          this.type.add(t);
2470          return this;
2471        }
2472
2473        /**
2474         * @return The first repetition of repeating field {@link #type}, creating it if it does not already exist {3}
2475         */
2476        public CodeableConcept getTypeFirstRep() { 
2477          if (getType().isEmpty()) {
2478            addType();
2479          }
2480          return getType().get(0);
2481        }
2482
2483        /**
2484         * @return {@link #date} (Date and optionally time the procedure was performed.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
2485         */
2486        public DateTimeType getDateElement() { 
2487          if (this.date == null)
2488            if (Configuration.errorOnAutoCreate())
2489              throw new Error("Attempt to auto-create ProcedureComponent.date");
2490            else if (Configuration.doAutoCreate())
2491              this.date = new DateTimeType(); // bb
2492          return this.date;
2493        }
2494
2495        public boolean hasDateElement() { 
2496          return this.date != null && !this.date.isEmpty();
2497        }
2498
2499        public boolean hasDate() { 
2500          return this.date != null && !this.date.isEmpty();
2501        }
2502
2503        /**
2504         * @param value {@link #date} (Date and optionally time the procedure was performed.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
2505         */
2506        public ProcedureComponent setDateElement(DateTimeType value) { 
2507          this.date = value;
2508          return this;
2509        }
2510
2511        /**
2512         * @return Date and optionally time the procedure was performed.
2513         */
2514        public Date getDate() { 
2515          return this.date == null ? null : this.date.getValue();
2516        }
2517
2518        /**
2519         * @param value Date and optionally time the procedure was performed.
2520         */
2521        public ProcedureComponent setDate(Date value) { 
2522          if (value == null)
2523            this.date = null;
2524          else {
2525            if (this.date == null)
2526              this.date = new DateTimeType();
2527            this.date.setValue(value);
2528          }
2529          return this;
2530        }
2531
2532        /**
2533         * @return {@link #procedure} (The code or reference to a Procedure resource which identifies the clinical intervention performed.)
2534         */
2535        public DataType getProcedure() { 
2536          return this.procedure;
2537        }
2538
2539        /**
2540         * @return {@link #procedure} (The code or reference to a Procedure resource which identifies the clinical intervention performed.)
2541         */
2542        public CodeableConcept getProcedureCodeableConcept() throws FHIRException { 
2543          if (this.procedure == null)
2544            this.procedure = new CodeableConcept();
2545          if (!(this.procedure instanceof CodeableConcept))
2546            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.procedure.getClass().getName()+" was encountered");
2547          return (CodeableConcept) this.procedure;
2548        }
2549
2550        public boolean hasProcedureCodeableConcept() { 
2551          return this != null && this.procedure instanceof CodeableConcept;
2552        }
2553
2554        /**
2555         * @return {@link #procedure} (The code or reference to a Procedure resource which identifies the clinical intervention performed.)
2556         */
2557        public Reference getProcedureReference() throws FHIRException { 
2558          if (this.procedure == null)
2559            this.procedure = new Reference();
2560          if (!(this.procedure instanceof Reference))
2561            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.procedure.getClass().getName()+" was encountered");
2562          return (Reference) this.procedure;
2563        }
2564
2565        public boolean hasProcedureReference() { 
2566          return this != null && this.procedure instanceof Reference;
2567        }
2568
2569        public boolean hasProcedure() { 
2570          return this.procedure != null && !this.procedure.isEmpty();
2571        }
2572
2573        /**
2574         * @param value {@link #procedure} (The code or reference to a Procedure resource which identifies the clinical intervention performed.)
2575         */
2576        public ProcedureComponent setProcedure(DataType value) { 
2577          if (value != null && !(value instanceof CodeableConcept || value instanceof Reference))
2578            throw new FHIRException("Not the right type for ExplanationOfBenefit.procedure.procedure[x]: "+value.fhirType());
2579          this.procedure = value;
2580          return this;
2581        }
2582
2583        /**
2584         * @return {@link #udi} (Unique Device Identifiers associated with this line item.)
2585         */
2586        public List<Reference> getUdi() { 
2587          if (this.udi == null)
2588            this.udi = new ArrayList<Reference>();
2589          return this.udi;
2590        }
2591
2592        /**
2593         * @return Returns a reference to <code>this</code> for easy method chaining
2594         */
2595        public ProcedureComponent setUdi(List<Reference> theUdi) { 
2596          this.udi = theUdi;
2597          return this;
2598        }
2599
2600        public boolean hasUdi() { 
2601          if (this.udi == null)
2602            return false;
2603          for (Reference item : this.udi)
2604            if (!item.isEmpty())
2605              return true;
2606          return false;
2607        }
2608
2609        public Reference addUdi() { //3
2610          Reference t = new Reference();
2611          if (this.udi == null)
2612            this.udi = new ArrayList<Reference>();
2613          this.udi.add(t);
2614          return t;
2615        }
2616
2617        public ProcedureComponent addUdi(Reference t) { //3
2618          if (t == null)
2619            return this;
2620          if (this.udi == null)
2621            this.udi = new ArrayList<Reference>();
2622          this.udi.add(t);
2623          return this;
2624        }
2625
2626        /**
2627         * @return The first repetition of repeating field {@link #udi}, creating it if it does not already exist {3}
2628         */
2629        public Reference getUdiFirstRep() { 
2630          if (getUdi().isEmpty()) {
2631            addUdi();
2632          }
2633          return getUdi().get(0);
2634        }
2635
2636        protected void listChildren(List<Property> children) {
2637          super.listChildren(children);
2638          children.add(new Property("sequence", "positiveInt", "A number to uniquely identify procedure entries.", 0, 1, sequence));
2639          children.add(new Property("type", "CodeableConcept", "When the condition was observed or the relative ranking.", 0, java.lang.Integer.MAX_VALUE, type));
2640          children.add(new Property("date", "dateTime", "Date and optionally time the procedure was performed.", 0, 1, date));
2641          children.add(new Property("procedure[x]", "CodeableConcept|Reference(Procedure)", "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1, procedure));
2642          children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi));
2643        }
2644
2645        @Override
2646        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
2647          switch (_hash) {
2648          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A number to uniquely identify procedure entries.", 0, 1, sequence);
2649          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "When the condition was observed or the relative ranking.", 0, java.lang.Integer.MAX_VALUE, type);
2650          case 3076014: /*date*/  return new Property("date", "dateTime", "Date and optionally time the procedure was performed.", 0, 1, date);
2651          case 1640074445: /*procedure[x]*/  return new Property("procedure[x]", "CodeableConcept|Reference(Procedure)", "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1, procedure);
2652          case -1095204141: /*procedure*/  return new Property("procedure[x]", "CodeableConcept|Reference(Procedure)", "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1, procedure);
2653          case -1284783026: /*procedureCodeableConcept*/  return new Property("procedure[x]", "CodeableConcept", "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1, procedure);
2654          case 881809848: /*procedureReference*/  return new Property("procedure[x]", "Reference(Procedure)", "The code or reference to a Procedure resource which identifies the clinical intervention performed.", 0, 1, procedure);
2655          case 115642: /*udi*/  return new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
2656          default: return super.getNamedProperty(_hash, _name, _checkValid);
2657          }
2658
2659        }
2660
2661      @Override
2662      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
2663        switch (hash) {
2664        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
2665        case 3575610: /*type*/ return this.type == null ? new Base[0] : this.type.toArray(new Base[this.type.size()]); // CodeableConcept
2666        case 3076014: /*date*/ return this.date == null ? new Base[0] : new Base[] {this.date}; // DateTimeType
2667        case -1095204141: /*procedure*/ return this.procedure == null ? new Base[0] : new Base[] {this.procedure}; // DataType
2668        case 115642: /*udi*/ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
2669        default: return super.getProperty(hash, name, checkValid);
2670        }
2671
2672      }
2673
2674      @Override
2675      public Base setProperty(int hash, String name, Base value) throws FHIRException {
2676        switch (hash) {
2677        case 1349547969: // sequence
2678          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
2679          return value;
2680        case 3575610: // type
2681          this.getType().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
2682          return value;
2683        case 3076014: // date
2684          this.date = TypeConvertor.castToDateTime(value); // DateTimeType
2685          return value;
2686        case -1095204141: // procedure
2687          this.procedure = TypeConvertor.castToType(value); // DataType
2688          return value;
2689        case 115642: // udi
2690          this.getUdi().add(TypeConvertor.castToReference(value)); // Reference
2691          return value;
2692        default: return super.setProperty(hash, name, value);
2693        }
2694
2695      }
2696
2697      @Override
2698      public Base setProperty(String name, Base value) throws FHIRException {
2699        if (name.equals("sequence")) {
2700          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
2701        } else if (name.equals("type")) {
2702          this.getType().add(TypeConvertor.castToCodeableConcept(value));
2703        } else if (name.equals("date")) {
2704          this.date = TypeConvertor.castToDateTime(value); // DateTimeType
2705        } else if (name.equals("procedure[x]")) {
2706          this.procedure = TypeConvertor.castToType(value); // DataType
2707        } else if (name.equals("udi")) {
2708          this.getUdi().add(TypeConvertor.castToReference(value));
2709        } else
2710          return super.setProperty(name, value);
2711        return value;
2712      }
2713
2714  @Override
2715  public void removeChild(String name, Base value) throws FHIRException {
2716        if (name.equals("sequence")) {
2717          this.sequence = null;
2718        } else if (name.equals("type")) {
2719          this.getType().remove(value);
2720        } else if (name.equals("date")) {
2721          this.date = null;
2722        } else if (name.equals("procedure[x]")) {
2723          this.procedure = null;
2724        } else if (name.equals("udi")) {
2725          this.getUdi().remove(value);
2726        } else
2727          super.removeChild(name, value);
2728        
2729      }
2730
2731      @Override
2732      public Base makeProperty(int hash, String name) throws FHIRException {
2733        switch (hash) {
2734        case 1349547969:  return getSequenceElement();
2735        case 3575610:  return addType(); 
2736        case 3076014:  return getDateElement();
2737        case 1640074445:  return getProcedure();
2738        case -1095204141:  return getProcedure();
2739        case 115642:  return addUdi(); 
2740        default: return super.makeProperty(hash, name);
2741        }
2742
2743      }
2744
2745      @Override
2746      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
2747        switch (hash) {
2748        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
2749        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
2750        case 3076014: /*date*/ return new String[] {"dateTime"};
2751        case -1095204141: /*procedure*/ return new String[] {"CodeableConcept", "Reference"};
2752        case 115642: /*udi*/ return new String[] {"Reference"};
2753        default: return super.getTypesForProperty(hash, name);
2754        }
2755
2756      }
2757
2758      @Override
2759      public Base addChild(String name) throws FHIRException {
2760        if (name.equals("sequence")) {
2761          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.procedure.sequence");
2762        }
2763        else if (name.equals("type")) {
2764          return addType();
2765        }
2766        else if (name.equals("date")) {
2767          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.procedure.date");
2768        }
2769        else if (name.equals("procedureCodeableConcept")) {
2770          this.procedure = new CodeableConcept();
2771          return this.procedure;
2772        }
2773        else if (name.equals("procedureReference")) {
2774          this.procedure = new Reference();
2775          return this.procedure;
2776        }
2777        else if (name.equals("udi")) {
2778          return addUdi();
2779        }
2780        else
2781          return super.addChild(name);
2782      }
2783
2784      public ProcedureComponent copy() {
2785        ProcedureComponent dst = new ProcedureComponent();
2786        copyValues(dst);
2787        return dst;
2788      }
2789
2790      public void copyValues(ProcedureComponent dst) {
2791        super.copyValues(dst);
2792        dst.sequence = sequence == null ? null : sequence.copy();
2793        if (type != null) {
2794          dst.type = new ArrayList<CodeableConcept>();
2795          for (CodeableConcept i : type)
2796            dst.type.add(i.copy());
2797        };
2798        dst.date = date == null ? null : date.copy();
2799        dst.procedure = procedure == null ? null : procedure.copy();
2800        if (udi != null) {
2801          dst.udi = new ArrayList<Reference>();
2802          for (Reference i : udi)
2803            dst.udi.add(i.copy());
2804        };
2805      }
2806
2807      @Override
2808      public boolean equalsDeep(Base other_) {
2809        if (!super.equalsDeep(other_))
2810          return false;
2811        if (!(other_ instanceof ProcedureComponent))
2812          return false;
2813        ProcedureComponent o = (ProcedureComponent) other_;
2814        return compareDeep(sequence, o.sequence, true) && compareDeep(type, o.type, true) && compareDeep(date, o.date, true)
2815           && compareDeep(procedure, o.procedure, true) && compareDeep(udi, o.udi, true);
2816      }
2817
2818      @Override
2819      public boolean equalsShallow(Base other_) {
2820        if (!super.equalsShallow(other_))
2821          return false;
2822        if (!(other_ instanceof ProcedureComponent))
2823          return false;
2824        ProcedureComponent o = (ProcedureComponent) other_;
2825        return compareValues(sequence, o.sequence, true) && compareValues(date, o.date, true);
2826      }
2827
2828      public boolean isEmpty() {
2829        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, type, date, procedure
2830          , udi);
2831      }
2832
2833  public String fhirType() {
2834    return "ExplanationOfBenefit.procedure";
2835
2836  }
2837
2838  }
2839
2840    @Block()
2841    public static class InsuranceComponent extends BackboneElement implements IBaseBackboneElement {
2842        /**
2843         * A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.
2844         */
2845        @Child(name = "focal", type = {BooleanType.class}, order=1, min=1, max=1, modifier=false, summary=true)
2846        @Description(shortDefinition="Coverage to be used for adjudication", formalDefinition="A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true." )
2847        protected BooleanType focal;
2848
2849        /**
2850         * Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.
2851         */
2852        @Child(name = "coverage", type = {Coverage.class}, order=2, min=1, max=1, modifier=false, summary=true)
2853        @Description(shortDefinition="Insurance information", formalDefinition="Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system." )
2854        protected Reference coverage;
2855
2856        /**
2857         * Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.
2858         */
2859        @Child(name = "preAuthRef", type = {StringType.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
2860        @Description(shortDefinition="Prior authorization reference number", formalDefinition="Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization." )
2861        protected List<StringType> preAuthRef;
2862
2863        private static final long serialVersionUID = 1519900285L;
2864
2865    /**
2866     * Constructor
2867     */
2868      public InsuranceComponent() {
2869        super();
2870      }
2871
2872    /**
2873     * Constructor
2874     */
2875      public InsuranceComponent(boolean focal, Reference coverage) {
2876        super();
2877        this.setFocal(focal);
2878        this.setCoverage(coverage);
2879      }
2880
2881        /**
2882         * @return {@link #focal} (A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.). This is the underlying object with id, value and extensions. The accessor "getFocal" gives direct access to the value
2883         */
2884        public BooleanType getFocalElement() { 
2885          if (this.focal == null)
2886            if (Configuration.errorOnAutoCreate())
2887              throw new Error("Attempt to auto-create InsuranceComponent.focal");
2888            else if (Configuration.doAutoCreate())
2889              this.focal = new BooleanType(); // bb
2890          return this.focal;
2891        }
2892
2893        public boolean hasFocalElement() { 
2894          return this.focal != null && !this.focal.isEmpty();
2895        }
2896
2897        public boolean hasFocal() { 
2898          return this.focal != null && !this.focal.isEmpty();
2899        }
2900
2901        /**
2902         * @param value {@link #focal} (A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.). This is the underlying object with id, value and extensions. The accessor "getFocal" gives direct access to the value
2903         */
2904        public InsuranceComponent setFocalElement(BooleanType value) { 
2905          this.focal = value;
2906          return this;
2907        }
2908
2909        /**
2910         * @return A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.
2911         */
2912        public boolean getFocal() { 
2913          return this.focal == null || this.focal.isEmpty() ? false : this.focal.getValue();
2914        }
2915
2916        /**
2917         * @param value A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.
2918         */
2919        public InsuranceComponent setFocal(boolean value) { 
2920            if (this.focal == null)
2921              this.focal = new BooleanType();
2922            this.focal.setValue(value);
2923          return this;
2924        }
2925
2926        /**
2927         * @return {@link #coverage} (Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.)
2928         */
2929        public Reference getCoverage() { 
2930          if (this.coverage == null)
2931            if (Configuration.errorOnAutoCreate())
2932              throw new Error("Attempt to auto-create InsuranceComponent.coverage");
2933            else if (Configuration.doAutoCreate())
2934              this.coverage = new Reference(); // cc
2935          return this.coverage;
2936        }
2937
2938        public boolean hasCoverage() { 
2939          return this.coverage != null && !this.coverage.isEmpty();
2940        }
2941
2942        /**
2943         * @param value {@link #coverage} (Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.)
2944         */
2945        public InsuranceComponent setCoverage(Reference value) { 
2946          this.coverage = value;
2947          return this;
2948        }
2949
2950        /**
2951         * @return {@link #preAuthRef} (Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.)
2952         */
2953        public List<StringType> getPreAuthRef() { 
2954          if (this.preAuthRef == null)
2955            this.preAuthRef = new ArrayList<StringType>();
2956          return this.preAuthRef;
2957        }
2958
2959        /**
2960         * @return Returns a reference to <code>this</code> for easy method chaining
2961         */
2962        public InsuranceComponent setPreAuthRef(List<StringType> thePreAuthRef) { 
2963          this.preAuthRef = thePreAuthRef;
2964          return this;
2965        }
2966
2967        public boolean hasPreAuthRef() { 
2968          if (this.preAuthRef == null)
2969            return false;
2970          for (StringType item : this.preAuthRef)
2971            if (!item.isEmpty())
2972              return true;
2973          return false;
2974        }
2975
2976        /**
2977         * @return {@link #preAuthRef} (Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.)
2978         */
2979        public StringType addPreAuthRefElement() {//2 
2980          StringType t = new StringType();
2981          if (this.preAuthRef == null)
2982            this.preAuthRef = new ArrayList<StringType>();
2983          this.preAuthRef.add(t);
2984          return t;
2985        }
2986
2987        /**
2988         * @param value {@link #preAuthRef} (Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.)
2989         */
2990        public InsuranceComponent addPreAuthRef(String value) { //1
2991          StringType t = new StringType();
2992          t.setValue(value);
2993          if (this.preAuthRef == null)
2994            this.preAuthRef = new ArrayList<StringType>();
2995          this.preAuthRef.add(t);
2996          return this;
2997        }
2998
2999        /**
3000         * @param value {@link #preAuthRef} (Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.)
3001         */
3002        public boolean hasPreAuthRef(String value) { 
3003          if (this.preAuthRef == null)
3004            return false;
3005          for (StringType v : this.preAuthRef)
3006            if (v.getValue().equals(value)) // string
3007              return true;
3008          return false;
3009        }
3010
3011        protected void listChildren(List<Property> children) {
3012          super.listChildren(children);
3013          children.add(new Property("focal", "boolean", "A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.", 0, 1, focal));
3014          children.add(new Property("coverage", "Reference(Coverage)", "Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.", 0, 1, coverage));
3015          children.add(new Property("preAuthRef", "string", "Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.", 0, java.lang.Integer.MAX_VALUE, preAuthRef));
3016        }
3017
3018        @Override
3019        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3020          switch (_hash) {
3021          case 97604197: /*focal*/  return new Property("focal", "boolean", "A flag to indicate that this Coverage is to be used for adjudication of this claim when set to true.", 0, 1, focal);
3022          case -351767064: /*coverage*/  return new Property("coverage", "Reference(Coverage)", "Reference to the insurance card level information contained in the Coverage resource. The coverage issuing insurer will use these details to locate the patient's actual coverage within the insurer's information system.", 0, 1, coverage);
3023          case 522246568: /*preAuthRef*/  return new Property("preAuthRef", "string", "Reference numbers previously provided by the insurer to the provider to be quoted on subsequent claims containing services or products related to the prior authorization.", 0, java.lang.Integer.MAX_VALUE, preAuthRef);
3024          default: return super.getNamedProperty(_hash, _name, _checkValid);
3025          }
3026
3027        }
3028
3029      @Override
3030      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3031        switch (hash) {
3032        case 97604197: /*focal*/ return this.focal == null ? new Base[0] : new Base[] {this.focal}; // BooleanType
3033        case -351767064: /*coverage*/ return this.coverage == null ? new Base[0] : new Base[] {this.coverage}; // Reference
3034        case 522246568: /*preAuthRef*/ return this.preAuthRef == null ? new Base[0] : this.preAuthRef.toArray(new Base[this.preAuthRef.size()]); // StringType
3035        default: return super.getProperty(hash, name, checkValid);
3036        }
3037
3038      }
3039
3040      @Override
3041      public Base setProperty(int hash, String name, Base value) throws FHIRException {
3042        switch (hash) {
3043        case 97604197: // focal
3044          this.focal = TypeConvertor.castToBoolean(value); // BooleanType
3045          return value;
3046        case -351767064: // coverage
3047          this.coverage = TypeConvertor.castToReference(value); // Reference
3048          return value;
3049        case 522246568: // preAuthRef
3050          this.getPreAuthRef().add(TypeConvertor.castToString(value)); // StringType
3051          return value;
3052        default: return super.setProperty(hash, name, value);
3053        }
3054
3055      }
3056
3057      @Override
3058      public Base setProperty(String name, Base value) throws FHIRException {
3059        if (name.equals("focal")) {
3060          this.focal = TypeConvertor.castToBoolean(value); // BooleanType
3061        } else if (name.equals("coverage")) {
3062          this.coverage = TypeConvertor.castToReference(value); // Reference
3063        } else if (name.equals("preAuthRef")) {
3064          this.getPreAuthRef().add(TypeConvertor.castToString(value));
3065        } else
3066          return super.setProperty(name, value);
3067        return value;
3068      }
3069
3070  @Override
3071  public void removeChild(String name, Base value) throws FHIRException {
3072        if (name.equals("focal")) {
3073          this.focal = null;
3074        } else if (name.equals("coverage")) {
3075          this.coverage = null;
3076        } else if (name.equals("preAuthRef")) {
3077          this.getPreAuthRef().remove(value);
3078        } else
3079          super.removeChild(name, value);
3080        
3081      }
3082
3083      @Override
3084      public Base makeProperty(int hash, String name) throws FHIRException {
3085        switch (hash) {
3086        case 97604197:  return getFocalElement();
3087        case -351767064:  return getCoverage();
3088        case 522246568:  return addPreAuthRefElement();
3089        default: return super.makeProperty(hash, name);
3090        }
3091
3092      }
3093
3094      @Override
3095      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3096        switch (hash) {
3097        case 97604197: /*focal*/ return new String[] {"boolean"};
3098        case -351767064: /*coverage*/ return new String[] {"Reference"};
3099        case 522246568: /*preAuthRef*/ return new String[] {"string"};
3100        default: return super.getTypesForProperty(hash, name);
3101        }
3102
3103      }
3104
3105      @Override
3106      public Base addChild(String name) throws FHIRException {
3107        if (name.equals("focal")) {
3108          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.insurance.focal");
3109        }
3110        else if (name.equals("coverage")) {
3111          this.coverage = new Reference();
3112          return this.coverage;
3113        }
3114        else if (name.equals("preAuthRef")) {
3115          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.insurance.preAuthRef");
3116        }
3117        else
3118          return super.addChild(name);
3119      }
3120
3121      public InsuranceComponent copy() {
3122        InsuranceComponent dst = new InsuranceComponent();
3123        copyValues(dst);
3124        return dst;
3125      }
3126
3127      public void copyValues(InsuranceComponent dst) {
3128        super.copyValues(dst);
3129        dst.focal = focal == null ? null : focal.copy();
3130        dst.coverage = coverage == null ? null : coverage.copy();
3131        if (preAuthRef != null) {
3132          dst.preAuthRef = new ArrayList<StringType>();
3133          for (StringType i : preAuthRef)
3134            dst.preAuthRef.add(i.copy());
3135        };
3136      }
3137
3138      @Override
3139      public boolean equalsDeep(Base other_) {
3140        if (!super.equalsDeep(other_))
3141          return false;
3142        if (!(other_ instanceof InsuranceComponent))
3143          return false;
3144        InsuranceComponent o = (InsuranceComponent) other_;
3145        return compareDeep(focal, o.focal, true) && compareDeep(coverage, o.coverage, true) && compareDeep(preAuthRef, o.preAuthRef, true)
3146          ;
3147      }
3148
3149      @Override
3150      public boolean equalsShallow(Base other_) {
3151        if (!super.equalsShallow(other_))
3152          return false;
3153        if (!(other_ instanceof InsuranceComponent))
3154          return false;
3155        InsuranceComponent o = (InsuranceComponent) other_;
3156        return compareValues(focal, o.focal, true) && compareValues(preAuthRef, o.preAuthRef, true);
3157      }
3158
3159      public boolean isEmpty() {
3160        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(focal, coverage, preAuthRef
3161          );
3162      }
3163
3164  public String fhirType() {
3165    return "ExplanationOfBenefit.insurance";
3166
3167  }
3168
3169  }
3170
3171    @Block()
3172    public static class AccidentComponent extends BackboneElement implements IBaseBackboneElement {
3173        /**
3174         * Date of an accident event  related to the products and services contained in the claim.
3175         */
3176        @Child(name = "date", type = {DateType.class}, order=1, min=0, max=1, modifier=false, summary=false)
3177        @Description(shortDefinition="When the incident occurred", formalDefinition="Date of an accident event  related to the products and services contained in the claim." )
3178        protected DateType date;
3179
3180        /**
3181         * The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.
3182         */
3183        @Child(name = "type", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=false)
3184        @Description(shortDefinition="The nature of the accident", formalDefinition="The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers." )
3185        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://terminology.hl7.org/ValueSet/v3-ActIncidentCode")
3186        protected CodeableConcept type;
3187
3188        /**
3189         * The physical location of the accident event.
3190         */
3191        @Child(name = "location", type = {Address.class, Location.class}, order=3, min=0, max=1, modifier=false, summary=false)
3192        @Description(shortDefinition="Where the event occurred", formalDefinition="The physical location of the accident event." )
3193        protected DataType location;
3194
3195        private static final long serialVersionUID = 11882722L;
3196
3197    /**
3198     * Constructor
3199     */
3200      public AccidentComponent() {
3201        super();
3202      }
3203
3204        /**
3205         * @return {@link #date} (Date of an accident event  related to the products and services contained in the claim.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
3206         */
3207        public DateType getDateElement() { 
3208          if (this.date == null)
3209            if (Configuration.errorOnAutoCreate())
3210              throw new Error("Attempt to auto-create AccidentComponent.date");
3211            else if (Configuration.doAutoCreate())
3212              this.date = new DateType(); // bb
3213          return this.date;
3214        }
3215
3216        public boolean hasDateElement() { 
3217          return this.date != null && !this.date.isEmpty();
3218        }
3219
3220        public boolean hasDate() { 
3221          return this.date != null && !this.date.isEmpty();
3222        }
3223
3224        /**
3225         * @param value {@link #date} (Date of an accident event  related to the products and services contained in the claim.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
3226         */
3227        public AccidentComponent setDateElement(DateType value) { 
3228          this.date = value;
3229          return this;
3230        }
3231
3232        /**
3233         * @return Date of an accident event  related to the products and services contained in the claim.
3234         */
3235        public Date getDate() { 
3236          return this.date == null ? null : this.date.getValue();
3237        }
3238
3239        /**
3240         * @param value Date of an accident event  related to the products and services contained in the claim.
3241         */
3242        public AccidentComponent setDate(Date value) { 
3243          if (value == null)
3244            this.date = null;
3245          else {
3246            if (this.date == null)
3247              this.date = new DateType();
3248            this.date.setValue(value);
3249          }
3250          return this;
3251        }
3252
3253        /**
3254         * @return {@link #type} (The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.)
3255         */
3256        public CodeableConcept getType() { 
3257          if (this.type == null)
3258            if (Configuration.errorOnAutoCreate())
3259              throw new Error("Attempt to auto-create AccidentComponent.type");
3260            else if (Configuration.doAutoCreate())
3261              this.type = new CodeableConcept(); // cc
3262          return this.type;
3263        }
3264
3265        public boolean hasType() { 
3266          return this.type != null && !this.type.isEmpty();
3267        }
3268
3269        /**
3270         * @param value {@link #type} (The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.)
3271         */
3272        public AccidentComponent setType(CodeableConcept value) { 
3273          this.type = value;
3274          return this;
3275        }
3276
3277        /**
3278         * @return {@link #location} (The physical location of the accident event.)
3279         */
3280        public DataType getLocation() { 
3281          return this.location;
3282        }
3283
3284        /**
3285         * @return {@link #location} (The physical location of the accident event.)
3286         */
3287        public Address getLocationAddress() throws FHIRException { 
3288          if (this.location == null)
3289            this.location = new Address();
3290          if (!(this.location instanceof Address))
3291            throw new FHIRException("Type mismatch: the type Address was expected, but "+this.location.getClass().getName()+" was encountered");
3292          return (Address) this.location;
3293        }
3294
3295        public boolean hasLocationAddress() { 
3296          return this != null && this.location instanceof Address;
3297        }
3298
3299        /**
3300         * @return {@link #location} (The physical location of the accident event.)
3301         */
3302        public Reference getLocationReference() throws FHIRException { 
3303          if (this.location == null)
3304            this.location = new Reference();
3305          if (!(this.location instanceof Reference))
3306            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.location.getClass().getName()+" was encountered");
3307          return (Reference) this.location;
3308        }
3309
3310        public boolean hasLocationReference() { 
3311          return this != null && this.location instanceof Reference;
3312        }
3313
3314        public boolean hasLocation() { 
3315          return this.location != null && !this.location.isEmpty();
3316        }
3317
3318        /**
3319         * @param value {@link #location} (The physical location of the accident event.)
3320         */
3321        public AccidentComponent setLocation(DataType value) { 
3322          if (value != null && !(value instanceof Address || value instanceof Reference))
3323            throw new FHIRException("Not the right type for ExplanationOfBenefit.accident.location[x]: "+value.fhirType());
3324          this.location = value;
3325          return this;
3326        }
3327
3328        protected void listChildren(List<Property> children) {
3329          super.listChildren(children);
3330          children.add(new Property("date", "date", "Date of an accident event  related to the products and services contained in the claim.", 0, 1, date));
3331          children.add(new Property("type", "CodeableConcept", "The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.", 0, 1, type));
3332          children.add(new Property("location[x]", "Address|Reference(Location)", "The physical location of the accident event.", 0, 1, location));
3333        }
3334
3335        @Override
3336        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3337          switch (_hash) {
3338          case 3076014: /*date*/  return new Property("date", "date", "Date of an accident event  related to the products and services contained in the claim.", 0, 1, date);
3339          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "The type or context of the accident event for the purposes of selection of potential insurance coverages and determination of coordination between insurers.", 0, 1, type);
3340          case 552316075: /*location[x]*/  return new Property("location[x]", "Address|Reference(Location)", "The physical location of the accident event.", 0, 1, location);
3341          case 1901043637: /*location*/  return new Property("location[x]", "Address|Reference(Location)", "The physical location of the accident event.", 0, 1, location);
3342          case -1280020865: /*locationAddress*/  return new Property("location[x]", "Address", "The physical location of the accident event.", 0, 1, location);
3343          case 755866390: /*locationReference*/  return new Property("location[x]", "Reference(Location)", "The physical location of the accident event.", 0, 1, location);
3344          default: return super.getNamedProperty(_hash, _name, _checkValid);
3345          }
3346
3347        }
3348
3349      @Override
3350      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3351        switch (hash) {
3352        case 3076014: /*date*/ return this.date == null ? new Base[0] : new Base[] {this.date}; // DateType
3353        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
3354        case 1901043637: /*location*/ return this.location == null ? new Base[0] : new Base[] {this.location}; // DataType
3355        default: return super.getProperty(hash, name, checkValid);
3356        }
3357
3358      }
3359
3360      @Override
3361      public Base setProperty(int hash, String name, Base value) throws FHIRException {
3362        switch (hash) {
3363        case 3076014: // date
3364          this.date = TypeConvertor.castToDate(value); // DateType
3365          return value;
3366        case 3575610: // type
3367          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3368          return value;
3369        case 1901043637: // location
3370          this.location = TypeConvertor.castToType(value); // DataType
3371          return value;
3372        default: return super.setProperty(hash, name, value);
3373        }
3374
3375      }
3376
3377      @Override
3378      public Base setProperty(String name, Base value) throws FHIRException {
3379        if (name.equals("date")) {
3380          this.date = TypeConvertor.castToDate(value); // DateType
3381        } else if (name.equals("type")) {
3382          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3383        } else if (name.equals("location[x]")) {
3384          this.location = TypeConvertor.castToType(value); // DataType
3385        } else
3386          return super.setProperty(name, value);
3387        return value;
3388      }
3389
3390  @Override
3391  public void removeChild(String name, Base value) throws FHIRException {
3392        if (name.equals("date")) {
3393          this.date = null;
3394        } else if (name.equals("type")) {
3395          this.type = null;
3396        } else if (name.equals("location[x]")) {
3397          this.location = null;
3398        } else
3399          super.removeChild(name, value);
3400        
3401      }
3402
3403      @Override
3404      public Base makeProperty(int hash, String name) throws FHIRException {
3405        switch (hash) {
3406        case 3076014:  return getDateElement();
3407        case 3575610:  return getType();
3408        case 552316075:  return getLocation();
3409        case 1901043637:  return getLocation();
3410        default: return super.makeProperty(hash, name);
3411        }
3412
3413      }
3414
3415      @Override
3416      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3417        switch (hash) {
3418        case 3076014: /*date*/ return new String[] {"date"};
3419        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
3420        case 1901043637: /*location*/ return new String[] {"Address", "Reference"};
3421        default: return super.getTypesForProperty(hash, name);
3422        }
3423
3424      }
3425
3426      @Override
3427      public Base addChild(String name) throws FHIRException {
3428        if (name.equals("date")) {
3429          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.accident.date");
3430        }
3431        else if (name.equals("type")) {
3432          this.type = new CodeableConcept();
3433          return this.type;
3434        }
3435        else if (name.equals("locationAddress")) {
3436          this.location = new Address();
3437          return this.location;
3438        }
3439        else if (name.equals("locationReference")) {
3440          this.location = new Reference();
3441          return this.location;
3442        }
3443        else
3444          return super.addChild(name);
3445      }
3446
3447      public AccidentComponent copy() {
3448        AccidentComponent dst = new AccidentComponent();
3449        copyValues(dst);
3450        return dst;
3451      }
3452
3453      public void copyValues(AccidentComponent dst) {
3454        super.copyValues(dst);
3455        dst.date = date == null ? null : date.copy();
3456        dst.type = type == null ? null : type.copy();
3457        dst.location = location == null ? null : location.copy();
3458      }
3459
3460      @Override
3461      public boolean equalsDeep(Base other_) {
3462        if (!super.equalsDeep(other_))
3463          return false;
3464        if (!(other_ instanceof AccidentComponent))
3465          return false;
3466        AccidentComponent o = (AccidentComponent) other_;
3467        return compareDeep(date, o.date, true) && compareDeep(type, o.type, true) && compareDeep(location, o.location, true)
3468          ;
3469      }
3470
3471      @Override
3472      public boolean equalsShallow(Base other_) {
3473        if (!super.equalsShallow(other_))
3474          return false;
3475        if (!(other_ instanceof AccidentComponent))
3476          return false;
3477        AccidentComponent o = (AccidentComponent) other_;
3478        return compareValues(date, o.date, true);
3479      }
3480
3481      public boolean isEmpty() {
3482        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(date, type, location);
3483      }
3484
3485  public String fhirType() {
3486    return "ExplanationOfBenefit.accident";
3487
3488  }
3489
3490  }
3491
3492    @Block()
3493    public static class ItemComponent extends BackboneElement implements IBaseBackboneElement {
3494        /**
3495         * A number to uniquely identify item entries.
3496         */
3497        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
3498        @Description(shortDefinition="Item instance identifier", formalDefinition="A number to uniquely identify item entries." )
3499        protected PositiveIntType sequence;
3500
3501        /**
3502         * Care team members related to this service or product.
3503         */
3504        @Child(name = "careTeamSequence", type = {PositiveIntType.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3505        @Description(shortDefinition="Applicable care team members", formalDefinition="Care team members related to this service or product." )
3506        protected List<PositiveIntType> careTeamSequence;
3507
3508        /**
3509         * Diagnoses applicable for this service or product.
3510         */
3511        @Child(name = "diagnosisSequence", type = {PositiveIntType.class}, order=3, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3512        @Description(shortDefinition="Applicable diagnoses", formalDefinition="Diagnoses applicable for this service or product." )
3513        protected List<PositiveIntType> diagnosisSequence;
3514
3515        /**
3516         * Procedures applicable for this service or product.
3517         */
3518        @Child(name = "procedureSequence", type = {PositiveIntType.class}, order=4, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3519        @Description(shortDefinition="Applicable procedures", formalDefinition="Procedures applicable for this service or product." )
3520        protected List<PositiveIntType> procedureSequence;
3521
3522        /**
3523         * Exceptions, special conditions and supporting information applicable for this service or product.
3524         */
3525        @Child(name = "informationSequence", type = {PositiveIntType.class}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3526        @Description(shortDefinition="Applicable exception and supporting information", formalDefinition="Exceptions, special conditions and supporting information applicable for this service or product." )
3527        protected List<PositiveIntType> informationSequence;
3528
3529        /**
3530         * Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.
3531         */
3532        @Child(name = "traceNumber", type = {Identifier.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3533        @Description(shortDefinition="Number for tracking", formalDefinition="Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners." )
3534        protected List<Identifier> traceNumber;
3535
3536        /**
3537         * The type of revenue or cost center providing the product and/or service.
3538         */
3539        @Child(name = "revenue", type = {CodeableConcept.class}, order=7, min=0, max=1, modifier=false, summary=false)
3540        @Description(shortDefinition="Revenue or cost center code", formalDefinition="The type of revenue or cost center providing the product and/or service." )
3541        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-revenue-center")
3542        protected CodeableConcept revenue;
3543
3544        /**
3545         * Code to identify the general type of benefits under which products and services are provided.
3546         */
3547        @Child(name = "category", type = {CodeableConcept.class}, order=8, min=0, max=1, modifier=false, summary=false)
3548        @Description(shortDefinition="Benefit classification", formalDefinition="Code to identify the general type of benefits under which products and services are provided." )
3549        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-benefitcategory")
3550        protected CodeableConcept category;
3551
3552        /**
3553         * When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.
3554         */
3555        @Child(name = "productOrService", type = {CodeableConcept.class}, order=9, min=0, max=1, modifier=false, summary=false)
3556        @Description(shortDefinition="Billing, service, product, or drug code", formalDefinition="When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used." )
3557        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-uscls")
3558        protected CodeableConcept productOrService;
3559
3560        /**
3561         * This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.
3562         */
3563        @Child(name = "productOrServiceEnd", type = {CodeableConcept.class}, order=10, min=0, max=1, modifier=false, summary=false)
3564        @Description(shortDefinition="End of a range of codes", formalDefinition="This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims." )
3565        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-uscls")
3566        protected CodeableConcept productOrServiceEnd;
3567
3568        /**
3569         * Request or Referral for Goods or Service to be rendered.
3570         */
3571        @Child(name = "request", type = {DeviceRequest.class, MedicationRequest.class, NutritionOrder.class, ServiceRequest.class, SupplyRequest.class, VisionPrescription.class}, order=11, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3572        @Description(shortDefinition="Request or Referral for Service", formalDefinition="Request or Referral for Goods or Service to be rendered." )
3573        protected List<Reference> request;
3574
3575        /**
3576         * Item typification or modifiers codes to convey additional context for the product or service.
3577         */
3578        @Child(name = "modifier", type = {CodeableConcept.class}, order=12, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3579        @Description(shortDefinition="Product or service billing modifiers", formalDefinition="Item typification or modifiers codes to convey additional context for the product or service." )
3580        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-modifiers")
3581        protected List<CodeableConcept> modifier;
3582
3583        /**
3584         * Identifies the program under which this may be recovered.
3585         */
3586        @Child(name = "programCode", type = {CodeableConcept.class}, order=13, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3587        @Description(shortDefinition="Program the product or service is provided under", formalDefinition="Identifies the program under which this may be recovered." )
3588        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-program-code")
3589        protected List<CodeableConcept> programCode;
3590
3591        /**
3592         * The date or dates when the service or product was supplied, performed or completed.
3593         */
3594        @Child(name = "serviced", type = {DateType.class, Period.class}, order=14, min=0, max=1, modifier=false, summary=false)
3595        @Description(shortDefinition="Date or dates of service or product delivery", formalDefinition="The date or dates when the service or product was supplied, performed or completed." )
3596        protected DataType serviced;
3597
3598        /**
3599         * Where the product or service was provided.
3600         */
3601        @Child(name = "location", type = {CodeableConcept.class, Address.class, Location.class}, order=15, min=0, max=1, modifier=false, summary=false)
3602        @Description(shortDefinition="Place of service or where product was supplied", formalDefinition="Where the product or service was provided." )
3603        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-place")
3604        protected DataType location;
3605
3606        /**
3607         * The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.
3608         */
3609        @Child(name = "patientPaid", type = {Money.class}, order=16, min=0, max=1, modifier=false, summary=false)
3610        @Description(shortDefinition="Paid by the patient", formalDefinition="The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services." )
3611        protected Money patientPaid;
3612
3613        /**
3614         * The number of repetitions of a service or product.
3615         */
3616        @Child(name = "quantity", type = {Quantity.class}, order=17, min=0, max=1, modifier=false, summary=false)
3617        @Description(shortDefinition="Count of products or services", formalDefinition="The number of repetitions of a service or product." )
3618        protected Quantity quantity;
3619
3620        /**
3621         * If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.
3622         */
3623        @Child(name = "unitPrice", type = {Money.class}, order=18, min=0, max=1, modifier=false, summary=false)
3624        @Description(shortDefinition="Fee, charge or cost per item", formalDefinition="If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group." )
3625        protected Money unitPrice;
3626
3627        /**
3628         * A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
3629         */
3630        @Child(name = "factor", type = {DecimalType.class}, order=19, min=0, max=1, modifier=false, summary=false)
3631        @Description(shortDefinition="Price scaling factor", formalDefinition="A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount." )
3632        protected DecimalType factor;
3633
3634        /**
3635         * The total of taxes applicable for this product or service.
3636         */
3637        @Child(name = "tax", type = {Money.class}, order=20, min=0, max=1, modifier=false, summary=false)
3638        @Description(shortDefinition="Total tax", formalDefinition="The total of taxes applicable for this product or service." )
3639        protected Money tax;
3640
3641        /**
3642         * The total amount claimed for the group (if a grouper) or the line item. Net = unit price * quantity * factor.
3643         */
3644        @Child(name = "net", type = {Money.class}, order=21, min=0, max=1, modifier=false, summary=false)
3645        @Description(shortDefinition="Total item cost", formalDefinition="The total amount claimed for the group (if a grouper) or the line item. Net = unit price * quantity * factor." )
3646        protected Money net;
3647
3648        /**
3649         * Unique Device Identifiers associated with this line item.
3650         */
3651        @Child(name = "udi", type = {Device.class}, order=22, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3652        @Description(shortDefinition="Unique device identifier", formalDefinition="Unique Device Identifiers associated with this line item." )
3653        protected List<Reference> udi;
3654
3655        /**
3656         * Physical location where the service is performed or applies.
3657         */
3658        @Child(name = "bodySite", type = {}, order=23, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3659        @Description(shortDefinition="Anatomical location", formalDefinition="Physical location where the service is performed or applies." )
3660        protected List<ItemBodySiteComponent> bodySite;
3661
3662        /**
3663         * Healthcare encounters related to this claim.
3664         */
3665        @Child(name = "encounter", type = {Encounter.class}, order=24, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3666        @Description(shortDefinition="Encounters associated with the listed treatments", formalDefinition="Healthcare encounters related to this claim." )
3667        protected List<Reference> encounter;
3668
3669        /**
3670         * The numbers associated with notes below which apply to the adjudication of this item.
3671         */
3672        @Child(name = "noteNumber", type = {PositiveIntType.class}, order=25, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3673        @Description(shortDefinition="Applicable note numbers", formalDefinition="The numbers associated with notes below which apply to the adjudication of this item." )
3674        protected List<PositiveIntType> noteNumber;
3675
3676        /**
3677         * The high-level results of the adjudication if adjudication has been performed.
3678         */
3679        @Child(name = "reviewOutcome", type = {}, order=26, min=0, max=1, modifier=false, summary=false)
3680        @Description(shortDefinition="Adjudication results", formalDefinition="The high-level results of the adjudication if adjudication has been performed." )
3681        protected ItemReviewOutcomeComponent reviewOutcome;
3682
3683        /**
3684         * If this item is a group then the values here are a summary of the adjudication of the detail items. If this item is a simple product or service then this is the result of the adjudication of this item.
3685         */
3686        @Child(name = "adjudication", type = {}, order=27, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3687        @Description(shortDefinition="Adjudication details", formalDefinition="If this item is a group then the values here are a summary of the adjudication of the detail items. If this item is a simple product or service then this is the result of the adjudication of this item." )
3688        protected List<AdjudicationComponent> adjudication;
3689
3690        /**
3691         * Second-tier of goods and services.
3692         */
3693        @Child(name = "detail", type = {}, order=28, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
3694        @Description(shortDefinition="Additional items", formalDefinition="Second-tier of goods and services." )
3695        protected List<DetailComponent> detail;
3696
3697        private static final long serialVersionUID = -1905277239L;
3698
3699    /**
3700     * Constructor
3701     */
3702      public ItemComponent() {
3703        super();
3704      }
3705
3706    /**
3707     * Constructor
3708     */
3709      public ItemComponent(int sequence) {
3710        super();
3711        this.setSequence(sequence);
3712      }
3713
3714        /**
3715         * @return {@link #sequence} (A number to uniquely identify item entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
3716         */
3717        public PositiveIntType getSequenceElement() { 
3718          if (this.sequence == null)
3719            if (Configuration.errorOnAutoCreate())
3720              throw new Error("Attempt to auto-create ItemComponent.sequence");
3721            else if (Configuration.doAutoCreate())
3722              this.sequence = new PositiveIntType(); // bb
3723          return this.sequence;
3724        }
3725
3726        public boolean hasSequenceElement() { 
3727          return this.sequence != null && !this.sequence.isEmpty();
3728        }
3729
3730        public boolean hasSequence() { 
3731          return this.sequence != null && !this.sequence.isEmpty();
3732        }
3733
3734        /**
3735         * @param value {@link #sequence} (A number to uniquely identify item entries.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
3736         */
3737        public ItemComponent setSequenceElement(PositiveIntType value) { 
3738          this.sequence = value;
3739          return this;
3740        }
3741
3742        /**
3743         * @return A number to uniquely identify item entries.
3744         */
3745        public int getSequence() { 
3746          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
3747        }
3748
3749        /**
3750         * @param value A number to uniquely identify item entries.
3751         */
3752        public ItemComponent setSequence(int value) { 
3753            if (this.sequence == null)
3754              this.sequence = new PositiveIntType();
3755            this.sequence.setValue(value);
3756          return this;
3757        }
3758
3759        /**
3760         * @return {@link #careTeamSequence} (Care team members related to this service or product.)
3761         */
3762        public List<PositiveIntType> getCareTeamSequence() { 
3763          if (this.careTeamSequence == null)
3764            this.careTeamSequence = new ArrayList<PositiveIntType>();
3765          return this.careTeamSequence;
3766        }
3767
3768        /**
3769         * @return Returns a reference to <code>this</code> for easy method chaining
3770         */
3771        public ItemComponent setCareTeamSequence(List<PositiveIntType> theCareTeamSequence) { 
3772          this.careTeamSequence = theCareTeamSequence;
3773          return this;
3774        }
3775
3776        public boolean hasCareTeamSequence() { 
3777          if (this.careTeamSequence == null)
3778            return false;
3779          for (PositiveIntType item : this.careTeamSequence)
3780            if (!item.isEmpty())
3781              return true;
3782          return false;
3783        }
3784
3785        /**
3786         * @return {@link #careTeamSequence} (Care team members related to this service or product.)
3787         */
3788        public PositiveIntType addCareTeamSequenceElement() {//2 
3789          PositiveIntType t = new PositiveIntType();
3790          if (this.careTeamSequence == null)
3791            this.careTeamSequence = new ArrayList<PositiveIntType>();
3792          this.careTeamSequence.add(t);
3793          return t;
3794        }
3795
3796        /**
3797         * @param value {@link #careTeamSequence} (Care team members related to this service or product.)
3798         */
3799        public ItemComponent addCareTeamSequence(int value) { //1
3800          PositiveIntType t = new PositiveIntType();
3801          t.setValue(value);
3802          if (this.careTeamSequence == null)
3803            this.careTeamSequence = new ArrayList<PositiveIntType>();
3804          this.careTeamSequence.add(t);
3805          return this;
3806        }
3807
3808        /**
3809         * @param value {@link #careTeamSequence} (Care team members related to this service or product.)
3810         */
3811        public boolean hasCareTeamSequence(int value) { 
3812          if (this.careTeamSequence == null)
3813            return false;
3814          for (PositiveIntType v : this.careTeamSequence)
3815            if (v.getValue().equals(value)) // positiveInt
3816              return true;
3817          return false;
3818        }
3819
3820        /**
3821         * @return {@link #diagnosisSequence} (Diagnoses applicable for this service or product.)
3822         */
3823        public List<PositiveIntType> getDiagnosisSequence() { 
3824          if (this.diagnosisSequence == null)
3825            this.diagnosisSequence = new ArrayList<PositiveIntType>();
3826          return this.diagnosisSequence;
3827        }
3828
3829        /**
3830         * @return Returns a reference to <code>this</code> for easy method chaining
3831         */
3832        public ItemComponent setDiagnosisSequence(List<PositiveIntType> theDiagnosisSequence) { 
3833          this.diagnosisSequence = theDiagnosisSequence;
3834          return this;
3835        }
3836
3837        public boolean hasDiagnosisSequence() { 
3838          if (this.diagnosisSequence == null)
3839            return false;
3840          for (PositiveIntType item : this.diagnosisSequence)
3841            if (!item.isEmpty())
3842              return true;
3843          return false;
3844        }
3845
3846        /**
3847         * @return {@link #diagnosisSequence} (Diagnoses applicable for this service or product.)
3848         */
3849        public PositiveIntType addDiagnosisSequenceElement() {//2 
3850          PositiveIntType t = new PositiveIntType();
3851          if (this.diagnosisSequence == null)
3852            this.diagnosisSequence = new ArrayList<PositiveIntType>();
3853          this.diagnosisSequence.add(t);
3854          return t;
3855        }
3856
3857        /**
3858         * @param value {@link #diagnosisSequence} (Diagnoses applicable for this service or product.)
3859         */
3860        public ItemComponent addDiagnosisSequence(int value) { //1
3861          PositiveIntType t = new PositiveIntType();
3862          t.setValue(value);
3863          if (this.diagnosisSequence == null)
3864            this.diagnosisSequence = new ArrayList<PositiveIntType>();
3865          this.diagnosisSequence.add(t);
3866          return this;
3867        }
3868
3869        /**
3870         * @param value {@link #diagnosisSequence} (Diagnoses applicable for this service or product.)
3871         */
3872        public boolean hasDiagnosisSequence(int value) { 
3873          if (this.diagnosisSequence == null)
3874            return false;
3875          for (PositiveIntType v : this.diagnosisSequence)
3876            if (v.getValue().equals(value)) // positiveInt
3877              return true;
3878          return false;
3879        }
3880
3881        /**
3882         * @return {@link #procedureSequence} (Procedures applicable for this service or product.)
3883         */
3884        public List<PositiveIntType> getProcedureSequence() { 
3885          if (this.procedureSequence == null)
3886            this.procedureSequence = new ArrayList<PositiveIntType>();
3887          return this.procedureSequence;
3888        }
3889
3890        /**
3891         * @return Returns a reference to <code>this</code> for easy method chaining
3892         */
3893        public ItemComponent setProcedureSequence(List<PositiveIntType> theProcedureSequence) { 
3894          this.procedureSequence = theProcedureSequence;
3895          return this;
3896        }
3897
3898        public boolean hasProcedureSequence() { 
3899          if (this.procedureSequence == null)
3900            return false;
3901          for (PositiveIntType item : this.procedureSequence)
3902            if (!item.isEmpty())
3903              return true;
3904          return false;
3905        }
3906
3907        /**
3908         * @return {@link #procedureSequence} (Procedures applicable for this service or product.)
3909         */
3910        public PositiveIntType addProcedureSequenceElement() {//2 
3911          PositiveIntType t = new PositiveIntType();
3912          if (this.procedureSequence == null)
3913            this.procedureSequence = new ArrayList<PositiveIntType>();
3914          this.procedureSequence.add(t);
3915          return t;
3916        }
3917
3918        /**
3919         * @param value {@link #procedureSequence} (Procedures applicable for this service or product.)
3920         */
3921        public ItemComponent addProcedureSequence(int value) { //1
3922          PositiveIntType t = new PositiveIntType();
3923          t.setValue(value);
3924          if (this.procedureSequence == null)
3925            this.procedureSequence = new ArrayList<PositiveIntType>();
3926          this.procedureSequence.add(t);
3927          return this;
3928        }
3929
3930        /**
3931         * @param value {@link #procedureSequence} (Procedures applicable for this service or product.)
3932         */
3933        public boolean hasProcedureSequence(int value) { 
3934          if (this.procedureSequence == null)
3935            return false;
3936          for (PositiveIntType v : this.procedureSequence)
3937            if (v.getValue().equals(value)) // positiveInt
3938              return true;
3939          return false;
3940        }
3941
3942        /**
3943         * @return {@link #informationSequence} (Exceptions, special conditions and supporting information applicable for this service or product.)
3944         */
3945        public List<PositiveIntType> getInformationSequence() { 
3946          if (this.informationSequence == null)
3947            this.informationSequence = new ArrayList<PositiveIntType>();
3948          return this.informationSequence;
3949        }
3950
3951        /**
3952         * @return Returns a reference to <code>this</code> for easy method chaining
3953         */
3954        public ItemComponent setInformationSequence(List<PositiveIntType> theInformationSequence) { 
3955          this.informationSequence = theInformationSequence;
3956          return this;
3957        }
3958
3959        public boolean hasInformationSequence() { 
3960          if (this.informationSequence == null)
3961            return false;
3962          for (PositiveIntType item : this.informationSequence)
3963            if (!item.isEmpty())
3964              return true;
3965          return false;
3966        }
3967
3968        /**
3969         * @return {@link #informationSequence} (Exceptions, special conditions and supporting information applicable for this service or product.)
3970         */
3971        public PositiveIntType addInformationSequenceElement() {//2 
3972          PositiveIntType t = new PositiveIntType();
3973          if (this.informationSequence == null)
3974            this.informationSequence = new ArrayList<PositiveIntType>();
3975          this.informationSequence.add(t);
3976          return t;
3977        }
3978
3979        /**
3980         * @param value {@link #informationSequence} (Exceptions, special conditions and supporting information applicable for this service or product.)
3981         */
3982        public ItemComponent addInformationSequence(int value) { //1
3983          PositiveIntType t = new PositiveIntType();
3984          t.setValue(value);
3985          if (this.informationSequence == null)
3986            this.informationSequence = new ArrayList<PositiveIntType>();
3987          this.informationSequence.add(t);
3988          return this;
3989        }
3990
3991        /**
3992         * @param value {@link #informationSequence} (Exceptions, special conditions and supporting information applicable for this service or product.)
3993         */
3994        public boolean hasInformationSequence(int value) { 
3995          if (this.informationSequence == null)
3996            return false;
3997          for (PositiveIntType v : this.informationSequence)
3998            if (v.getValue().equals(value)) // positiveInt
3999              return true;
4000          return false;
4001        }
4002
4003        /**
4004         * @return {@link #traceNumber} (Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.)
4005         */
4006        public List<Identifier> getTraceNumber() { 
4007          if (this.traceNumber == null)
4008            this.traceNumber = new ArrayList<Identifier>();
4009          return this.traceNumber;
4010        }
4011
4012        /**
4013         * @return Returns a reference to <code>this</code> for easy method chaining
4014         */
4015        public ItemComponent setTraceNumber(List<Identifier> theTraceNumber) { 
4016          this.traceNumber = theTraceNumber;
4017          return this;
4018        }
4019
4020        public boolean hasTraceNumber() { 
4021          if (this.traceNumber == null)
4022            return false;
4023          for (Identifier item : this.traceNumber)
4024            if (!item.isEmpty())
4025              return true;
4026          return false;
4027        }
4028
4029        public Identifier addTraceNumber() { //3
4030          Identifier t = new Identifier();
4031          if (this.traceNumber == null)
4032            this.traceNumber = new ArrayList<Identifier>();
4033          this.traceNumber.add(t);
4034          return t;
4035        }
4036
4037        public ItemComponent addTraceNumber(Identifier t) { //3
4038          if (t == null)
4039            return this;
4040          if (this.traceNumber == null)
4041            this.traceNumber = new ArrayList<Identifier>();
4042          this.traceNumber.add(t);
4043          return this;
4044        }
4045
4046        /**
4047         * @return The first repetition of repeating field {@link #traceNumber}, creating it if it does not already exist {3}
4048         */
4049        public Identifier getTraceNumberFirstRep() { 
4050          if (getTraceNumber().isEmpty()) {
4051            addTraceNumber();
4052          }
4053          return getTraceNumber().get(0);
4054        }
4055
4056        /**
4057         * @return {@link #revenue} (The type of revenue or cost center providing the product and/or service.)
4058         */
4059        public CodeableConcept getRevenue() { 
4060          if (this.revenue == null)
4061            if (Configuration.errorOnAutoCreate())
4062              throw new Error("Attempt to auto-create ItemComponent.revenue");
4063            else if (Configuration.doAutoCreate())
4064              this.revenue = new CodeableConcept(); // cc
4065          return this.revenue;
4066        }
4067
4068        public boolean hasRevenue() { 
4069          return this.revenue != null && !this.revenue.isEmpty();
4070        }
4071
4072        /**
4073         * @param value {@link #revenue} (The type of revenue or cost center providing the product and/or service.)
4074         */
4075        public ItemComponent setRevenue(CodeableConcept value) { 
4076          this.revenue = value;
4077          return this;
4078        }
4079
4080        /**
4081         * @return {@link #category} (Code to identify the general type of benefits under which products and services are provided.)
4082         */
4083        public CodeableConcept getCategory() { 
4084          if (this.category == null)
4085            if (Configuration.errorOnAutoCreate())
4086              throw new Error("Attempt to auto-create ItemComponent.category");
4087            else if (Configuration.doAutoCreate())
4088              this.category = new CodeableConcept(); // cc
4089          return this.category;
4090        }
4091
4092        public boolean hasCategory() { 
4093          return this.category != null && !this.category.isEmpty();
4094        }
4095
4096        /**
4097         * @param value {@link #category} (Code to identify the general type of benefits under which products and services are provided.)
4098         */
4099        public ItemComponent setCategory(CodeableConcept value) { 
4100          this.category = value;
4101          return this;
4102        }
4103
4104        /**
4105         * @return {@link #productOrService} (When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.)
4106         */
4107        public CodeableConcept getProductOrService() { 
4108          if (this.productOrService == null)
4109            if (Configuration.errorOnAutoCreate())
4110              throw new Error("Attempt to auto-create ItemComponent.productOrService");
4111            else if (Configuration.doAutoCreate())
4112              this.productOrService = new CodeableConcept(); // cc
4113          return this.productOrService;
4114        }
4115
4116        public boolean hasProductOrService() { 
4117          return this.productOrService != null && !this.productOrService.isEmpty();
4118        }
4119
4120        /**
4121         * @param value {@link #productOrService} (When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.)
4122         */
4123        public ItemComponent setProductOrService(CodeableConcept value) { 
4124          this.productOrService = value;
4125          return this;
4126        }
4127
4128        /**
4129         * @return {@link #productOrServiceEnd} (This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.)
4130         */
4131        public CodeableConcept getProductOrServiceEnd() { 
4132          if (this.productOrServiceEnd == null)
4133            if (Configuration.errorOnAutoCreate())
4134              throw new Error("Attempt to auto-create ItemComponent.productOrServiceEnd");
4135            else if (Configuration.doAutoCreate())
4136              this.productOrServiceEnd = new CodeableConcept(); // cc
4137          return this.productOrServiceEnd;
4138        }
4139
4140        public boolean hasProductOrServiceEnd() { 
4141          return this.productOrServiceEnd != null && !this.productOrServiceEnd.isEmpty();
4142        }
4143
4144        /**
4145         * @param value {@link #productOrServiceEnd} (This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.)
4146         */
4147        public ItemComponent setProductOrServiceEnd(CodeableConcept value) { 
4148          this.productOrServiceEnd = value;
4149          return this;
4150        }
4151
4152        /**
4153         * @return {@link #request} (Request or Referral for Goods or Service to be rendered.)
4154         */
4155        public List<Reference> getRequest() { 
4156          if (this.request == null)
4157            this.request = new ArrayList<Reference>();
4158          return this.request;
4159        }
4160
4161        /**
4162         * @return Returns a reference to <code>this</code> for easy method chaining
4163         */
4164        public ItemComponent setRequest(List<Reference> theRequest) { 
4165          this.request = theRequest;
4166          return this;
4167        }
4168
4169        public boolean hasRequest() { 
4170          if (this.request == null)
4171            return false;
4172          for (Reference item : this.request)
4173            if (!item.isEmpty())
4174              return true;
4175          return false;
4176        }
4177
4178        public Reference addRequest() { //3
4179          Reference t = new Reference();
4180          if (this.request == null)
4181            this.request = new ArrayList<Reference>();
4182          this.request.add(t);
4183          return t;
4184        }
4185
4186        public ItemComponent addRequest(Reference t) { //3
4187          if (t == null)
4188            return this;
4189          if (this.request == null)
4190            this.request = new ArrayList<Reference>();
4191          this.request.add(t);
4192          return this;
4193        }
4194
4195        /**
4196         * @return The first repetition of repeating field {@link #request}, creating it if it does not already exist {3}
4197         */
4198        public Reference getRequestFirstRep() { 
4199          if (getRequest().isEmpty()) {
4200            addRequest();
4201          }
4202          return getRequest().get(0);
4203        }
4204
4205        /**
4206         * @return {@link #modifier} (Item typification or modifiers codes to convey additional context for the product or service.)
4207         */
4208        public List<CodeableConcept> getModifier() { 
4209          if (this.modifier == null)
4210            this.modifier = new ArrayList<CodeableConcept>();
4211          return this.modifier;
4212        }
4213
4214        /**
4215         * @return Returns a reference to <code>this</code> for easy method chaining
4216         */
4217        public ItemComponent setModifier(List<CodeableConcept> theModifier) { 
4218          this.modifier = theModifier;
4219          return this;
4220        }
4221
4222        public boolean hasModifier() { 
4223          if (this.modifier == null)
4224            return false;
4225          for (CodeableConcept item : this.modifier)
4226            if (!item.isEmpty())
4227              return true;
4228          return false;
4229        }
4230
4231        public CodeableConcept addModifier() { //3
4232          CodeableConcept t = new CodeableConcept();
4233          if (this.modifier == null)
4234            this.modifier = new ArrayList<CodeableConcept>();
4235          this.modifier.add(t);
4236          return t;
4237        }
4238
4239        public ItemComponent addModifier(CodeableConcept t) { //3
4240          if (t == null)
4241            return this;
4242          if (this.modifier == null)
4243            this.modifier = new ArrayList<CodeableConcept>();
4244          this.modifier.add(t);
4245          return this;
4246        }
4247
4248        /**
4249         * @return The first repetition of repeating field {@link #modifier}, creating it if it does not already exist {3}
4250         */
4251        public CodeableConcept getModifierFirstRep() { 
4252          if (getModifier().isEmpty()) {
4253            addModifier();
4254          }
4255          return getModifier().get(0);
4256        }
4257
4258        /**
4259         * @return {@link #programCode} (Identifies the program under which this may be recovered.)
4260         */
4261        public List<CodeableConcept> getProgramCode() { 
4262          if (this.programCode == null)
4263            this.programCode = new ArrayList<CodeableConcept>();
4264          return this.programCode;
4265        }
4266
4267        /**
4268         * @return Returns a reference to <code>this</code> for easy method chaining
4269         */
4270        public ItemComponent setProgramCode(List<CodeableConcept> theProgramCode) { 
4271          this.programCode = theProgramCode;
4272          return this;
4273        }
4274
4275        public boolean hasProgramCode() { 
4276          if (this.programCode == null)
4277            return false;
4278          for (CodeableConcept item : this.programCode)
4279            if (!item.isEmpty())
4280              return true;
4281          return false;
4282        }
4283
4284        public CodeableConcept addProgramCode() { //3
4285          CodeableConcept t = new CodeableConcept();
4286          if (this.programCode == null)
4287            this.programCode = new ArrayList<CodeableConcept>();
4288          this.programCode.add(t);
4289          return t;
4290        }
4291
4292        public ItemComponent addProgramCode(CodeableConcept t) { //3
4293          if (t == null)
4294            return this;
4295          if (this.programCode == null)
4296            this.programCode = new ArrayList<CodeableConcept>();
4297          this.programCode.add(t);
4298          return this;
4299        }
4300
4301        /**
4302         * @return The first repetition of repeating field {@link #programCode}, creating it if it does not already exist {3}
4303         */
4304        public CodeableConcept getProgramCodeFirstRep() { 
4305          if (getProgramCode().isEmpty()) {
4306            addProgramCode();
4307          }
4308          return getProgramCode().get(0);
4309        }
4310
4311        /**
4312         * @return {@link #serviced} (The date or dates when the service or product was supplied, performed or completed.)
4313         */
4314        public DataType getServiced() { 
4315          return this.serviced;
4316        }
4317
4318        /**
4319         * @return {@link #serviced} (The date or dates when the service or product was supplied, performed or completed.)
4320         */
4321        public DateType getServicedDateType() throws FHIRException { 
4322          if (this.serviced == null)
4323            this.serviced = new DateType();
4324          if (!(this.serviced instanceof DateType))
4325            throw new FHIRException("Type mismatch: the type DateType was expected, but "+this.serviced.getClass().getName()+" was encountered");
4326          return (DateType) this.serviced;
4327        }
4328
4329        public boolean hasServicedDateType() { 
4330          return this != null && this.serviced instanceof DateType;
4331        }
4332
4333        /**
4334         * @return {@link #serviced} (The date or dates when the service or product was supplied, performed or completed.)
4335         */
4336        public Period getServicedPeriod() throws FHIRException { 
4337          if (this.serviced == null)
4338            this.serviced = new Period();
4339          if (!(this.serviced instanceof Period))
4340            throw new FHIRException("Type mismatch: the type Period was expected, but "+this.serviced.getClass().getName()+" was encountered");
4341          return (Period) this.serviced;
4342        }
4343
4344        public boolean hasServicedPeriod() { 
4345          return this != null && this.serviced instanceof Period;
4346        }
4347
4348        public boolean hasServiced() { 
4349          return this.serviced != null && !this.serviced.isEmpty();
4350        }
4351
4352        /**
4353         * @param value {@link #serviced} (The date or dates when the service or product was supplied, performed or completed.)
4354         */
4355        public ItemComponent setServiced(DataType value) { 
4356          if (value != null && !(value instanceof DateType || value instanceof Period))
4357            throw new FHIRException("Not the right type for ExplanationOfBenefit.item.serviced[x]: "+value.fhirType());
4358          this.serviced = value;
4359          return this;
4360        }
4361
4362        /**
4363         * @return {@link #location} (Where the product or service was provided.)
4364         */
4365        public DataType getLocation() { 
4366          return this.location;
4367        }
4368
4369        /**
4370         * @return {@link #location} (Where the product or service was provided.)
4371         */
4372        public CodeableConcept getLocationCodeableConcept() throws FHIRException { 
4373          if (this.location == null)
4374            this.location = new CodeableConcept();
4375          if (!(this.location instanceof CodeableConcept))
4376            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.location.getClass().getName()+" was encountered");
4377          return (CodeableConcept) this.location;
4378        }
4379
4380        public boolean hasLocationCodeableConcept() { 
4381          return this != null && this.location instanceof CodeableConcept;
4382        }
4383
4384        /**
4385         * @return {@link #location} (Where the product or service was provided.)
4386         */
4387        public Address getLocationAddress() throws FHIRException { 
4388          if (this.location == null)
4389            this.location = new Address();
4390          if (!(this.location instanceof Address))
4391            throw new FHIRException("Type mismatch: the type Address was expected, but "+this.location.getClass().getName()+" was encountered");
4392          return (Address) this.location;
4393        }
4394
4395        public boolean hasLocationAddress() { 
4396          return this != null && this.location instanceof Address;
4397        }
4398
4399        /**
4400         * @return {@link #location} (Where the product or service was provided.)
4401         */
4402        public Reference getLocationReference() throws FHIRException { 
4403          if (this.location == null)
4404            this.location = new Reference();
4405          if (!(this.location instanceof Reference))
4406            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.location.getClass().getName()+" was encountered");
4407          return (Reference) this.location;
4408        }
4409
4410        public boolean hasLocationReference() { 
4411          return this != null && this.location instanceof Reference;
4412        }
4413
4414        public boolean hasLocation() { 
4415          return this.location != null && !this.location.isEmpty();
4416        }
4417
4418        /**
4419         * @param value {@link #location} (Where the product or service was provided.)
4420         */
4421        public ItemComponent setLocation(DataType value) { 
4422          if (value != null && !(value instanceof CodeableConcept || value instanceof Address || value instanceof Reference))
4423            throw new FHIRException("Not the right type for ExplanationOfBenefit.item.location[x]: "+value.fhirType());
4424          this.location = value;
4425          return this;
4426        }
4427
4428        /**
4429         * @return {@link #patientPaid} (The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.)
4430         */
4431        public Money getPatientPaid() { 
4432          if (this.patientPaid == null)
4433            if (Configuration.errorOnAutoCreate())
4434              throw new Error("Attempt to auto-create ItemComponent.patientPaid");
4435            else if (Configuration.doAutoCreate())
4436              this.patientPaid = new Money(); // cc
4437          return this.patientPaid;
4438        }
4439
4440        public boolean hasPatientPaid() { 
4441          return this.patientPaid != null && !this.patientPaid.isEmpty();
4442        }
4443
4444        /**
4445         * @param value {@link #patientPaid} (The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.)
4446         */
4447        public ItemComponent setPatientPaid(Money value) { 
4448          this.patientPaid = value;
4449          return this;
4450        }
4451
4452        /**
4453         * @return {@link #quantity} (The number of repetitions of a service or product.)
4454         */
4455        public Quantity getQuantity() { 
4456          if (this.quantity == null)
4457            if (Configuration.errorOnAutoCreate())
4458              throw new Error("Attempt to auto-create ItemComponent.quantity");
4459            else if (Configuration.doAutoCreate())
4460              this.quantity = new Quantity(); // cc
4461          return this.quantity;
4462        }
4463
4464        public boolean hasQuantity() { 
4465          return this.quantity != null && !this.quantity.isEmpty();
4466        }
4467
4468        /**
4469         * @param value {@link #quantity} (The number of repetitions of a service or product.)
4470         */
4471        public ItemComponent setQuantity(Quantity value) { 
4472          this.quantity = value;
4473          return this;
4474        }
4475
4476        /**
4477         * @return {@link #unitPrice} (If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.)
4478         */
4479        public Money getUnitPrice() { 
4480          if (this.unitPrice == null)
4481            if (Configuration.errorOnAutoCreate())
4482              throw new Error("Attempt to auto-create ItemComponent.unitPrice");
4483            else if (Configuration.doAutoCreate())
4484              this.unitPrice = new Money(); // cc
4485          return this.unitPrice;
4486        }
4487
4488        public boolean hasUnitPrice() { 
4489          return this.unitPrice != null && !this.unitPrice.isEmpty();
4490        }
4491
4492        /**
4493         * @param value {@link #unitPrice} (If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.)
4494         */
4495        public ItemComponent setUnitPrice(Money value) { 
4496          this.unitPrice = value;
4497          return this;
4498        }
4499
4500        /**
4501         * @return {@link #factor} (A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.). This is the underlying object with id, value and extensions. The accessor "getFactor" gives direct access to the value
4502         */
4503        public DecimalType getFactorElement() { 
4504          if (this.factor == null)
4505            if (Configuration.errorOnAutoCreate())
4506              throw new Error("Attempt to auto-create ItemComponent.factor");
4507            else if (Configuration.doAutoCreate())
4508              this.factor = new DecimalType(); // bb
4509          return this.factor;
4510        }
4511
4512        public boolean hasFactorElement() { 
4513          return this.factor != null && !this.factor.isEmpty();
4514        }
4515
4516        public boolean hasFactor() { 
4517          return this.factor != null && !this.factor.isEmpty();
4518        }
4519
4520        /**
4521         * @param value {@link #factor} (A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.). This is the underlying object with id, value and extensions. The accessor "getFactor" gives direct access to the value
4522         */
4523        public ItemComponent setFactorElement(DecimalType value) { 
4524          this.factor = value;
4525          return this;
4526        }
4527
4528        /**
4529         * @return A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
4530         */
4531        public BigDecimal getFactor() { 
4532          return this.factor == null ? null : this.factor.getValue();
4533        }
4534
4535        /**
4536         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
4537         */
4538        public ItemComponent setFactor(BigDecimal value) { 
4539          if (value == null)
4540            this.factor = null;
4541          else {
4542            if (this.factor == null)
4543              this.factor = new DecimalType();
4544            this.factor.setValue(value);
4545          }
4546          return this;
4547        }
4548
4549        /**
4550         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
4551         */
4552        public ItemComponent setFactor(long value) { 
4553              this.factor = new DecimalType();
4554            this.factor.setValue(value);
4555          return this;
4556        }
4557
4558        /**
4559         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
4560         */
4561        public ItemComponent setFactor(double value) { 
4562              this.factor = new DecimalType();
4563            this.factor.setValue(value);
4564          return this;
4565        }
4566
4567        /**
4568         * @return {@link #tax} (The total of taxes applicable for this product or service.)
4569         */
4570        public Money getTax() { 
4571          if (this.tax == null)
4572            if (Configuration.errorOnAutoCreate())
4573              throw new Error("Attempt to auto-create ItemComponent.tax");
4574            else if (Configuration.doAutoCreate())
4575              this.tax = new Money(); // cc
4576          return this.tax;
4577        }
4578
4579        public boolean hasTax() { 
4580          return this.tax != null && !this.tax.isEmpty();
4581        }
4582
4583        /**
4584         * @param value {@link #tax} (The total of taxes applicable for this product or service.)
4585         */
4586        public ItemComponent setTax(Money value) { 
4587          this.tax = value;
4588          return this;
4589        }
4590
4591        /**
4592         * @return {@link #net} (The total amount claimed for the group (if a grouper) or the line item. Net = unit price * quantity * factor.)
4593         */
4594        public Money getNet() { 
4595          if (this.net == null)
4596            if (Configuration.errorOnAutoCreate())
4597              throw new Error("Attempt to auto-create ItemComponent.net");
4598            else if (Configuration.doAutoCreate())
4599              this.net = new Money(); // cc
4600          return this.net;
4601        }
4602
4603        public boolean hasNet() { 
4604          return this.net != null && !this.net.isEmpty();
4605        }
4606
4607        /**
4608         * @param value {@link #net} (The total amount claimed for the group (if a grouper) or the line item. Net = unit price * quantity * factor.)
4609         */
4610        public ItemComponent setNet(Money value) { 
4611          this.net = value;
4612          return this;
4613        }
4614
4615        /**
4616         * @return {@link #udi} (Unique Device Identifiers associated with this line item.)
4617         */
4618        public List<Reference> getUdi() { 
4619          if (this.udi == null)
4620            this.udi = new ArrayList<Reference>();
4621          return this.udi;
4622        }
4623
4624        /**
4625         * @return Returns a reference to <code>this</code> for easy method chaining
4626         */
4627        public ItemComponent setUdi(List<Reference> theUdi) { 
4628          this.udi = theUdi;
4629          return this;
4630        }
4631
4632        public boolean hasUdi() { 
4633          if (this.udi == null)
4634            return false;
4635          for (Reference item : this.udi)
4636            if (!item.isEmpty())
4637              return true;
4638          return false;
4639        }
4640
4641        public Reference addUdi() { //3
4642          Reference t = new Reference();
4643          if (this.udi == null)
4644            this.udi = new ArrayList<Reference>();
4645          this.udi.add(t);
4646          return t;
4647        }
4648
4649        public ItemComponent addUdi(Reference t) { //3
4650          if (t == null)
4651            return this;
4652          if (this.udi == null)
4653            this.udi = new ArrayList<Reference>();
4654          this.udi.add(t);
4655          return this;
4656        }
4657
4658        /**
4659         * @return The first repetition of repeating field {@link #udi}, creating it if it does not already exist {3}
4660         */
4661        public Reference getUdiFirstRep() { 
4662          if (getUdi().isEmpty()) {
4663            addUdi();
4664          }
4665          return getUdi().get(0);
4666        }
4667
4668        /**
4669         * @return {@link #bodySite} (Physical location where the service is performed or applies.)
4670         */
4671        public List<ItemBodySiteComponent> getBodySite() { 
4672          if (this.bodySite == null)
4673            this.bodySite = new ArrayList<ItemBodySiteComponent>();
4674          return this.bodySite;
4675        }
4676
4677        /**
4678         * @return Returns a reference to <code>this</code> for easy method chaining
4679         */
4680        public ItemComponent setBodySite(List<ItemBodySiteComponent> theBodySite) { 
4681          this.bodySite = theBodySite;
4682          return this;
4683        }
4684
4685        public boolean hasBodySite() { 
4686          if (this.bodySite == null)
4687            return false;
4688          for (ItemBodySiteComponent item : this.bodySite)
4689            if (!item.isEmpty())
4690              return true;
4691          return false;
4692        }
4693
4694        public ItemBodySiteComponent addBodySite() { //3
4695          ItemBodySiteComponent t = new ItemBodySiteComponent();
4696          if (this.bodySite == null)
4697            this.bodySite = new ArrayList<ItemBodySiteComponent>();
4698          this.bodySite.add(t);
4699          return t;
4700        }
4701
4702        public ItemComponent addBodySite(ItemBodySiteComponent t) { //3
4703          if (t == null)
4704            return this;
4705          if (this.bodySite == null)
4706            this.bodySite = new ArrayList<ItemBodySiteComponent>();
4707          this.bodySite.add(t);
4708          return this;
4709        }
4710
4711        /**
4712         * @return The first repetition of repeating field {@link #bodySite}, creating it if it does not already exist {3}
4713         */
4714        public ItemBodySiteComponent getBodySiteFirstRep() { 
4715          if (getBodySite().isEmpty()) {
4716            addBodySite();
4717          }
4718          return getBodySite().get(0);
4719        }
4720
4721        /**
4722         * @return {@link #encounter} (Healthcare encounters related to this claim.)
4723         */
4724        public List<Reference> getEncounter() { 
4725          if (this.encounter == null)
4726            this.encounter = new ArrayList<Reference>();
4727          return this.encounter;
4728        }
4729
4730        /**
4731         * @return Returns a reference to <code>this</code> for easy method chaining
4732         */
4733        public ItemComponent setEncounter(List<Reference> theEncounter) { 
4734          this.encounter = theEncounter;
4735          return this;
4736        }
4737
4738        public boolean hasEncounter() { 
4739          if (this.encounter == null)
4740            return false;
4741          for (Reference item : this.encounter)
4742            if (!item.isEmpty())
4743              return true;
4744          return false;
4745        }
4746
4747        public Reference addEncounter() { //3
4748          Reference t = new Reference();
4749          if (this.encounter == null)
4750            this.encounter = new ArrayList<Reference>();
4751          this.encounter.add(t);
4752          return t;
4753        }
4754
4755        public ItemComponent addEncounter(Reference t) { //3
4756          if (t == null)
4757            return this;
4758          if (this.encounter == null)
4759            this.encounter = new ArrayList<Reference>();
4760          this.encounter.add(t);
4761          return this;
4762        }
4763
4764        /**
4765         * @return The first repetition of repeating field {@link #encounter}, creating it if it does not already exist {3}
4766         */
4767        public Reference getEncounterFirstRep() { 
4768          if (getEncounter().isEmpty()) {
4769            addEncounter();
4770          }
4771          return getEncounter().get(0);
4772        }
4773
4774        /**
4775         * @return {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
4776         */
4777        public List<PositiveIntType> getNoteNumber() { 
4778          if (this.noteNumber == null)
4779            this.noteNumber = new ArrayList<PositiveIntType>();
4780          return this.noteNumber;
4781        }
4782
4783        /**
4784         * @return Returns a reference to <code>this</code> for easy method chaining
4785         */
4786        public ItemComponent setNoteNumber(List<PositiveIntType> theNoteNumber) { 
4787          this.noteNumber = theNoteNumber;
4788          return this;
4789        }
4790
4791        public boolean hasNoteNumber() { 
4792          if (this.noteNumber == null)
4793            return false;
4794          for (PositiveIntType item : this.noteNumber)
4795            if (!item.isEmpty())
4796              return true;
4797          return false;
4798        }
4799
4800        /**
4801         * @return {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
4802         */
4803        public PositiveIntType addNoteNumberElement() {//2 
4804          PositiveIntType t = new PositiveIntType();
4805          if (this.noteNumber == null)
4806            this.noteNumber = new ArrayList<PositiveIntType>();
4807          this.noteNumber.add(t);
4808          return t;
4809        }
4810
4811        /**
4812         * @param value {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
4813         */
4814        public ItemComponent addNoteNumber(int value) { //1
4815          PositiveIntType t = new PositiveIntType();
4816          t.setValue(value);
4817          if (this.noteNumber == null)
4818            this.noteNumber = new ArrayList<PositiveIntType>();
4819          this.noteNumber.add(t);
4820          return this;
4821        }
4822
4823        /**
4824         * @param value {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
4825         */
4826        public boolean hasNoteNumber(int value) { 
4827          if (this.noteNumber == null)
4828            return false;
4829          for (PositiveIntType v : this.noteNumber)
4830            if (v.getValue().equals(value)) // positiveInt
4831              return true;
4832          return false;
4833        }
4834
4835        /**
4836         * @return {@link #reviewOutcome} (The high-level results of the adjudication if adjudication has been performed.)
4837         */
4838        public ItemReviewOutcomeComponent getReviewOutcome() { 
4839          if (this.reviewOutcome == null)
4840            if (Configuration.errorOnAutoCreate())
4841              throw new Error("Attempt to auto-create ItemComponent.reviewOutcome");
4842            else if (Configuration.doAutoCreate())
4843              this.reviewOutcome = new ItemReviewOutcomeComponent(); // cc
4844          return this.reviewOutcome;
4845        }
4846
4847        public boolean hasReviewOutcome() { 
4848          return this.reviewOutcome != null && !this.reviewOutcome.isEmpty();
4849        }
4850
4851        /**
4852         * @param value {@link #reviewOutcome} (The high-level results of the adjudication if adjudication has been performed.)
4853         */
4854        public ItemComponent setReviewOutcome(ItemReviewOutcomeComponent value) { 
4855          this.reviewOutcome = value;
4856          return this;
4857        }
4858
4859        /**
4860         * @return {@link #adjudication} (If this item is a group then the values here are a summary of the adjudication of the detail items. If this item is a simple product or service then this is the result of the adjudication of this item.)
4861         */
4862        public List<AdjudicationComponent> getAdjudication() { 
4863          if (this.adjudication == null)
4864            this.adjudication = new ArrayList<AdjudicationComponent>();
4865          return this.adjudication;
4866        }
4867
4868        /**
4869         * @return Returns a reference to <code>this</code> for easy method chaining
4870         */
4871        public ItemComponent setAdjudication(List<AdjudicationComponent> theAdjudication) { 
4872          this.adjudication = theAdjudication;
4873          return this;
4874        }
4875
4876        public boolean hasAdjudication() { 
4877          if (this.adjudication == null)
4878            return false;
4879          for (AdjudicationComponent item : this.adjudication)
4880            if (!item.isEmpty())
4881              return true;
4882          return false;
4883        }
4884
4885        public AdjudicationComponent addAdjudication() { //3
4886          AdjudicationComponent t = new AdjudicationComponent();
4887          if (this.adjudication == null)
4888            this.adjudication = new ArrayList<AdjudicationComponent>();
4889          this.adjudication.add(t);
4890          return t;
4891        }
4892
4893        public ItemComponent addAdjudication(AdjudicationComponent t) { //3
4894          if (t == null)
4895            return this;
4896          if (this.adjudication == null)
4897            this.adjudication = new ArrayList<AdjudicationComponent>();
4898          this.adjudication.add(t);
4899          return this;
4900        }
4901
4902        /**
4903         * @return The first repetition of repeating field {@link #adjudication}, creating it if it does not already exist {3}
4904         */
4905        public AdjudicationComponent getAdjudicationFirstRep() { 
4906          if (getAdjudication().isEmpty()) {
4907            addAdjudication();
4908          }
4909          return getAdjudication().get(0);
4910        }
4911
4912        /**
4913         * @return {@link #detail} (Second-tier of goods and services.)
4914         */
4915        public List<DetailComponent> getDetail() { 
4916          if (this.detail == null)
4917            this.detail = new ArrayList<DetailComponent>();
4918          return this.detail;
4919        }
4920
4921        /**
4922         * @return Returns a reference to <code>this</code> for easy method chaining
4923         */
4924        public ItemComponent setDetail(List<DetailComponent> theDetail) { 
4925          this.detail = theDetail;
4926          return this;
4927        }
4928
4929        public boolean hasDetail() { 
4930          if (this.detail == null)
4931            return false;
4932          for (DetailComponent item : this.detail)
4933            if (!item.isEmpty())
4934              return true;
4935          return false;
4936        }
4937
4938        public DetailComponent addDetail() { //3
4939          DetailComponent t = new DetailComponent();
4940          if (this.detail == null)
4941            this.detail = new ArrayList<DetailComponent>();
4942          this.detail.add(t);
4943          return t;
4944        }
4945
4946        public ItemComponent addDetail(DetailComponent t) { //3
4947          if (t == null)
4948            return this;
4949          if (this.detail == null)
4950            this.detail = new ArrayList<DetailComponent>();
4951          this.detail.add(t);
4952          return this;
4953        }
4954
4955        /**
4956         * @return The first repetition of repeating field {@link #detail}, creating it if it does not already exist {3}
4957         */
4958        public DetailComponent getDetailFirstRep() { 
4959          if (getDetail().isEmpty()) {
4960            addDetail();
4961          }
4962          return getDetail().get(0);
4963        }
4964
4965        protected void listChildren(List<Property> children) {
4966          super.listChildren(children);
4967          children.add(new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0, 1, sequence));
4968          children.add(new Property("careTeamSequence", "positiveInt", "Care team members related to this service or product.", 0, java.lang.Integer.MAX_VALUE, careTeamSequence));
4969          children.add(new Property("diagnosisSequence", "positiveInt", "Diagnoses applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, diagnosisSequence));
4970          children.add(new Property("procedureSequence", "positiveInt", "Procedures applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, procedureSequence));
4971          children.add(new Property("informationSequence", "positiveInt", "Exceptions, special conditions and supporting information applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, informationSequence));
4972          children.add(new Property("traceNumber", "Identifier", "Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.", 0, java.lang.Integer.MAX_VALUE, traceNumber));
4973          children.add(new Property("revenue", "CodeableConcept", "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue));
4974          children.add(new Property("category", "CodeableConcept", "Code to identify the general type of benefits under which products and services are provided.", 0, 1, category));
4975          children.add(new Property("productOrService", "CodeableConcept", "When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.", 0, 1, productOrService));
4976          children.add(new Property("productOrServiceEnd", "CodeableConcept", "This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.", 0, 1, productOrServiceEnd));
4977          children.add(new Property("request", "Reference(DeviceRequest|MedicationRequest|NutritionOrder|ServiceRequest|SupplyRequest|VisionPrescription)", "Request or Referral for Goods or Service to be rendered.", 0, java.lang.Integer.MAX_VALUE, request));
4978          children.add(new Property("modifier", "CodeableConcept", "Item typification or modifiers codes to convey additional context for the product or service.", 0, java.lang.Integer.MAX_VALUE, modifier));
4979          children.add(new Property("programCode", "CodeableConcept", "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode));
4980          children.add(new Property("serviced[x]", "date|Period", "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced));
4981          children.add(new Property("location[x]", "CodeableConcept|Address|Reference(Location)", "Where the product or service was provided.", 0, 1, location));
4982          children.add(new Property("patientPaid", "Money", "The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.", 0, 1, patientPaid));
4983          children.add(new Property("quantity", "Quantity", "The number of repetitions of a service or product.", 0, 1, quantity));
4984          children.add(new Property("unitPrice", "Money", "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.", 0, 1, unitPrice));
4985          children.add(new Property("factor", "decimal", "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.", 0, 1, factor));
4986          children.add(new Property("tax", "Money", "The total of taxes applicable for this product or service.", 0, 1, tax));
4987          children.add(new Property("net", "Money", "The total amount claimed for the group (if a grouper) or the line item. Net = unit price * quantity * factor.", 0, 1, net));
4988          children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi));
4989          children.add(new Property("bodySite", "", "Physical location where the service is performed or applies.", 0, java.lang.Integer.MAX_VALUE, bodySite));
4990          children.add(new Property("encounter", "Reference(Encounter)", "Healthcare encounters related to this claim.", 0, java.lang.Integer.MAX_VALUE, encounter));
4991          children.add(new Property("noteNumber", "positiveInt", "The numbers associated with notes below which apply to the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, noteNumber));
4992          children.add(new Property("reviewOutcome", "", "The high-level results of the adjudication if adjudication has been performed.", 0, 1, reviewOutcome));
4993          children.add(new Property("adjudication", "", "If this item is a group then the values here are a summary of the adjudication of the detail items. If this item is a simple product or service then this is the result of the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, adjudication));
4994          children.add(new Property("detail", "", "Second-tier of goods and services.", 0, java.lang.Integer.MAX_VALUE, detail));
4995        }
4996
4997        @Override
4998        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4999          switch (_hash) {
5000          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A number to uniquely identify item entries.", 0, 1, sequence);
5001          case 1070083823: /*careTeamSequence*/  return new Property("careTeamSequence", "positiveInt", "Care team members related to this service or product.", 0, java.lang.Integer.MAX_VALUE, careTeamSequence);
5002          case -909769262: /*diagnosisSequence*/  return new Property("diagnosisSequence", "positiveInt", "Diagnoses applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, diagnosisSequence);
5003          case -808920140: /*procedureSequence*/  return new Property("procedureSequence", "positiveInt", "Procedures applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, procedureSequence);
5004          case -702585587: /*informationSequence*/  return new Property("informationSequence", "positiveInt", "Exceptions, special conditions and supporting information applicable for this service or product.", 0, java.lang.Integer.MAX_VALUE, informationSequence);
5005          case 82505966: /*traceNumber*/  return new Property("traceNumber", "Identifier", "Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.", 0, java.lang.Integer.MAX_VALUE, traceNumber);
5006          case 1099842588: /*revenue*/  return new Property("revenue", "CodeableConcept", "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue);
5007          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "Code to identify the general type of benefits under which products and services are provided.", 0, 1, category);
5008          case 1957227299: /*productOrService*/  return new Property("productOrService", "CodeableConcept", "When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.", 0, 1, productOrService);
5009          case -717476168: /*productOrServiceEnd*/  return new Property("productOrServiceEnd", "CodeableConcept", "This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.", 0, 1, productOrServiceEnd);
5010          case 1095692943: /*request*/  return new Property("request", "Reference(DeviceRequest|MedicationRequest|NutritionOrder|ServiceRequest|SupplyRequest|VisionPrescription)", "Request or Referral for Goods or Service to be rendered.", 0, java.lang.Integer.MAX_VALUE, request);
5011          case -615513385: /*modifier*/  return new Property("modifier", "CodeableConcept", "Item typification or modifiers codes to convey additional context for the product or service.", 0, java.lang.Integer.MAX_VALUE, modifier);
5012          case 1010065041: /*programCode*/  return new Property("programCode", "CodeableConcept", "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode);
5013          case -1927922223: /*serviced[x]*/  return new Property("serviced[x]", "date|Period", "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5014          case 1379209295: /*serviced*/  return new Property("serviced[x]", "date|Period", "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5015          case 363246749: /*servicedDate*/  return new Property("serviced[x]", "date", "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5016          case 1534966512: /*servicedPeriod*/  return new Property("serviced[x]", "Period", "The date or dates when the service or product was supplied, performed or completed.", 0, 1, serviced);
5017          case 552316075: /*location[x]*/  return new Property("location[x]", "CodeableConcept|Address|Reference(Location)", "Where the product or service was provided.", 0, 1, location);
5018          case 1901043637: /*location*/  return new Property("location[x]", "CodeableConcept|Address|Reference(Location)", "Where the product or service was provided.", 0, 1, location);
5019          case -1224800468: /*locationCodeableConcept*/  return new Property("location[x]", "CodeableConcept", "Where the product or service was provided.", 0, 1, location);
5020          case -1280020865: /*locationAddress*/  return new Property("location[x]", "Address", "Where the product or service was provided.", 0, 1, location);
5021          case 755866390: /*locationReference*/  return new Property("location[x]", "Reference(Location)", "Where the product or service was provided.", 0, 1, location);
5022          case 525514609: /*patientPaid*/  return new Property("patientPaid", "Money", "The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.", 0, 1, patientPaid);
5023          case -1285004149: /*quantity*/  return new Property("quantity", "Quantity", "The number of repetitions of a service or product.", 0, 1, quantity);
5024          case -486196699: /*unitPrice*/  return new Property("unitPrice", "Money", "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.", 0, 1, unitPrice);
5025          case -1282148017: /*factor*/  return new Property("factor", "decimal", "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.", 0, 1, factor);
5026          case 114603: /*tax*/  return new Property("tax", "Money", "The total of taxes applicable for this product or service.", 0, 1, tax);
5027          case 108957: /*net*/  return new Property("net", "Money", "The total amount claimed for the group (if a grouper) or the line item. Net = unit price * quantity * factor.", 0, 1, net);
5028          case 115642: /*udi*/  return new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
5029          case 1702620169: /*bodySite*/  return new Property("bodySite", "", "Physical location where the service is performed or applies.", 0, java.lang.Integer.MAX_VALUE, bodySite);
5030          case 1524132147: /*encounter*/  return new Property("encounter", "Reference(Encounter)", "Healthcare encounters related to this claim.", 0, java.lang.Integer.MAX_VALUE, encounter);
5031          case -1110033957: /*noteNumber*/  return new Property("noteNumber", "positiveInt", "The numbers associated with notes below which apply to the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, noteNumber);
5032          case -51825446: /*reviewOutcome*/  return new Property("reviewOutcome", "", "The high-level results of the adjudication if adjudication has been performed.", 0, 1, reviewOutcome);
5033          case -231349275: /*adjudication*/  return new Property("adjudication", "", "If this item is a group then the values here are a summary of the adjudication of the detail items. If this item is a simple product or service then this is the result of the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, adjudication);
5034          case -1335224239: /*detail*/  return new Property("detail", "", "Second-tier of goods and services.", 0, java.lang.Integer.MAX_VALUE, detail);
5035          default: return super.getNamedProperty(_hash, _name, _checkValid);
5036          }
5037
5038        }
5039
5040      @Override
5041      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5042        switch (hash) {
5043        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
5044        case 1070083823: /*careTeamSequence*/ return this.careTeamSequence == null ? new Base[0] : this.careTeamSequence.toArray(new Base[this.careTeamSequence.size()]); // PositiveIntType
5045        case -909769262: /*diagnosisSequence*/ return this.diagnosisSequence == null ? new Base[0] : this.diagnosisSequence.toArray(new Base[this.diagnosisSequence.size()]); // PositiveIntType
5046        case -808920140: /*procedureSequence*/ return this.procedureSequence == null ? new Base[0] : this.procedureSequence.toArray(new Base[this.procedureSequence.size()]); // PositiveIntType
5047        case -702585587: /*informationSequence*/ return this.informationSequence == null ? new Base[0] : this.informationSequence.toArray(new Base[this.informationSequence.size()]); // PositiveIntType
5048        case 82505966: /*traceNumber*/ return this.traceNumber == null ? new Base[0] : this.traceNumber.toArray(new Base[this.traceNumber.size()]); // Identifier
5049        case 1099842588: /*revenue*/ return this.revenue == null ? new Base[0] : new Base[] {this.revenue}; // CodeableConcept
5050        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
5051        case 1957227299: /*productOrService*/ return this.productOrService == null ? new Base[0] : new Base[] {this.productOrService}; // CodeableConcept
5052        case -717476168: /*productOrServiceEnd*/ return this.productOrServiceEnd == null ? new Base[0] : new Base[] {this.productOrServiceEnd}; // CodeableConcept
5053        case 1095692943: /*request*/ return this.request == null ? new Base[0] : this.request.toArray(new Base[this.request.size()]); // Reference
5054        case -615513385: /*modifier*/ return this.modifier == null ? new Base[0] : this.modifier.toArray(new Base[this.modifier.size()]); // CodeableConcept
5055        case 1010065041: /*programCode*/ return this.programCode == null ? new Base[0] : this.programCode.toArray(new Base[this.programCode.size()]); // CodeableConcept
5056        case 1379209295: /*serviced*/ return this.serviced == null ? new Base[0] : new Base[] {this.serviced}; // DataType
5057        case 1901043637: /*location*/ return this.location == null ? new Base[0] : new Base[] {this.location}; // DataType
5058        case 525514609: /*patientPaid*/ return this.patientPaid == null ? new Base[0] : new Base[] {this.patientPaid}; // Money
5059        case -1285004149: /*quantity*/ return this.quantity == null ? new Base[0] : new Base[] {this.quantity}; // Quantity
5060        case -486196699: /*unitPrice*/ return this.unitPrice == null ? new Base[0] : new Base[] {this.unitPrice}; // Money
5061        case -1282148017: /*factor*/ return this.factor == null ? new Base[0] : new Base[] {this.factor}; // DecimalType
5062        case 114603: /*tax*/ return this.tax == null ? new Base[0] : new Base[] {this.tax}; // Money
5063        case 108957: /*net*/ return this.net == null ? new Base[0] : new Base[] {this.net}; // Money
5064        case 115642: /*udi*/ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
5065        case 1702620169: /*bodySite*/ return this.bodySite == null ? new Base[0] : this.bodySite.toArray(new Base[this.bodySite.size()]); // ItemBodySiteComponent
5066        case 1524132147: /*encounter*/ return this.encounter == null ? new Base[0] : this.encounter.toArray(new Base[this.encounter.size()]); // Reference
5067        case -1110033957: /*noteNumber*/ return this.noteNumber == null ? new Base[0] : this.noteNumber.toArray(new Base[this.noteNumber.size()]); // PositiveIntType
5068        case -51825446: /*reviewOutcome*/ return this.reviewOutcome == null ? new Base[0] : new Base[] {this.reviewOutcome}; // ItemReviewOutcomeComponent
5069        case -231349275: /*adjudication*/ return this.adjudication == null ? new Base[0] : this.adjudication.toArray(new Base[this.adjudication.size()]); // AdjudicationComponent
5070        case -1335224239: /*detail*/ return this.detail == null ? new Base[0] : this.detail.toArray(new Base[this.detail.size()]); // DetailComponent
5071        default: return super.getProperty(hash, name, checkValid);
5072        }
5073
5074      }
5075
5076      @Override
5077      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5078        switch (hash) {
5079        case 1349547969: // sequence
5080          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
5081          return value;
5082        case 1070083823: // careTeamSequence
5083          this.getCareTeamSequence().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
5084          return value;
5085        case -909769262: // diagnosisSequence
5086          this.getDiagnosisSequence().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
5087          return value;
5088        case -808920140: // procedureSequence
5089          this.getProcedureSequence().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
5090          return value;
5091        case -702585587: // informationSequence
5092          this.getInformationSequence().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
5093          return value;
5094        case 82505966: // traceNumber
5095          this.getTraceNumber().add(TypeConvertor.castToIdentifier(value)); // Identifier
5096          return value;
5097        case 1099842588: // revenue
5098          this.revenue = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5099          return value;
5100        case 50511102: // category
5101          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5102          return value;
5103        case 1957227299: // productOrService
5104          this.productOrService = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5105          return value;
5106        case -717476168: // productOrServiceEnd
5107          this.productOrServiceEnd = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5108          return value;
5109        case 1095692943: // request
5110          this.getRequest().add(TypeConvertor.castToReference(value)); // Reference
5111          return value;
5112        case -615513385: // modifier
5113          this.getModifier().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
5114          return value;
5115        case 1010065041: // programCode
5116          this.getProgramCode().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
5117          return value;
5118        case 1379209295: // serviced
5119          this.serviced = TypeConvertor.castToType(value); // DataType
5120          return value;
5121        case 1901043637: // location
5122          this.location = TypeConvertor.castToType(value); // DataType
5123          return value;
5124        case 525514609: // patientPaid
5125          this.patientPaid = TypeConvertor.castToMoney(value); // Money
5126          return value;
5127        case -1285004149: // quantity
5128          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
5129          return value;
5130        case -486196699: // unitPrice
5131          this.unitPrice = TypeConvertor.castToMoney(value); // Money
5132          return value;
5133        case -1282148017: // factor
5134          this.factor = TypeConvertor.castToDecimal(value); // DecimalType
5135          return value;
5136        case 114603: // tax
5137          this.tax = TypeConvertor.castToMoney(value); // Money
5138          return value;
5139        case 108957: // net
5140          this.net = TypeConvertor.castToMoney(value); // Money
5141          return value;
5142        case 115642: // udi
5143          this.getUdi().add(TypeConvertor.castToReference(value)); // Reference
5144          return value;
5145        case 1702620169: // bodySite
5146          this.getBodySite().add((ItemBodySiteComponent) value); // ItemBodySiteComponent
5147          return value;
5148        case 1524132147: // encounter
5149          this.getEncounter().add(TypeConvertor.castToReference(value)); // Reference
5150          return value;
5151        case -1110033957: // noteNumber
5152          this.getNoteNumber().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
5153          return value;
5154        case -51825446: // reviewOutcome
5155          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
5156          return value;
5157        case -231349275: // adjudication
5158          this.getAdjudication().add((AdjudicationComponent) value); // AdjudicationComponent
5159          return value;
5160        case -1335224239: // detail
5161          this.getDetail().add((DetailComponent) value); // DetailComponent
5162          return value;
5163        default: return super.setProperty(hash, name, value);
5164        }
5165
5166      }
5167
5168      @Override
5169      public Base setProperty(String name, Base value) throws FHIRException {
5170        if (name.equals("sequence")) {
5171          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
5172        } else if (name.equals("careTeamSequence")) {
5173          this.getCareTeamSequence().add(TypeConvertor.castToPositiveInt(value));
5174        } else if (name.equals("diagnosisSequence")) {
5175          this.getDiagnosisSequence().add(TypeConvertor.castToPositiveInt(value));
5176        } else if (name.equals("procedureSequence")) {
5177          this.getProcedureSequence().add(TypeConvertor.castToPositiveInt(value));
5178        } else if (name.equals("informationSequence")) {
5179          this.getInformationSequence().add(TypeConvertor.castToPositiveInt(value));
5180        } else if (name.equals("traceNumber")) {
5181          this.getTraceNumber().add(TypeConvertor.castToIdentifier(value));
5182        } else if (name.equals("revenue")) {
5183          this.revenue = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5184        } else if (name.equals("category")) {
5185          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5186        } else if (name.equals("productOrService")) {
5187          this.productOrService = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5188        } else if (name.equals("productOrServiceEnd")) {
5189          this.productOrServiceEnd = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5190        } else if (name.equals("request")) {
5191          this.getRequest().add(TypeConvertor.castToReference(value));
5192        } else if (name.equals("modifier")) {
5193          this.getModifier().add(TypeConvertor.castToCodeableConcept(value));
5194        } else if (name.equals("programCode")) {
5195          this.getProgramCode().add(TypeConvertor.castToCodeableConcept(value));
5196        } else if (name.equals("serviced[x]")) {
5197          this.serviced = TypeConvertor.castToType(value); // DataType
5198        } else if (name.equals("location[x]")) {
5199          this.location = TypeConvertor.castToType(value); // DataType
5200        } else if (name.equals("patientPaid")) {
5201          this.patientPaid = TypeConvertor.castToMoney(value); // Money
5202        } else if (name.equals("quantity")) {
5203          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
5204        } else if (name.equals("unitPrice")) {
5205          this.unitPrice = TypeConvertor.castToMoney(value); // Money
5206        } else if (name.equals("factor")) {
5207          this.factor = TypeConvertor.castToDecimal(value); // DecimalType
5208        } else if (name.equals("tax")) {
5209          this.tax = TypeConvertor.castToMoney(value); // Money
5210        } else if (name.equals("net")) {
5211          this.net = TypeConvertor.castToMoney(value); // Money
5212        } else if (name.equals("udi")) {
5213          this.getUdi().add(TypeConvertor.castToReference(value));
5214        } else if (name.equals("bodySite")) {
5215          this.getBodySite().add((ItemBodySiteComponent) value);
5216        } else if (name.equals("encounter")) {
5217          this.getEncounter().add(TypeConvertor.castToReference(value));
5218        } else if (name.equals("noteNumber")) {
5219          this.getNoteNumber().add(TypeConvertor.castToPositiveInt(value));
5220        } else if (name.equals("reviewOutcome")) {
5221          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
5222        } else if (name.equals("adjudication")) {
5223          this.getAdjudication().add((AdjudicationComponent) value);
5224        } else if (name.equals("detail")) {
5225          this.getDetail().add((DetailComponent) value);
5226        } else
5227          return super.setProperty(name, value);
5228        return value;
5229      }
5230
5231  @Override
5232  public void removeChild(String name, Base value) throws FHIRException {
5233        if (name.equals("sequence")) {
5234          this.sequence = null;
5235        } else if (name.equals("careTeamSequence")) {
5236          this.getCareTeamSequence().remove(value);
5237        } else if (name.equals("diagnosisSequence")) {
5238          this.getDiagnosisSequence().remove(value);
5239        } else if (name.equals("procedureSequence")) {
5240          this.getProcedureSequence().remove(value);
5241        } else if (name.equals("informationSequence")) {
5242          this.getInformationSequence().remove(value);
5243        } else if (name.equals("traceNumber")) {
5244          this.getTraceNumber().remove(value);
5245        } else if (name.equals("revenue")) {
5246          this.revenue = null;
5247        } else if (name.equals("category")) {
5248          this.category = null;
5249        } else if (name.equals("productOrService")) {
5250          this.productOrService = null;
5251        } else if (name.equals("productOrServiceEnd")) {
5252          this.productOrServiceEnd = null;
5253        } else if (name.equals("request")) {
5254          this.getRequest().remove(value);
5255        } else if (name.equals("modifier")) {
5256          this.getModifier().remove(value);
5257        } else if (name.equals("programCode")) {
5258          this.getProgramCode().remove(value);
5259        } else if (name.equals("serviced[x]")) {
5260          this.serviced = null;
5261        } else if (name.equals("location[x]")) {
5262          this.location = null;
5263        } else if (name.equals("patientPaid")) {
5264          this.patientPaid = null;
5265        } else if (name.equals("quantity")) {
5266          this.quantity = null;
5267        } else if (name.equals("unitPrice")) {
5268          this.unitPrice = null;
5269        } else if (name.equals("factor")) {
5270          this.factor = null;
5271        } else if (name.equals("tax")) {
5272          this.tax = null;
5273        } else if (name.equals("net")) {
5274          this.net = null;
5275        } else if (name.equals("udi")) {
5276          this.getUdi().remove(value);
5277        } else if (name.equals("bodySite")) {
5278          this.getBodySite().remove((ItemBodySiteComponent) value);
5279        } else if (name.equals("encounter")) {
5280          this.getEncounter().remove(value);
5281        } else if (name.equals("noteNumber")) {
5282          this.getNoteNumber().remove(value);
5283        } else if (name.equals("reviewOutcome")) {
5284          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
5285        } else if (name.equals("adjudication")) {
5286          this.getAdjudication().remove((AdjudicationComponent) value);
5287        } else if (name.equals("detail")) {
5288          this.getDetail().remove((DetailComponent) value);
5289        } else
5290          super.removeChild(name, value);
5291        
5292      }
5293
5294      @Override
5295      public Base makeProperty(int hash, String name) throws FHIRException {
5296        switch (hash) {
5297        case 1349547969:  return getSequenceElement();
5298        case 1070083823:  return addCareTeamSequenceElement();
5299        case -909769262:  return addDiagnosisSequenceElement();
5300        case -808920140:  return addProcedureSequenceElement();
5301        case -702585587:  return addInformationSequenceElement();
5302        case 82505966:  return addTraceNumber(); 
5303        case 1099842588:  return getRevenue();
5304        case 50511102:  return getCategory();
5305        case 1957227299:  return getProductOrService();
5306        case -717476168:  return getProductOrServiceEnd();
5307        case 1095692943:  return addRequest(); 
5308        case -615513385:  return addModifier(); 
5309        case 1010065041:  return addProgramCode(); 
5310        case -1927922223:  return getServiced();
5311        case 1379209295:  return getServiced();
5312        case 552316075:  return getLocation();
5313        case 1901043637:  return getLocation();
5314        case 525514609:  return getPatientPaid();
5315        case -1285004149:  return getQuantity();
5316        case -486196699:  return getUnitPrice();
5317        case -1282148017:  return getFactorElement();
5318        case 114603:  return getTax();
5319        case 108957:  return getNet();
5320        case 115642:  return addUdi(); 
5321        case 1702620169:  return addBodySite(); 
5322        case 1524132147:  return addEncounter(); 
5323        case -1110033957:  return addNoteNumberElement();
5324        case -51825446:  return getReviewOutcome();
5325        case -231349275:  return addAdjudication(); 
5326        case -1335224239:  return addDetail(); 
5327        default: return super.makeProperty(hash, name);
5328        }
5329
5330      }
5331
5332      @Override
5333      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5334        switch (hash) {
5335        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
5336        case 1070083823: /*careTeamSequence*/ return new String[] {"positiveInt"};
5337        case -909769262: /*diagnosisSequence*/ return new String[] {"positiveInt"};
5338        case -808920140: /*procedureSequence*/ return new String[] {"positiveInt"};
5339        case -702585587: /*informationSequence*/ return new String[] {"positiveInt"};
5340        case 82505966: /*traceNumber*/ return new String[] {"Identifier"};
5341        case 1099842588: /*revenue*/ return new String[] {"CodeableConcept"};
5342        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
5343        case 1957227299: /*productOrService*/ return new String[] {"CodeableConcept"};
5344        case -717476168: /*productOrServiceEnd*/ return new String[] {"CodeableConcept"};
5345        case 1095692943: /*request*/ return new String[] {"Reference"};
5346        case -615513385: /*modifier*/ return new String[] {"CodeableConcept"};
5347        case 1010065041: /*programCode*/ return new String[] {"CodeableConcept"};
5348        case 1379209295: /*serviced*/ return new String[] {"date", "Period"};
5349        case 1901043637: /*location*/ return new String[] {"CodeableConcept", "Address", "Reference"};
5350        case 525514609: /*patientPaid*/ return new String[] {"Money"};
5351        case -1285004149: /*quantity*/ return new String[] {"Quantity"};
5352        case -486196699: /*unitPrice*/ return new String[] {"Money"};
5353        case -1282148017: /*factor*/ return new String[] {"decimal"};
5354        case 114603: /*tax*/ return new String[] {"Money"};
5355        case 108957: /*net*/ return new String[] {"Money"};
5356        case 115642: /*udi*/ return new String[] {"Reference"};
5357        case 1702620169: /*bodySite*/ return new String[] {};
5358        case 1524132147: /*encounter*/ return new String[] {"Reference"};
5359        case -1110033957: /*noteNumber*/ return new String[] {"positiveInt"};
5360        case -51825446: /*reviewOutcome*/ return new String[] {};
5361        case -231349275: /*adjudication*/ return new String[] {};
5362        case -1335224239: /*detail*/ return new String[] {};
5363        default: return super.getTypesForProperty(hash, name);
5364        }
5365
5366      }
5367
5368      @Override
5369      public Base addChild(String name) throws FHIRException {
5370        if (name.equals("sequence")) {
5371          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.sequence");
5372        }
5373        else if (name.equals("careTeamSequence")) {
5374          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.careTeamSequence");
5375        }
5376        else if (name.equals("diagnosisSequence")) {
5377          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.diagnosisSequence");
5378        }
5379        else if (name.equals("procedureSequence")) {
5380          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.procedureSequence");
5381        }
5382        else if (name.equals("informationSequence")) {
5383          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.informationSequence");
5384        }
5385        else if (name.equals("traceNumber")) {
5386          return addTraceNumber();
5387        }
5388        else if (name.equals("revenue")) {
5389          this.revenue = new CodeableConcept();
5390          return this.revenue;
5391        }
5392        else if (name.equals("category")) {
5393          this.category = new CodeableConcept();
5394          return this.category;
5395        }
5396        else if (name.equals("productOrService")) {
5397          this.productOrService = new CodeableConcept();
5398          return this.productOrService;
5399        }
5400        else if (name.equals("productOrServiceEnd")) {
5401          this.productOrServiceEnd = new CodeableConcept();
5402          return this.productOrServiceEnd;
5403        }
5404        else if (name.equals("request")) {
5405          return addRequest();
5406        }
5407        else if (name.equals("modifier")) {
5408          return addModifier();
5409        }
5410        else if (name.equals("programCode")) {
5411          return addProgramCode();
5412        }
5413        else if (name.equals("servicedDate")) {
5414          this.serviced = new DateType();
5415          return this.serviced;
5416        }
5417        else if (name.equals("servicedPeriod")) {
5418          this.serviced = new Period();
5419          return this.serviced;
5420        }
5421        else if (name.equals("locationCodeableConcept")) {
5422          this.location = new CodeableConcept();
5423          return this.location;
5424        }
5425        else if (name.equals("locationAddress")) {
5426          this.location = new Address();
5427          return this.location;
5428        }
5429        else if (name.equals("locationReference")) {
5430          this.location = new Reference();
5431          return this.location;
5432        }
5433        else if (name.equals("patientPaid")) {
5434          this.patientPaid = new Money();
5435          return this.patientPaid;
5436        }
5437        else if (name.equals("quantity")) {
5438          this.quantity = new Quantity();
5439          return this.quantity;
5440        }
5441        else if (name.equals("unitPrice")) {
5442          this.unitPrice = new Money();
5443          return this.unitPrice;
5444        }
5445        else if (name.equals("factor")) {
5446          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.factor");
5447        }
5448        else if (name.equals("tax")) {
5449          this.tax = new Money();
5450          return this.tax;
5451        }
5452        else if (name.equals("net")) {
5453          this.net = new Money();
5454          return this.net;
5455        }
5456        else if (name.equals("udi")) {
5457          return addUdi();
5458        }
5459        else if (name.equals("bodySite")) {
5460          return addBodySite();
5461        }
5462        else if (name.equals("encounter")) {
5463          return addEncounter();
5464        }
5465        else if (name.equals("noteNumber")) {
5466          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.noteNumber");
5467        }
5468        else if (name.equals("reviewOutcome")) {
5469          this.reviewOutcome = new ItemReviewOutcomeComponent();
5470          return this.reviewOutcome;
5471        }
5472        else if (name.equals("adjudication")) {
5473          return addAdjudication();
5474        }
5475        else if (name.equals("detail")) {
5476          return addDetail();
5477        }
5478        else
5479          return super.addChild(name);
5480      }
5481
5482      public ItemComponent copy() {
5483        ItemComponent dst = new ItemComponent();
5484        copyValues(dst);
5485        return dst;
5486      }
5487
5488      public void copyValues(ItemComponent dst) {
5489        super.copyValues(dst);
5490        dst.sequence = sequence == null ? null : sequence.copy();
5491        if (careTeamSequence != null) {
5492          dst.careTeamSequence = new ArrayList<PositiveIntType>();
5493          for (PositiveIntType i : careTeamSequence)
5494            dst.careTeamSequence.add(i.copy());
5495        };
5496        if (diagnosisSequence != null) {
5497          dst.diagnosisSequence = new ArrayList<PositiveIntType>();
5498          for (PositiveIntType i : diagnosisSequence)
5499            dst.diagnosisSequence.add(i.copy());
5500        };
5501        if (procedureSequence != null) {
5502          dst.procedureSequence = new ArrayList<PositiveIntType>();
5503          for (PositiveIntType i : procedureSequence)
5504            dst.procedureSequence.add(i.copy());
5505        };
5506        if (informationSequence != null) {
5507          dst.informationSequence = new ArrayList<PositiveIntType>();
5508          for (PositiveIntType i : informationSequence)
5509            dst.informationSequence.add(i.copy());
5510        };
5511        if (traceNumber != null) {
5512          dst.traceNumber = new ArrayList<Identifier>();
5513          for (Identifier i : traceNumber)
5514            dst.traceNumber.add(i.copy());
5515        };
5516        dst.revenue = revenue == null ? null : revenue.copy();
5517        dst.category = category == null ? null : category.copy();
5518        dst.productOrService = productOrService == null ? null : productOrService.copy();
5519        dst.productOrServiceEnd = productOrServiceEnd == null ? null : productOrServiceEnd.copy();
5520        if (request != null) {
5521          dst.request = new ArrayList<Reference>();
5522          for (Reference i : request)
5523            dst.request.add(i.copy());
5524        };
5525        if (modifier != null) {
5526          dst.modifier = new ArrayList<CodeableConcept>();
5527          for (CodeableConcept i : modifier)
5528            dst.modifier.add(i.copy());
5529        };
5530        if (programCode != null) {
5531          dst.programCode = new ArrayList<CodeableConcept>();
5532          for (CodeableConcept i : programCode)
5533            dst.programCode.add(i.copy());
5534        };
5535        dst.serviced = serviced == null ? null : serviced.copy();
5536        dst.location = location == null ? null : location.copy();
5537        dst.patientPaid = patientPaid == null ? null : patientPaid.copy();
5538        dst.quantity = quantity == null ? null : quantity.copy();
5539        dst.unitPrice = unitPrice == null ? null : unitPrice.copy();
5540        dst.factor = factor == null ? null : factor.copy();
5541        dst.tax = tax == null ? null : tax.copy();
5542        dst.net = net == null ? null : net.copy();
5543        if (udi != null) {
5544          dst.udi = new ArrayList<Reference>();
5545          for (Reference i : udi)
5546            dst.udi.add(i.copy());
5547        };
5548        if (bodySite != null) {
5549          dst.bodySite = new ArrayList<ItemBodySiteComponent>();
5550          for (ItemBodySiteComponent i : bodySite)
5551            dst.bodySite.add(i.copy());
5552        };
5553        if (encounter != null) {
5554          dst.encounter = new ArrayList<Reference>();
5555          for (Reference i : encounter)
5556            dst.encounter.add(i.copy());
5557        };
5558        if (noteNumber != null) {
5559          dst.noteNumber = new ArrayList<PositiveIntType>();
5560          for (PositiveIntType i : noteNumber)
5561            dst.noteNumber.add(i.copy());
5562        };
5563        dst.reviewOutcome = reviewOutcome == null ? null : reviewOutcome.copy();
5564        if (adjudication != null) {
5565          dst.adjudication = new ArrayList<AdjudicationComponent>();
5566          for (AdjudicationComponent i : adjudication)
5567            dst.adjudication.add(i.copy());
5568        };
5569        if (detail != null) {
5570          dst.detail = new ArrayList<DetailComponent>();
5571          for (DetailComponent i : detail)
5572            dst.detail.add(i.copy());
5573        };
5574      }
5575
5576      @Override
5577      public boolean equalsDeep(Base other_) {
5578        if (!super.equalsDeep(other_))
5579          return false;
5580        if (!(other_ instanceof ItemComponent))
5581          return false;
5582        ItemComponent o = (ItemComponent) other_;
5583        return compareDeep(sequence, o.sequence, true) && compareDeep(careTeamSequence, o.careTeamSequence, true)
5584           && compareDeep(diagnosisSequence, o.diagnosisSequence, true) && compareDeep(procedureSequence, o.procedureSequence, true)
5585           && compareDeep(informationSequence, o.informationSequence, true) && compareDeep(traceNumber, o.traceNumber, true)
5586           && compareDeep(revenue, o.revenue, true) && compareDeep(category, o.category, true) && compareDeep(productOrService, o.productOrService, true)
5587           && compareDeep(productOrServiceEnd, o.productOrServiceEnd, true) && compareDeep(request, o.request, true)
5588           && compareDeep(modifier, o.modifier, true) && compareDeep(programCode, o.programCode, true) && compareDeep(serviced, o.serviced, true)
5589           && compareDeep(location, o.location, true) && compareDeep(patientPaid, o.patientPaid, true) && compareDeep(quantity, o.quantity, true)
5590           && compareDeep(unitPrice, o.unitPrice, true) && compareDeep(factor, o.factor, true) && compareDeep(tax, o.tax, true)
5591           && compareDeep(net, o.net, true) && compareDeep(udi, o.udi, true) && compareDeep(bodySite, o.bodySite, true)
5592           && compareDeep(encounter, o.encounter, true) && compareDeep(noteNumber, o.noteNumber, true) && compareDeep(reviewOutcome, o.reviewOutcome, true)
5593           && compareDeep(adjudication, o.adjudication, true) && compareDeep(detail, o.detail, true);
5594      }
5595
5596      @Override
5597      public boolean equalsShallow(Base other_) {
5598        if (!super.equalsShallow(other_))
5599          return false;
5600        if (!(other_ instanceof ItemComponent))
5601          return false;
5602        ItemComponent o = (ItemComponent) other_;
5603        return compareValues(sequence, o.sequence, true) && compareValues(careTeamSequence, o.careTeamSequence, true)
5604           && compareValues(diagnosisSequence, o.diagnosisSequence, true) && compareValues(procedureSequence, o.procedureSequence, true)
5605           && compareValues(informationSequence, o.informationSequence, true) && compareValues(factor, o.factor, true)
5606           && compareValues(noteNumber, o.noteNumber, true);
5607      }
5608
5609      public boolean isEmpty() {
5610        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, careTeamSequence
5611          , diagnosisSequence, procedureSequence, informationSequence, traceNumber, revenue
5612          , category, productOrService, productOrServiceEnd, request, modifier, programCode
5613          , serviced, location, patientPaid, quantity, unitPrice, factor, tax, net, udi
5614          , bodySite, encounter, noteNumber, reviewOutcome, adjudication, detail);
5615      }
5616
5617  public String fhirType() {
5618    return "ExplanationOfBenefit.item";
5619
5620  }
5621
5622  }
5623
5624    @Block()
5625    public static class ItemBodySiteComponent extends BackboneElement implements IBaseBackboneElement {
5626        /**
5627         * Physical service site on the patient (limb, tooth, etc.).
5628         */
5629        @Child(name = "site", type = {CodeableReference.class}, order=1, min=1, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
5630        @Description(shortDefinition="Location", formalDefinition="Physical service site on the patient (limb, tooth, etc.)." )
5631        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/tooth")
5632        protected List<CodeableReference> site;
5633
5634        /**
5635         * A region or surface of the bodySite, e.g. limb region or tooth surface(s).
5636         */
5637        @Child(name = "subSite", type = {CodeableConcept.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
5638        @Description(shortDefinition="Sub-location", formalDefinition="A region or surface of the bodySite, e.g. limb region or tooth surface(s)." )
5639        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/surface")
5640        protected List<CodeableConcept> subSite;
5641
5642        private static final long serialVersionUID = 1190632415L;
5643
5644    /**
5645     * Constructor
5646     */
5647      public ItemBodySiteComponent() {
5648        super();
5649      }
5650
5651    /**
5652     * Constructor
5653     */
5654      public ItemBodySiteComponent(CodeableReference site) {
5655        super();
5656        this.addSite(site);
5657      }
5658
5659        /**
5660         * @return {@link #site} (Physical service site on the patient (limb, tooth, etc.).)
5661         */
5662        public List<CodeableReference> getSite() { 
5663          if (this.site == null)
5664            this.site = new ArrayList<CodeableReference>();
5665          return this.site;
5666        }
5667
5668        /**
5669         * @return Returns a reference to <code>this</code> for easy method chaining
5670         */
5671        public ItemBodySiteComponent setSite(List<CodeableReference> theSite) { 
5672          this.site = theSite;
5673          return this;
5674        }
5675
5676        public boolean hasSite() { 
5677          if (this.site == null)
5678            return false;
5679          for (CodeableReference item : this.site)
5680            if (!item.isEmpty())
5681              return true;
5682          return false;
5683        }
5684
5685        public CodeableReference addSite() { //3
5686          CodeableReference t = new CodeableReference();
5687          if (this.site == null)
5688            this.site = new ArrayList<CodeableReference>();
5689          this.site.add(t);
5690          return t;
5691        }
5692
5693        public ItemBodySiteComponent addSite(CodeableReference t) { //3
5694          if (t == null)
5695            return this;
5696          if (this.site == null)
5697            this.site = new ArrayList<CodeableReference>();
5698          this.site.add(t);
5699          return this;
5700        }
5701
5702        /**
5703         * @return The first repetition of repeating field {@link #site}, creating it if it does not already exist {3}
5704         */
5705        public CodeableReference getSiteFirstRep() { 
5706          if (getSite().isEmpty()) {
5707            addSite();
5708          }
5709          return getSite().get(0);
5710        }
5711
5712        /**
5713         * @return {@link #subSite} (A region or surface of the bodySite, e.g. limb region or tooth surface(s).)
5714         */
5715        public List<CodeableConcept> getSubSite() { 
5716          if (this.subSite == null)
5717            this.subSite = new ArrayList<CodeableConcept>();
5718          return this.subSite;
5719        }
5720
5721        /**
5722         * @return Returns a reference to <code>this</code> for easy method chaining
5723         */
5724        public ItemBodySiteComponent setSubSite(List<CodeableConcept> theSubSite) { 
5725          this.subSite = theSubSite;
5726          return this;
5727        }
5728
5729        public boolean hasSubSite() { 
5730          if (this.subSite == null)
5731            return false;
5732          for (CodeableConcept item : this.subSite)
5733            if (!item.isEmpty())
5734              return true;
5735          return false;
5736        }
5737
5738        public CodeableConcept addSubSite() { //3
5739          CodeableConcept t = new CodeableConcept();
5740          if (this.subSite == null)
5741            this.subSite = new ArrayList<CodeableConcept>();
5742          this.subSite.add(t);
5743          return t;
5744        }
5745
5746        public ItemBodySiteComponent addSubSite(CodeableConcept t) { //3
5747          if (t == null)
5748            return this;
5749          if (this.subSite == null)
5750            this.subSite = new ArrayList<CodeableConcept>();
5751          this.subSite.add(t);
5752          return this;
5753        }
5754
5755        /**
5756         * @return The first repetition of repeating field {@link #subSite}, creating it if it does not already exist {3}
5757         */
5758        public CodeableConcept getSubSiteFirstRep() { 
5759          if (getSubSite().isEmpty()) {
5760            addSubSite();
5761          }
5762          return getSubSite().get(0);
5763        }
5764
5765        protected void listChildren(List<Property> children) {
5766          super.listChildren(children);
5767          children.add(new Property("site", "CodeableReference(BodyStructure)", "Physical service site on the patient (limb, tooth, etc.).", 0, java.lang.Integer.MAX_VALUE, site));
5768          children.add(new Property("subSite", "CodeableConcept", "A region or surface of the bodySite, e.g. limb region or tooth surface(s).", 0, java.lang.Integer.MAX_VALUE, subSite));
5769        }
5770
5771        @Override
5772        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5773          switch (_hash) {
5774          case 3530567: /*site*/  return new Property("site", "CodeableReference(BodyStructure)", "Physical service site on the patient (limb, tooth, etc.).", 0, java.lang.Integer.MAX_VALUE, site);
5775          case -1868566105: /*subSite*/  return new Property("subSite", "CodeableConcept", "A region or surface of the bodySite, e.g. limb region or tooth surface(s).", 0, java.lang.Integer.MAX_VALUE, subSite);
5776          default: return super.getNamedProperty(_hash, _name, _checkValid);
5777          }
5778
5779        }
5780
5781      @Override
5782      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5783        switch (hash) {
5784        case 3530567: /*site*/ return this.site == null ? new Base[0] : this.site.toArray(new Base[this.site.size()]); // CodeableReference
5785        case -1868566105: /*subSite*/ return this.subSite == null ? new Base[0] : this.subSite.toArray(new Base[this.subSite.size()]); // CodeableConcept
5786        default: return super.getProperty(hash, name, checkValid);
5787        }
5788
5789      }
5790
5791      @Override
5792      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5793        switch (hash) {
5794        case 3530567: // site
5795          this.getSite().add(TypeConvertor.castToCodeableReference(value)); // CodeableReference
5796          return value;
5797        case -1868566105: // subSite
5798          this.getSubSite().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
5799          return value;
5800        default: return super.setProperty(hash, name, value);
5801        }
5802
5803      }
5804
5805      @Override
5806      public Base setProperty(String name, Base value) throws FHIRException {
5807        if (name.equals("site")) {
5808          this.getSite().add(TypeConvertor.castToCodeableReference(value));
5809        } else if (name.equals("subSite")) {
5810          this.getSubSite().add(TypeConvertor.castToCodeableConcept(value));
5811        } else
5812          return super.setProperty(name, value);
5813        return value;
5814      }
5815
5816  @Override
5817  public void removeChild(String name, Base value) throws FHIRException {
5818        if (name.equals("site")) {
5819          this.getSite().remove(value);
5820        } else if (name.equals("subSite")) {
5821          this.getSubSite().remove(value);
5822        } else
5823          super.removeChild(name, value);
5824        
5825      }
5826
5827      @Override
5828      public Base makeProperty(int hash, String name) throws FHIRException {
5829        switch (hash) {
5830        case 3530567:  return addSite(); 
5831        case -1868566105:  return addSubSite(); 
5832        default: return super.makeProperty(hash, name);
5833        }
5834
5835      }
5836
5837      @Override
5838      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5839        switch (hash) {
5840        case 3530567: /*site*/ return new String[] {"CodeableReference"};
5841        case -1868566105: /*subSite*/ return new String[] {"CodeableConcept"};
5842        default: return super.getTypesForProperty(hash, name);
5843        }
5844
5845      }
5846
5847      @Override
5848      public Base addChild(String name) throws FHIRException {
5849        if (name.equals("site")) {
5850          return addSite();
5851        }
5852        else if (name.equals("subSite")) {
5853          return addSubSite();
5854        }
5855        else
5856          return super.addChild(name);
5857      }
5858
5859      public ItemBodySiteComponent copy() {
5860        ItemBodySiteComponent dst = new ItemBodySiteComponent();
5861        copyValues(dst);
5862        return dst;
5863      }
5864
5865      public void copyValues(ItemBodySiteComponent dst) {
5866        super.copyValues(dst);
5867        if (site != null) {
5868          dst.site = new ArrayList<CodeableReference>();
5869          for (CodeableReference i : site)
5870            dst.site.add(i.copy());
5871        };
5872        if (subSite != null) {
5873          dst.subSite = new ArrayList<CodeableConcept>();
5874          for (CodeableConcept i : subSite)
5875            dst.subSite.add(i.copy());
5876        };
5877      }
5878
5879      @Override
5880      public boolean equalsDeep(Base other_) {
5881        if (!super.equalsDeep(other_))
5882          return false;
5883        if (!(other_ instanceof ItemBodySiteComponent))
5884          return false;
5885        ItemBodySiteComponent o = (ItemBodySiteComponent) other_;
5886        return compareDeep(site, o.site, true) && compareDeep(subSite, o.subSite, true);
5887      }
5888
5889      @Override
5890      public boolean equalsShallow(Base other_) {
5891        if (!super.equalsShallow(other_))
5892          return false;
5893        if (!(other_ instanceof ItemBodySiteComponent))
5894          return false;
5895        ItemBodySiteComponent o = (ItemBodySiteComponent) other_;
5896        return true;
5897      }
5898
5899      public boolean isEmpty() {
5900        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(site, subSite);
5901      }
5902
5903  public String fhirType() {
5904    return "ExplanationOfBenefit.item.bodySite";
5905
5906  }
5907
5908  }
5909
5910    @Block()
5911    public static class ItemReviewOutcomeComponent extends BackboneElement implements IBaseBackboneElement {
5912        /**
5913         * The result of the claim, predetermination, or preauthorization adjudication.
5914         */
5915        @Child(name = "decision", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=false)
5916        @Description(shortDefinition="Result of the adjudication", formalDefinition="The result of the claim, predetermination, or preauthorization adjudication." )
5917        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-decision")
5918        protected CodeableConcept decision;
5919
5920        /**
5921         * The reasons for the result of the claim, predetermination, or preauthorization adjudication.
5922         */
5923        @Child(name = "reason", type = {CodeableConcept.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
5924        @Description(shortDefinition="Reason for result of the adjudication", formalDefinition="The reasons for the result of the claim, predetermination, or preauthorization adjudication." )
5925        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-decision-reason")
5926        protected List<CodeableConcept> reason;
5927
5928        /**
5929         * Reference from the Insurer which is used in later communications which refers to this adjudication.
5930         */
5931        @Child(name = "preAuthRef", type = {StringType.class}, order=3, min=0, max=1, modifier=false, summary=false)
5932        @Description(shortDefinition="Preauthorization reference", formalDefinition="Reference from the Insurer which is used in later communications which refers to this adjudication." )
5933        protected StringType preAuthRef;
5934
5935        /**
5936         * The time frame during which this authorization is effective.
5937         */
5938        @Child(name = "preAuthPeriod", type = {Period.class}, order=4, min=0, max=1, modifier=false, summary=false)
5939        @Description(shortDefinition="Preauthorization reference effective period", formalDefinition="The time frame during which this authorization is effective." )
5940        protected Period preAuthPeriod;
5941
5942        private static final long serialVersionUID = 2126097594L;
5943
5944    /**
5945     * Constructor
5946     */
5947      public ItemReviewOutcomeComponent() {
5948        super();
5949      }
5950
5951        /**
5952         * @return {@link #decision} (The result of the claim, predetermination, or preauthorization adjudication.)
5953         */
5954        public CodeableConcept getDecision() { 
5955          if (this.decision == null)
5956            if (Configuration.errorOnAutoCreate())
5957              throw new Error("Attempt to auto-create ItemReviewOutcomeComponent.decision");
5958            else if (Configuration.doAutoCreate())
5959              this.decision = new CodeableConcept(); // cc
5960          return this.decision;
5961        }
5962
5963        public boolean hasDecision() { 
5964          return this.decision != null && !this.decision.isEmpty();
5965        }
5966
5967        /**
5968         * @param value {@link #decision} (The result of the claim, predetermination, or preauthorization adjudication.)
5969         */
5970        public ItemReviewOutcomeComponent setDecision(CodeableConcept value) { 
5971          this.decision = value;
5972          return this;
5973        }
5974
5975        /**
5976         * @return {@link #reason} (The reasons for the result of the claim, predetermination, or preauthorization adjudication.)
5977         */
5978        public List<CodeableConcept> getReason() { 
5979          if (this.reason == null)
5980            this.reason = new ArrayList<CodeableConcept>();
5981          return this.reason;
5982        }
5983
5984        /**
5985         * @return Returns a reference to <code>this</code> for easy method chaining
5986         */
5987        public ItemReviewOutcomeComponent setReason(List<CodeableConcept> theReason) { 
5988          this.reason = theReason;
5989          return this;
5990        }
5991
5992        public boolean hasReason() { 
5993          if (this.reason == null)
5994            return false;
5995          for (CodeableConcept item : this.reason)
5996            if (!item.isEmpty())
5997              return true;
5998          return false;
5999        }
6000
6001        public CodeableConcept addReason() { //3
6002          CodeableConcept t = new CodeableConcept();
6003          if (this.reason == null)
6004            this.reason = new ArrayList<CodeableConcept>();
6005          this.reason.add(t);
6006          return t;
6007        }
6008
6009        public ItemReviewOutcomeComponent addReason(CodeableConcept t) { //3
6010          if (t == null)
6011            return this;
6012          if (this.reason == null)
6013            this.reason = new ArrayList<CodeableConcept>();
6014          this.reason.add(t);
6015          return this;
6016        }
6017
6018        /**
6019         * @return The first repetition of repeating field {@link #reason}, creating it if it does not already exist {3}
6020         */
6021        public CodeableConcept getReasonFirstRep() { 
6022          if (getReason().isEmpty()) {
6023            addReason();
6024          }
6025          return getReason().get(0);
6026        }
6027
6028        /**
6029         * @return {@link #preAuthRef} (Reference from the Insurer which is used in later communications which refers to this adjudication.). This is the underlying object with id, value and extensions. The accessor "getPreAuthRef" gives direct access to the value
6030         */
6031        public StringType getPreAuthRefElement() { 
6032          if (this.preAuthRef == null)
6033            if (Configuration.errorOnAutoCreate())
6034              throw new Error("Attempt to auto-create ItemReviewOutcomeComponent.preAuthRef");
6035            else if (Configuration.doAutoCreate())
6036              this.preAuthRef = new StringType(); // bb
6037          return this.preAuthRef;
6038        }
6039
6040        public boolean hasPreAuthRefElement() { 
6041          return this.preAuthRef != null && !this.preAuthRef.isEmpty();
6042        }
6043
6044        public boolean hasPreAuthRef() { 
6045          return this.preAuthRef != null && !this.preAuthRef.isEmpty();
6046        }
6047
6048        /**
6049         * @param value {@link #preAuthRef} (Reference from the Insurer which is used in later communications which refers to this adjudication.). This is the underlying object with id, value and extensions. The accessor "getPreAuthRef" gives direct access to the value
6050         */
6051        public ItemReviewOutcomeComponent setPreAuthRefElement(StringType value) { 
6052          this.preAuthRef = value;
6053          return this;
6054        }
6055
6056        /**
6057         * @return Reference from the Insurer which is used in later communications which refers to this adjudication.
6058         */
6059        public String getPreAuthRef() { 
6060          return this.preAuthRef == null ? null : this.preAuthRef.getValue();
6061        }
6062
6063        /**
6064         * @param value Reference from the Insurer which is used in later communications which refers to this adjudication.
6065         */
6066        public ItemReviewOutcomeComponent setPreAuthRef(String value) { 
6067          if (Utilities.noString(value))
6068            this.preAuthRef = null;
6069          else {
6070            if (this.preAuthRef == null)
6071              this.preAuthRef = new StringType();
6072            this.preAuthRef.setValue(value);
6073          }
6074          return this;
6075        }
6076
6077        /**
6078         * @return {@link #preAuthPeriod} (The time frame during which this authorization is effective.)
6079         */
6080        public Period getPreAuthPeriod() { 
6081          if (this.preAuthPeriod == null)
6082            if (Configuration.errorOnAutoCreate())
6083              throw new Error("Attempt to auto-create ItemReviewOutcomeComponent.preAuthPeriod");
6084            else if (Configuration.doAutoCreate())
6085              this.preAuthPeriod = new Period(); // cc
6086          return this.preAuthPeriod;
6087        }
6088
6089        public boolean hasPreAuthPeriod() { 
6090          return this.preAuthPeriod != null && !this.preAuthPeriod.isEmpty();
6091        }
6092
6093        /**
6094         * @param value {@link #preAuthPeriod} (The time frame during which this authorization is effective.)
6095         */
6096        public ItemReviewOutcomeComponent setPreAuthPeriod(Period value) { 
6097          this.preAuthPeriod = value;
6098          return this;
6099        }
6100
6101        protected void listChildren(List<Property> children) {
6102          super.listChildren(children);
6103          children.add(new Property("decision", "CodeableConcept", "The result of the claim, predetermination, or preauthorization adjudication.", 0, 1, decision));
6104          children.add(new Property("reason", "CodeableConcept", "The reasons for the result of the claim, predetermination, or preauthorization adjudication.", 0, java.lang.Integer.MAX_VALUE, reason));
6105          children.add(new Property("preAuthRef", "string", "Reference from the Insurer which is used in later communications which refers to this adjudication.", 0, 1, preAuthRef));
6106          children.add(new Property("preAuthPeriod", "Period", "The time frame during which this authorization is effective.", 0, 1, preAuthPeriod));
6107        }
6108
6109        @Override
6110        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
6111          switch (_hash) {
6112          case 565719004: /*decision*/  return new Property("decision", "CodeableConcept", "The result of the claim, predetermination, or preauthorization adjudication.", 0, 1, decision);
6113          case -934964668: /*reason*/  return new Property("reason", "CodeableConcept", "The reasons for the result of the claim, predetermination, or preauthorization adjudication.", 0, java.lang.Integer.MAX_VALUE, reason);
6114          case 522246568: /*preAuthRef*/  return new Property("preAuthRef", "string", "Reference from the Insurer which is used in later communications which refers to this adjudication.", 0, 1, preAuthRef);
6115          case 1819164812: /*preAuthPeriod*/  return new Property("preAuthPeriod", "Period", "The time frame during which this authorization is effective.", 0, 1, preAuthPeriod);
6116          default: return super.getNamedProperty(_hash, _name, _checkValid);
6117          }
6118
6119        }
6120
6121      @Override
6122      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
6123        switch (hash) {
6124        case 565719004: /*decision*/ return this.decision == null ? new Base[0] : new Base[] {this.decision}; // CodeableConcept
6125        case -934964668: /*reason*/ return this.reason == null ? new Base[0] : this.reason.toArray(new Base[this.reason.size()]); // CodeableConcept
6126        case 522246568: /*preAuthRef*/ return this.preAuthRef == null ? new Base[0] : new Base[] {this.preAuthRef}; // StringType
6127        case 1819164812: /*preAuthPeriod*/ return this.preAuthPeriod == null ? new Base[0] : new Base[] {this.preAuthPeriod}; // Period
6128        default: return super.getProperty(hash, name, checkValid);
6129        }
6130
6131      }
6132
6133      @Override
6134      public Base setProperty(int hash, String name, Base value) throws FHIRException {
6135        switch (hash) {
6136        case 565719004: // decision
6137          this.decision = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
6138          return value;
6139        case -934964668: // reason
6140          this.getReason().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
6141          return value;
6142        case 522246568: // preAuthRef
6143          this.preAuthRef = TypeConvertor.castToString(value); // StringType
6144          return value;
6145        case 1819164812: // preAuthPeriod
6146          this.preAuthPeriod = TypeConvertor.castToPeriod(value); // Period
6147          return value;
6148        default: return super.setProperty(hash, name, value);
6149        }
6150
6151      }
6152
6153      @Override
6154      public Base setProperty(String name, Base value) throws FHIRException {
6155        if (name.equals("decision")) {
6156          this.decision = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
6157        } else if (name.equals("reason")) {
6158          this.getReason().add(TypeConvertor.castToCodeableConcept(value));
6159        } else if (name.equals("preAuthRef")) {
6160          this.preAuthRef = TypeConvertor.castToString(value); // StringType
6161        } else if (name.equals("preAuthPeriod")) {
6162          this.preAuthPeriod = TypeConvertor.castToPeriod(value); // Period
6163        } else
6164          return super.setProperty(name, value);
6165        return value;
6166      }
6167
6168  @Override
6169  public void removeChild(String name, Base value) throws FHIRException {
6170        if (name.equals("decision")) {
6171          this.decision = null;
6172        } else if (name.equals("reason")) {
6173          this.getReason().remove(value);
6174        } else if (name.equals("preAuthRef")) {
6175          this.preAuthRef = null;
6176        } else if (name.equals("preAuthPeriod")) {
6177          this.preAuthPeriod = null;
6178        } else
6179          super.removeChild(name, value);
6180        
6181      }
6182
6183      @Override
6184      public Base makeProperty(int hash, String name) throws FHIRException {
6185        switch (hash) {
6186        case 565719004:  return getDecision();
6187        case -934964668:  return addReason(); 
6188        case 522246568:  return getPreAuthRefElement();
6189        case 1819164812:  return getPreAuthPeriod();
6190        default: return super.makeProperty(hash, name);
6191        }
6192
6193      }
6194
6195      @Override
6196      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6197        switch (hash) {
6198        case 565719004: /*decision*/ return new String[] {"CodeableConcept"};
6199        case -934964668: /*reason*/ return new String[] {"CodeableConcept"};
6200        case 522246568: /*preAuthRef*/ return new String[] {"string"};
6201        case 1819164812: /*preAuthPeriod*/ return new String[] {"Period"};
6202        default: return super.getTypesForProperty(hash, name);
6203        }
6204
6205      }
6206
6207      @Override
6208      public Base addChild(String name) throws FHIRException {
6209        if (name.equals("decision")) {
6210          this.decision = new CodeableConcept();
6211          return this.decision;
6212        }
6213        else if (name.equals("reason")) {
6214          return addReason();
6215        }
6216        else if (name.equals("preAuthRef")) {
6217          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.reviewOutcome.preAuthRef");
6218        }
6219        else if (name.equals("preAuthPeriod")) {
6220          this.preAuthPeriod = new Period();
6221          return this.preAuthPeriod;
6222        }
6223        else
6224          return super.addChild(name);
6225      }
6226
6227      public ItemReviewOutcomeComponent copy() {
6228        ItemReviewOutcomeComponent dst = new ItemReviewOutcomeComponent();
6229        copyValues(dst);
6230        return dst;
6231      }
6232
6233      public void copyValues(ItemReviewOutcomeComponent dst) {
6234        super.copyValues(dst);
6235        dst.decision = decision == null ? null : decision.copy();
6236        if (reason != null) {
6237          dst.reason = new ArrayList<CodeableConcept>();
6238          for (CodeableConcept i : reason)
6239            dst.reason.add(i.copy());
6240        };
6241        dst.preAuthRef = preAuthRef == null ? null : preAuthRef.copy();
6242        dst.preAuthPeriod = preAuthPeriod == null ? null : preAuthPeriod.copy();
6243      }
6244
6245      @Override
6246      public boolean equalsDeep(Base other_) {
6247        if (!super.equalsDeep(other_))
6248          return false;
6249        if (!(other_ instanceof ItemReviewOutcomeComponent))
6250          return false;
6251        ItemReviewOutcomeComponent o = (ItemReviewOutcomeComponent) other_;
6252        return compareDeep(decision, o.decision, true) && compareDeep(reason, o.reason, true) && compareDeep(preAuthRef, o.preAuthRef, true)
6253           && compareDeep(preAuthPeriod, o.preAuthPeriod, true);
6254      }
6255
6256      @Override
6257      public boolean equalsShallow(Base other_) {
6258        if (!super.equalsShallow(other_))
6259          return false;
6260        if (!(other_ instanceof ItemReviewOutcomeComponent))
6261          return false;
6262        ItemReviewOutcomeComponent o = (ItemReviewOutcomeComponent) other_;
6263        return compareValues(preAuthRef, o.preAuthRef, true);
6264      }
6265
6266      public boolean isEmpty() {
6267        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(decision, reason, preAuthRef
6268          , preAuthPeriod);
6269      }
6270
6271  public String fhirType() {
6272    return "ExplanationOfBenefit.item.reviewOutcome";
6273
6274  }
6275
6276  }
6277
6278    @Block()
6279    public static class AdjudicationComponent extends BackboneElement implements IBaseBackboneElement {
6280        /**
6281         * A code to indicate the information type of this adjudication record. Information types may include: the value submitted, maximum values or percentages allowed or payable under the plan, amounts that the patient is responsible for in-aggregate or pertaining to this item, amounts paid by other coverages, and the benefit payable for this item.
6282         */
6283        @Child(name = "category", type = {CodeableConcept.class}, order=1, min=1, max=1, modifier=false, summary=false)
6284        @Description(shortDefinition="Type of adjudication information", formalDefinition="A code to indicate the information type of this adjudication record. Information types may include: the value submitted, maximum values or percentages allowed or payable under the plan, amounts that the patient is responsible for in-aggregate or pertaining to this item, amounts paid by other coverages, and the benefit payable for this item." )
6285        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/adjudication")
6286        protected CodeableConcept category;
6287
6288        /**
6289         * A code supporting the understanding of the adjudication result and explaining variance from expected amount.
6290         */
6291        @Child(name = "reason", type = {CodeableConcept.class}, order=2, min=0, max=1, modifier=false, summary=false)
6292        @Description(shortDefinition="Explanation of adjudication outcome", formalDefinition="A code supporting the understanding of the adjudication result and explaining variance from expected amount." )
6293        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/adjudication-reason")
6294        protected CodeableConcept reason;
6295
6296        /**
6297         * Monetary amount associated with the category.
6298         */
6299        @Child(name = "amount", type = {Money.class}, order=3, min=0, max=1, modifier=false, summary=false)
6300        @Description(shortDefinition="Monetary amount", formalDefinition="Monetary amount associated with the category." )
6301        protected Money amount;
6302
6303        /**
6304         * A non-monetary value associated with the category. Mutually exclusive to the amount element above.
6305         */
6306        @Child(name = "quantity", type = {Quantity.class}, order=4, min=0, max=1, modifier=false, summary=false)
6307        @Description(shortDefinition="Non-monitary value", formalDefinition="A non-monetary value associated with the category. Mutually exclusive to the amount element above." )
6308        protected Quantity quantity;
6309
6310        private static final long serialVersionUID = 29312734L;
6311
6312    /**
6313     * Constructor
6314     */
6315      public AdjudicationComponent() {
6316        super();
6317      }
6318
6319    /**
6320     * Constructor
6321     */
6322      public AdjudicationComponent(CodeableConcept category) {
6323        super();
6324        this.setCategory(category);
6325      }
6326
6327        /**
6328         * @return {@link #category} (A code to indicate the information type of this adjudication record. Information types may include: the value submitted, maximum values or percentages allowed or payable under the plan, amounts that the patient is responsible for in-aggregate or pertaining to this item, amounts paid by other coverages, and the benefit payable for this item.)
6329         */
6330        public CodeableConcept getCategory() { 
6331          if (this.category == null)
6332            if (Configuration.errorOnAutoCreate())
6333              throw new Error("Attempt to auto-create AdjudicationComponent.category");
6334            else if (Configuration.doAutoCreate())
6335              this.category = new CodeableConcept(); // cc
6336          return this.category;
6337        }
6338
6339        public boolean hasCategory() { 
6340          return this.category != null && !this.category.isEmpty();
6341        }
6342
6343        /**
6344         * @param value {@link #category} (A code to indicate the information type of this adjudication record. Information types may include: the value submitted, maximum values or percentages allowed or payable under the plan, amounts that the patient is responsible for in-aggregate or pertaining to this item, amounts paid by other coverages, and the benefit payable for this item.)
6345         */
6346        public AdjudicationComponent setCategory(CodeableConcept value) { 
6347          this.category = value;
6348          return this;
6349        }
6350
6351        /**
6352         * @return {@link #reason} (A code supporting the understanding of the adjudication result and explaining variance from expected amount.)
6353         */
6354        public CodeableConcept getReason() { 
6355          if (this.reason == null)
6356            if (Configuration.errorOnAutoCreate())
6357              throw new Error("Attempt to auto-create AdjudicationComponent.reason");
6358            else if (Configuration.doAutoCreate())
6359              this.reason = new CodeableConcept(); // cc
6360          return this.reason;
6361        }
6362
6363        public boolean hasReason() { 
6364          return this.reason != null && !this.reason.isEmpty();
6365        }
6366
6367        /**
6368         * @param value {@link #reason} (A code supporting the understanding of the adjudication result and explaining variance from expected amount.)
6369         */
6370        public AdjudicationComponent setReason(CodeableConcept value) { 
6371          this.reason = value;
6372          return this;
6373        }
6374
6375        /**
6376         * @return {@link #amount} (Monetary amount associated with the category.)
6377         */
6378        public Money getAmount() { 
6379          if (this.amount == null)
6380            if (Configuration.errorOnAutoCreate())
6381              throw new Error("Attempt to auto-create AdjudicationComponent.amount");
6382            else if (Configuration.doAutoCreate())
6383              this.amount = new Money(); // cc
6384          return this.amount;
6385        }
6386
6387        public boolean hasAmount() { 
6388          return this.amount != null && !this.amount.isEmpty();
6389        }
6390
6391        /**
6392         * @param value {@link #amount} (Monetary amount associated with the category.)
6393         */
6394        public AdjudicationComponent setAmount(Money value) { 
6395          this.amount = value;
6396          return this;
6397        }
6398
6399        /**
6400         * @return {@link #quantity} (A non-monetary value associated with the category. Mutually exclusive to the amount element above.)
6401         */
6402        public Quantity getQuantity() { 
6403          if (this.quantity == null)
6404            if (Configuration.errorOnAutoCreate())
6405              throw new Error("Attempt to auto-create AdjudicationComponent.quantity");
6406            else if (Configuration.doAutoCreate())
6407              this.quantity = new Quantity(); // cc
6408          return this.quantity;
6409        }
6410
6411        public boolean hasQuantity() { 
6412          return this.quantity != null && !this.quantity.isEmpty();
6413        }
6414
6415        /**
6416         * @param value {@link #quantity} (A non-monetary value associated with the category. Mutually exclusive to the amount element above.)
6417         */
6418        public AdjudicationComponent setQuantity(Quantity value) { 
6419          this.quantity = value;
6420          return this;
6421        }
6422
6423        protected void listChildren(List<Property> children) {
6424          super.listChildren(children);
6425          children.add(new Property("category", "CodeableConcept", "A code to indicate the information type of this adjudication record. Information types may include: the value submitted, maximum values or percentages allowed or payable under the plan, amounts that the patient is responsible for in-aggregate or pertaining to this item, amounts paid by other coverages, and the benefit payable for this item.", 0, 1, category));
6426          children.add(new Property("reason", "CodeableConcept", "A code supporting the understanding of the adjudication result and explaining variance from expected amount.", 0, 1, reason));
6427          children.add(new Property("amount", "Money", "Monetary amount associated with the category.", 0, 1, amount));
6428          children.add(new Property("quantity", "Quantity", "A non-monetary value associated with the category. Mutually exclusive to the amount element above.", 0, 1, quantity));
6429        }
6430
6431        @Override
6432        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
6433          switch (_hash) {
6434          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "A code to indicate the information type of this adjudication record. Information types may include: the value submitted, maximum values or percentages allowed or payable under the plan, amounts that the patient is responsible for in-aggregate or pertaining to this item, amounts paid by other coverages, and the benefit payable for this item.", 0, 1, category);
6435          case -934964668: /*reason*/  return new Property("reason", "CodeableConcept", "A code supporting the understanding of the adjudication result and explaining variance from expected amount.", 0, 1, reason);
6436          case -1413853096: /*amount*/  return new Property("amount", "Money", "Monetary amount associated with the category.", 0, 1, amount);
6437          case -1285004149: /*quantity*/  return new Property("quantity", "Quantity", "A non-monetary value associated with the category. Mutually exclusive to the amount element above.", 0, 1, quantity);
6438          default: return super.getNamedProperty(_hash, _name, _checkValid);
6439          }
6440
6441        }
6442
6443      @Override
6444      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
6445        switch (hash) {
6446        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
6447        case -934964668: /*reason*/ return this.reason == null ? new Base[0] : new Base[] {this.reason}; // CodeableConcept
6448        case -1413853096: /*amount*/ return this.amount == null ? new Base[0] : new Base[] {this.amount}; // Money
6449        case -1285004149: /*quantity*/ return this.quantity == null ? new Base[0] : new Base[] {this.quantity}; // Quantity
6450        default: return super.getProperty(hash, name, checkValid);
6451        }
6452
6453      }
6454
6455      @Override
6456      public Base setProperty(int hash, String name, Base value) throws FHIRException {
6457        switch (hash) {
6458        case 50511102: // category
6459          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
6460          return value;
6461        case -934964668: // reason
6462          this.reason = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
6463          return value;
6464        case -1413853096: // amount
6465          this.amount = TypeConvertor.castToMoney(value); // Money
6466          return value;
6467        case -1285004149: // quantity
6468          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
6469          return value;
6470        default: return super.setProperty(hash, name, value);
6471        }
6472
6473      }
6474
6475      @Override
6476      public Base setProperty(String name, Base value) throws FHIRException {
6477        if (name.equals("category")) {
6478          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
6479        } else if (name.equals("reason")) {
6480          this.reason = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
6481        } else if (name.equals("amount")) {
6482          this.amount = TypeConvertor.castToMoney(value); // Money
6483        } else if (name.equals("quantity")) {
6484          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
6485        } else
6486          return super.setProperty(name, value);
6487        return value;
6488      }
6489
6490  @Override
6491  public void removeChild(String name, Base value) throws FHIRException {
6492        if (name.equals("category")) {
6493          this.category = null;
6494        } else if (name.equals("reason")) {
6495          this.reason = null;
6496        } else if (name.equals("amount")) {
6497          this.amount = null;
6498        } else if (name.equals("quantity")) {
6499          this.quantity = null;
6500        } else
6501          super.removeChild(name, value);
6502        
6503      }
6504
6505      @Override
6506      public Base makeProperty(int hash, String name) throws FHIRException {
6507        switch (hash) {
6508        case 50511102:  return getCategory();
6509        case -934964668:  return getReason();
6510        case -1413853096:  return getAmount();
6511        case -1285004149:  return getQuantity();
6512        default: return super.makeProperty(hash, name);
6513        }
6514
6515      }
6516
6517      @Override
6518      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6519        switch (hash) {
6520        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
6521        case -934964668: /*reason*/ return new String[] {"CodeableConcept"};
6522        case -1413853096: /*amount*/ return new String[] {"Money"};
6523        case -1285004149: /*quantity*/ return new String[] {"Quantity"};
6524        default: return super.getTypesForProperty(hash, name);
6525        }
6526
6527      }
6528
6529      @Override
6530      public Base addChild(String name) throws FHIRException {
6531        if (name.equals("category")) {
6532          this.category = new CodeableConcept();
6533          return this.category;
6534        }
6535        else if (name.equals("reason")) {
6536          this.reason = new CodeableConcept();
6537          return this.reason;
6538        }
6539        else if (name.equals("amount")) {
6540          this.amount = new Money();
6541          return this.amount;
6542        }
6543        else if (name.equals("quantity")) {
6544          this.quantity = new Quantity();
6545          return this.quantity;
6546        }
6547        else
6548          return super.addChild(name);
6549      }
6550
6551      public AdjudicationComponent copy() {
6552        AdjudicationComponent dst = new AdjudicationComponent();
6553        copyValues(dst);
6554        return dst;
6555      }
6556
6557      public void copyValues(AdjudicationComponent dst) {
6558        super.copyValues(dst);
6559        dst.category = category == null ? null : category.copy();
6560        dst.reason = reason == null ? null : reason.copy();
6561        dst.amount = amount == null ? null : amount.copy();
6562        dst.quantity = quantity == null ? null : quantity.copy();
6563      }
6564
6565      @Override
6566      public boolean equalsDeep(Base other_) {
6567        if (!super.equalsDeep(other_))
6568          return false;
6569        if (!(other_ instanceof AdjudicationComponent))
6570          return false;
6571        AdjudicationComponent o = (AdjudicationComponent) other_;
6572        return compareDeep(category, o.category, true) && compareDeep(reason, o.reason, true) && compareDeep(amount, o.amount, true)
6573           && compareDeep(quantity, o.quantity, true);
6574      }
6575
6576      @Override
6577      public boolean equalsShallow(Base other_) {
6578        if (!super.equalsShallow(other_))
6579          return false;
6580        if (!(other_ instanceof AdjudicationComponent))
6581          return false;
6582        AdjudicationComponent o = (AdjudicationComponent) other_;
6583        return true;
6584      }
6585
6586      public boolean isEmpty() {
6587        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(category, reason, amount
6588          , quantity);
6589      }
6590
6591  public String fhirType() {
6592    return "ExplanationOfBenefit.item.adjudication";
6593
6594  }
6595
6596  }
6597
6598    @Block()
6599    public static class DetailComponent extends BackboneElement implements IBaseBackboneElement {
6600        /**
6601         * A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.
6602         */
6603        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
6604        @Description(shortDefinition="Product or service provided", formalDefinition="A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items." )
6605        protected PositiveIntType sequence;
6606
6607        /**
6608         * Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.
6609         */
6610        @Child(name = "traceNumber", type = {Identifier.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6611        @Description(shortDefinition="Number for tracking", formalDefinition="Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners." )
6612        protected List<Identifier> traceNumber;
6613
6614        /**
6615         * The type of revenue or cost center providing the product and/or service.
6616         */
6617        @Child(name = "revenue", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=false)
6618        @Description(shortDefinition="Revenue or cost center code", formalDefinition="The type of revenue or cost center providing the product and/or service." )
6619        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-revenue-center")
6620        protected CodeableConcept revenue;
6621
6622        /**
6623         * Code to identify the general type of benefits under which products and services are provided.
6624         */
6625        @Child(name = "category", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
6626        @Description(shortDefinition="Benefit classification", formalDefinition="Code to identify the general type of benefits under which products and services are provided." )
6627        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-benefitcategory")
6628        protected CodeableConcept category;
6629
6630        /**
6631         * When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.
6632         */
6633        @Child(name = "productOrService", type = {CodeableConcept.class}, order=5, min=0, max=1, modifier=false, summary=false)
6634        @Description(shortDefinition="Billing, service, product, or drug code", formalDefinition="When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used." )
6635        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-uscls")
6636        protected CodeableConcept productOrService;
6637
6638        /**
6639         * This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.
6640         */
6641        @Child(name = "productOrServiceEnd", type = {CodeableConcept.class}, order=6, min=0, max=1, modifier=false, summary=false)
6642        @Description(shortDefinition="End of a range of codes", formalDefinition="This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims." )
6643        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-uscls")
6644        protected CodeableConcept productOrServiceEnd;
6645
6646        /**
6647         * Item typification or modifiers codes to convey additional context for the product or service.
6648         */
6649        @Child(name = "modifier", type = {CodeableConcept.class}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6650        @Description(shortDefinition="Service/Product billing modifiers", formalDefinition="Item typification or modifiers codes to convey additional context for the product or service." )
6651        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-modifiers")
6652        protected List<CodeableConcept> modifier;
6653
6654        /**
6655         * Identifies the program under which this may be recovered.
6656         */
6657        @Child(name = "programCode", type = {CodeableConcept.class}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6658        @Description(shortDefinition="Program the product or service is provided under", formalDefinition="Identifies the program under which this may be recovered." )
6659        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-program-code")
6660        protected List<CodeableConcept> programCode;
6661
6662        /**
6663         * The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.
6664         */
6665        @Child(name = "patientPaid", type = {Money.class}, order=9, min=0, max=1, modifier=false, summary=false)
6666        @Description(shortDefinition="Paid by the patient", formalDefinition="The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services." )
6667        protected Money patientPaid;
6668
6669        /**
6670         * The number of repetitions of a service or product.
6671         */
6672        @Child(name = "quantity", type = {Quantity.class}, order=10, min=0, max=1, modifier=false, summary=false)
6673        @Description(shortDefinition="Count of products or services", formalDefinition="The number of repetitions of a service or product." )
6674        protected Quantity quantity;
6675
6676        /**
6677         * If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.
6678         */
6679        @Child(name = "unitPrice", type = {Money.class}, order=11, min=0, max=1, modifier=false, summary=false)
6680        @Description(shortDefinition="Fee, charge or cost per item", formalDefinition="If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group." )
6681        protected Money unitPrice;
6682
6683        /**
6684         * A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
6685         */
6686        @Child(name = "factor", type = {DecimalType.class}, order=12, min=0, max=1, modifier=false, summary=false)
6687        @Description(shortDefinition="Price scaling factor", formalDefinition="A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount." )
6688        protected DecimalType factor;
6689
6690        /**
6691         * The total of taxes applicable for this product or service.
6692         */
6693        @Child(name = "tax", type = {Money.class}, order=13, min=0, max=1, modifier=false, summary=false)
6694        @Description(shortDefinition="Total tax", formalDefinition="The total of taxes applicable for this product or service." )
6695        protected Money tax;
6696
6697        /**
6698         * The total amount claimed for the group (if a grouper) or the line item.detail. Net = unit price * quantity * factor.
6699         */
6700        @Child(name = "net", type = {Money.class}, order=14, min=0, max=1, modifier=false, summary=false)
6701        @Description(shortDefinition="Total item cost", formalDefinition="The total amount claimed for the group (if a grouper) or the line item.detail. Net = unit price * quantity * factor." )
6702        protected Money net;
6703
6704        /**
6705         * Unique Device Identifiers associated with this line item.
6706         */
6707        @Child(name = "udi", type = {Device.class}, order=15, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6708        @Description(shortDefinition="Unique device identifier", formalDefinition="Unique Device Identifiers associated with this line item." )
6709        protected List<Reference> udi;
6710
6711        /**
6712         * The numbers associated with notes below which apply to the adjudication of this item.
6713         */
6714        @Child(name = "noteNumber", type = {PositiveIntType.class}, order=16, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6715        @Description(shortDefinition="Applicable note numbers", formalDefinition="The numbers associated with notes below which apply to the adjudication of this item." )
6716        protected List<PositiveIntType> noteNumber;
6717
6718        /**
6719         * The high-level results of the adjudication if adjudication has been performed.
6720         */
6721        @Child(name = "reviewOutcome", type = {ItemReviewOutcomeComponent.class}, order=17, min=0, max=1, modifier=false, summary=false)
6722        @Description(shortDefinition="Detail level adjudication results", formalDefinition="The high-level results of the adjudication if adjudication has been performed." )
6723        protected ItemReviewOutcomeComponent reviewOutcome;
6724
6725        /**
6726         * The adjudication results.
6727         */
6728        @Child(name = "adjudication", type = {AdjudicationComponent.class}, order=18, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6729        @Description(shortDefinition="Detail level adjudication details", formalDefinition="The adjudication results." )
6730        protected List<AdjudicationComponent> adjudication;
6731
6732        /**
6733         * Third-tier of goods and services.
6734         */
6735        @Child(name = "subDetail", type = {}, order=19, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6736        @Description(shortDefinition="Additional items", formalDefinition="Third-tier of goods and services." )
6737        protected List<SubDetailComponent> subDetail;
6738
6739        private static final long serialVersionUID = -1951425443L;
6740
6741    /**
6742     * Constructor
6743     */
6744      public DetailComponent() {
6745        super();
6746      }
6747
6748    /**
6749     * Constructor
6750     */
6751      public DetailComponent(int sequence) {
6752        super();
6753        this.setSequence(sequence);
6754      }
6755
6756        /**
6757         * @return {@link #sequence} (A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
6758         */
6759        public PositiveIntType getSequenceElement() { 
6760          if (this.sequence == null)
6761            if (Configuration.errorOnAutoCreate())
6762              throw new Error("Attempt to auto-create DetailComponent.sequence");
6763            else if (Configuration.doAutoCreate())
6764              this.sequence = new PositiveIntType(); // bb
6765          return this.sequence;
6766        }
6767
6768        public boolean hasSequenceElement() { 
6769          return this.sequence != null && !this.sequence.isEmpty();
6770        }
6771
6772        public boolean hasSequence() { 
6773          return this.sequence != null && !this.sequence.isEmpty();
6774        }
6775
6776        /**
6777         * @param value {@link #sequence} (A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
6778         */
6779        public DetailComponent setSequenceElement(PositiveIntType value) { 
6780          this.sequence = value;
6781          return this;
6782        }
6783
6784        /**
6785         * @return A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.
6786         */
6787        public int getSequence() { 
6788          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
6789        }
6790
6791        /**
6792         * @param value A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.
6793         */
6794        public DetailComponent setSequence(int value) { 
6795            if (this.sequence == null)
6796              this.sequence = new PositiveIntType();
6797            this.sequence.setValue(value);
6798          return this;
6799        }
6800
6801        /**
6802         * @return {@link #traceNumber} (Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.)
6803         */
6804        public List<Identifier> getTraceNumber() { 
6805          if (this.traceNumber == null)
6806            this.traceNumber = new ArrayList<Identifier>();
6807          return this.traceNumber;
6808        }
6809
6810        /**
6811         * @return Returns a reference to <code>this</code> for easy method chaining
6812         */
6813        public DetailComponent setTraceNumber(List<Identifier> theTraceNumber) { 
6814          this.traceNumber = theTraceNumber;
6815          return this;
6816        }
6817
6818        public boolean hasTraceNumber() { 
6819          if (this.traceNumber == null)
6820            return false;
6821          for (Identifier item : this.traceNumber)
6822            if (!item.isEmpty())
6823              return true;
6824          return false;
6825        }
6826
6827        public Identifier addTraceNumber() { //3
6828          Identifier t = new Identifier();
6829          if (this.traceNumber == null)
6830            this.traceNumber = new ArrayList<Identifier>();
6831          this.traceNumber.add(t);
6832          return t;
6833        }
6834
6835        public DetailComponent addTraceNumber(Identifier t) { //3
6836          if (t == null)
6837            return this;
6838          if (this.traceNumber == null)
6839            this.traceNumber = new ArrayList<Identifier>();
6840          this.traceNumber.add(t);
6841          return this;
6842        }
6843
6844        /**
6845         * @return The first repetition of repeating field {@link #traceNumber}, creating it if it does not already exist {3}
6846         */
6847        public Identifier getTraceNumberFirstRep() { 
6848          if (getTraceNumber().isEmpty()) {
6849            addTraceNumber();
6850          }
6851          return getTraceNumber().get(0);
6852        }
6853
6854        /**
6855         * @return {@link #revenue} (The type of revenue or cost center providing the product and/or service.)
6856         */
6857        public CodeableConcept getRevenue() { 
6858          if (this.revenue == null)
6859            if (Configuration.errorOnAutoCreate())
6860              throw new Error("Attempt to auto-create DetailComponent.revenue");
6861            else if (Configuration.doAutoCreate())
6862              this.revenue = new CodeableConcept(); // cc
6863          return this.revenue;
6864        }
6865
6866        public boolean hasRevenue() { 
6867          return this.revenue != null && !this.revenue.isEmpty();
6868        }
6869
6870        /**
6871         * @param value {@link #revenue} (The type of revenue or cost center providing the product and/or service.)
6872         */
6873        public DetailComponent setRevenue(CodeableConcept value) { 
6874          this.revenue = value;
6875          return this;
6876        }
6877
6878        /**
6879         * @return {@link #category} (Code to identify the general type of benefits under which products and services are provided.)
6880         */
6881        public CodeableConcept getCategory() { 
6882          if (this.category == null)
6883            if (Configuration.errorOnAutoCreate())
6884              throw new Error("Attempt to auto-create DetailComponent.category");
6885            else if (Configuration.doAutoCreate())
6886              this.category = new CodeableConcept(); // cc
6887          return this.category;
6888        }
6889
6890        public boolean hasCategory() { 
6891          return this.category != null && !this.category.isEmpty();
6892        }
6893
6894        /**
6895         * @param value {@link #category} (Code to identify the general type of benefits under which products and services are provided.)
6896         */
6897        public DetailComponent setCategory(CodeableConcept value) { 
6898          this.category = value;
6899          return this;
6900        }
6901
6902        /**
6903         * @return {@link #productOrService} (When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.)
6904         */
6905        public CodeableConcept getProductOrService() { 
6906          if (this.productOrService == null)
6907            if (Configuration.errorOnAutoCreate())
6908              throw new Error("Attempt to auto-create DetailComponent.productOrService");
6909            else if (Configuration.doAutoCreate())
6910              this.productOrService = new CodeableConcept(); // cc
6911          return this.productOrService;
6912        }
6913
6914        public boolean hasProductOrService() { 
6915          return this.productOrService != null && !this.productOrService.isEmpty();
6916        }
6917
6918        /**
6919         * @param value {@link #productOrService} (When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.)
6920         */
6921        public DetailComponent setProductOrService(CodeableConcept value) { 
6922          this.productOrService = value;
6923          return this;
6924        }
6925
6926        /**
6927         * @return {@link #productOrServiceEnd} (This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.)
6928         */
6929        public CodeableConcept getProductOrServiceEnd() { 
6930          if (this.productOrServiceEnd == null)
6931            if (Configuration.errorOnAutoCreate())
6932              throw new Error("Attempt to auto-create DetailComponent.productOrServiceEnd");
6933            else if (Configuration.doAutoCreate())
6934              this.productOrServiceEnd = new CodeableConcept(); // cc
6935          return this.productOrServiceEnd;
6936        }
6937
6938        public boolean hasProductOrServiceEnd() { 
6939          return this.productOrServiceEnd != null && !this.productOrServiceEnd.isEmpty();
6940        }
6941
6942        /**
6943         * @param value {@link #productOrServiceEnd} (This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.)
6944         */
6945        public DetailComponent setProductOrServiceEnd(CodeableConcept value) { 
6946          this.productOrServiceEnd = value;
6947          return this;
6948        }
6949
6950        /**
6951         * @return {@link #modifier} (Item typification or modifiers codes to convey additional context for the product or service.)
6952         */
6953        public List<CodeableConcept> getModifier() { 
6954          if (this.modifier == null)
6955            this.modifier = new ArrayList<CodeableConcept>();
6956          return this.modifier;
6957        }
6958
6959        /**
6960         * @return Returns a reference to <code>this</code> for easy method chaining
6961         */
6962        public DetailComponent setModifier(List<CodeableConcept> theModifier) { 
6963          this.modifier = theModifier;
6964          return this;
6965        }
6966
6967        public boolean hasModifier() { 
6968          if (this.modifier == null)
6969            return false;
6970          for (CodeableConcept item : this.modifier)
6971            if (!item.isEmpty())
6972              return true;
6973          return false;
6974        }
6975
6976        public CodeableConcept addModifier() { //3
6977          CodeableConcept t = new CodeableConcept();
6978          if (this.modifier == null)
6979            this.modifier = new ArrayList<CodeableConcept>();
6980          this.modifier.add(t);
6981          return t;
6982        }
6983
6984        public DetailComponent addModifier(CodeableConcept t) { //3
6985          if (t == null)
6986            return this;
6987          if (this.modifier == null)
6988            this.modifier = new ArrayList<CodeableConcept>();
6989          this.modifier.add(t);
6990          return this;
6991        }
6992
6993        /**
6994         * @return The first repetition of repeating field {@link #modifier}, creating it if it does not already exist {3}
6995         */
6996        public CodeableConcept getModifierFirstRep() { 
6997          if (getModifier().isEmpty()) {
6998            addModifier();
6999          }
7000          return getModifier().get(0);
7001        }
7002
7003        /**
7004         * @return {@link #programCode} (Identifies the program under which this may be recovered.)
7005         */
7006        public List<CodeableConcept> getProgramCode() { 
7007          if (this.programCode == null)
7008            this.programCode = new ArrayList<CodeableConcept>();
7009          return this.programCode;
7010        }
7011
7012        /**
7013         * @return Returns a reference to <code>this</code> for easy method chaining
7014         */
7015        public DetailComponent setProgramCode(List<CodeableConcept> theProgramCode) { 
7016          this.programCode = theProgramCode;
7017          return this;
7018        }
7019
7020        public boolean hasProgramCode() { 
7021          if (this.programCode == null)
7022            return false;
7023          for (CodeableConcept item : this.programCode)
7024            if (!item.isEmpty())
7025              return true;
7026          return false;
7027        }
7028
7029        public CodeableConcept addProgramCode() { //3
7030          CodeableConcept t = new CodeableConcept();
7031          if (this.programCode == null)
7032            this.programCode = new ArrayList<CodeableConcept>();
7033          this.programCode.add(t);
7034          return t;
7035        }
7036
7037        public DetailComponent addProgramCode(CodeableConcept t) { //3
7038          if (t == null)
7039            return this;
7040          if (this.programCode == null)
7041            this.programCode = new ArrayList<CodeableConcept>();
7042          this.programCode.add(t);
7043          return this;
7044        }
7045
7046        /**
7047         * @return The first repetition of repeating field {@link #programCode}, creating it if it does not already exist {3}
7048         */
7049        public CodeableConcept getProgramCodeFirstRep() { 
7050          if (getProgramCode().isEmpty()) {
7051            addProgramCode();
7052          }
7053          return getProgramCode().get(0);
7054        }
7055
7056        /**
7057         * @return {@link #patientPaid} (The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.)
7058         */
7059        public Money getPatientPaid() { 
7060          if (this.patientPaid == null)
7061            if (Configuration.errorOnAutoCreate())
7062              throw new Error("Attempt to auto-create DetailComponent.patientPaid");
7063            else if (Configuration.doAutoCreate())
7064              this.patientPaid = new Money(); // cc
7065          return this.patientPaid;
7066        }
7067
7068        public boolean hasPatientPaid() { 
7069          return this.patientPaid != null && !this.patientPaid.isEmpty();
7070        }
7071
7072        /**
7073         * @param value {@link #patientPaid} (The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.)
7074         */
7075        public DetailComponent setPatientPaid(Money value) { 
7076          this.patientPaid = value;
7077          return this;
7078        }
7079
7080        /**
7081         * @return {@link #quantity} (The number of repetitions of a service or product.)
7082         */
7083        public Quantity getQuantity() { 
7084          if (this.quantity == null)
7085            if (Configuration.errorOnAutoCreate())
7086              throw new Error("Attempt to auto-create DetailComponent.quantity");
7087            else if (Configuration.doAutoCreate())
7088              this.quantity = new Quantity(); // cc
7089          return this.quantity;
7090        }
7091
7092        public boolean hasQuantity() { 
7093          return this.quantity != null && !this.quantity.isEmpty();
7094        }
7095
7096        /**
7097         * @param value {@link #quantity} (The number of repetitions of a service or product.)
7098         */
7099        public DetailComponent setQuantity(Quantity value) { 
7100          this.quantity = value;
7101          return this;
7102        }
7103
7104        /**
7105         * @return {@link #unitPrice} (If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.)
7106         */
7107        public Money getUnitPrice() { 
7108          if (this.unitPrice == null)
7109            if (Configuration.errorOnAutoCreate())
7110              throw new Error("Attempt to auto-create DetailComponent.unitPrice");
7111            else if (Configuration.doAutoCreate())
7112              this.unitPrice = new Money(); // cc
7113          return this.unitPrice;
7114        }
7115
7116        public boolean hasUnitPrice() { 
7117          return this.unitPrice != null && !this.unitPrice.isEmpty();
7118        }
7119
7120        /**
7121         * @param value {@link #unitPrice} (If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.)
7122         */
7123        public DetailComponent setUnitPrice(Money value) { 
7124          this.unitPrice = value;
7125          return this;
7126        }
7127
7128        /**
7129         * @return {@link #factor} (A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.). This is the underlying object with id, value and extensions. The accessor "getFactor" gives direct access to the value
7130         */
7131        public DecimalType getFactorElement() { 
7132          if (this.factor == null)
7133            if (Configuration.errorOnAutoCreate())
7134              throw new Error("Attempt to auto-create DetailComponent.factor");
7135            else if (Configuration.doAutoCreate())
7136              this.factor = new DecimalType(); // bb
7137          return this.factor;
7138        }
7139
7140        public boolean hasFactorElement() { 
7141          return this.factor != null && !this.factor.isEmpty();
7142        }
7143
7144        public boolean hasFactor() { 
7145          return this.factor != null && !this.factor.isEmpty();
7146        }
7147
7148        /**
7149         * @param value {@link #factor} (A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.). This is the underlying object with id, value and extensions. The accessor "getFactor" gives direct access to the value
7150         */
7151        public DetailComponent setFactorElement(DecimalType value) { 
7152          this.factor = value;
7153          return this;
7154        }
7155
7156        /**
7157         * @return A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
7158         */
7159        public BigDecimal getFactor() { 
7160          return this.factor == null ? null : this.factor.getValue();
7161        }
7162
7163        /**
7164         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
7165         */
7166        public DetailComponent setFactor(BigDecimal value) { 
7167          if (value == null)
7168            this.factor = null;
7169          else {
7170            if (this.factor == null)
7171              this.factor = new DecimalType();
7172            this.factor.setValue(value);
7173          }
7174          return this;
7175        }
7176
7177        /**
7178         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
7179         */
7180        public DetailComponent setFactor(long value) { 
7181              this.factor = new DecimalType();
7182            this.factor.setValue(value);
7183          return this;
7184        }
7185
7186        /**
7187         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
7188         */
7189        public DetailComponent setFactor(double value) { 
7190              this.factor = new DecimalType();
7191            this.factor.setValue(value);
7192          return this;
7193        }
7194
7195        /**
7196         * @return {@link #tax} (The total of taxes applicable for this product or service.)
7197         */
7198        public Money getTax() { 
7199          if (this.tax == null)
7200            if (Configuration.errorOnAutoCreate())
7201              throw new Error("Attempt to auto-create DetailComponent.tax");
7202            else if (Configuration.doAutoCreate())
7203              this.tax = new Money(); // cc
7204          return this.tax;
7205        }
7206
7207        public boolean hasTax() { 
7208          return this.tax != null && !this.tax.isEmpty();
7209        }
7210
7211        /**
7212         * @param value {@link #tax} (The total of taxes applicable for this product or service.)
7213         */
7214        public DetailComponent setTax(Money value) { 
7215          this.tax = value;
7216          return this;
7217        }
7218
7219        /**
7220         * @return {@link #net} (The total amount claimed for the group (if a grouper) or the line item.detail. Net = unit price * quantity * factor.)
7221         */
7222        public Money getNet() { 
7223          if (this.net == null)
7224            if (Configuration.errorOnAutoCreate())
7225              throw new Error("Attempt to auto-create DetailComponent.net");
7226            else if (Configuration.doAutoCreate())
7227              this.net = new Money(); // cc
7228          return this.net;
7229        }
7230
7231        public boolean hasNet() { 
7232          return this.net != null && !this.net.isEmpty();
7233        }
7234
7235        /**
7236         * @param value {@link #net} (The total amount claimed for the group (if a grouper) or the line item.detail. Net = unit price * quantity * factor.)
7237         */
7238        public DetailComponent setNet(Money value) { 
7239          this.net = value;
7240          return this;
7241        }
7242
7243        /**
7244         * @return {@link #udi} (Unique Device Identifiers associated with this line item.)
7245         */
7246        public List<Reference> getUdi() { 
7247          if (this.udi == null)
7248            this.udi = new ArrayList<Reference>();
7249          return this.udi;
7250        }
7251
7252        /**
7253         * @return Returns a reference to <code>this</code> for easy method chaining
7254         */
7255        public DetailComponent setUdi(List<Reference> theUdi) { 
7256          this.udi = theUdi;
7257          return this;
7258        }
7259
7260        public boolean hasUdi() { 
7261          if (this.udi == null)
7262            return false;
7263          for (Reference item : this.udi)
7264            if (!item.isEmpty())
7265              return true;
7266          return false;
7267        }
7268
7269        public Reference addUdi() { //3
7270          Reference t = new Reference();
7271          if (this.udi == null)
7272            this.udi = new ArrayList<Reference>();
7273          this.udi.add(t);
7274          return t;
7275        }
7276
7277        public DetailComponent addUdi(Reference t) { //3
7278          if (t == null)
7279            return this;
7280          if (this.udi == null)
7281            this.udi = new ArrayList<Reference>();
7282          this.udi.add(t);
7283          return this;
7284        }
7285
7286        /**
7287         * @return The first repetition of repeating field {@link #udi}, creating it if it does not already exist {3}
7288         */
7289        public Reference getUdiFirstRep() { 
7290          if (getUdi().isEmpty()) {
7291            addUdi();
7292          }
7293          return getUdi().get(0);
7294        }
7295
7296        /**
7297         * @return {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
7298         */
7299        public List<PositiveIntType> getNoteNumber() { 
7300          if (this.noteNumber == null)
7301            this.noteNumber = new ArrayList<PositiveIntType>();
7302          return this.noteNumber;
7303        }
7304
7305        /**
7306         * @return Returns a reference to <code>this</code> for easy method chaining
7307         */
7308        public DetailComponent setNoteNumber(List<PositiveIntType> theNoteNumber) { 
7309          this.noteNumber = theNoteNumber;
7310          return this;
7311        }
7312
7313        public boolean hasNoteNumber() { 
7314          if (this.noteNumber == null)
7315            return false;
7316          for (PositiveIntType item : this.noteNumber)
7317            if (!item.isEmpty())
7318              return true;
7319          return false;
7320        }
7321
7322        /**
7323         * @return {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
7324         */
7325        public PositiveIntType addNoteNumberElement() {//2 
7326          PositiveIntType t = new PositiveIntType();
7327          if (this.noteNumber == null)
7328            this.noteNumber = new ArrayList<PositiveIntType>();
7329          this.noteNumber.add(t);
7330          return t;
7331        }
7332
7333        /**
7334         * @param value {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
7335         */
7336        public DetailComponent addNoteNumber(int value) { //1
7337          PositiveIntType t = new PositiveIntType();
7338          t.setValue(value);
7339          if (this.noteNumber == null)
7340            this.noteNumber = new ArrayList<PositiveIntType>();
7341          this.noteNumber.add(t);
7342          return this;
7343        }
7344
7345        /**
7346         * @param value {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
7347         */
7348        public boolean hasNoteNumber(int value) { 
7349          if (this.noteNumber == null)
7350            return false;
7351          for (PositiveIntType v : this.noteNumber)
7352            if (v.getValue().equals(value)) // positiveInt
7353              return true;
7354          return false;
7355        }
7356
7357        /**
7358         * @return {@link #reviewOutcome} (The high-level results of the adjudication if adjudication has been performed.)
7359         */
7360        public ItemReviewOutcomeComponent getReviewOutcome() { 
7361          if (this.reviewOutcome == null)
7362            if (Configuration.errorOnAutoCreate())
7363              throw new Error("Attempt to auto-create DetailComponent.reviewOutcome");
7364            else if (Configuration.doAutoCreate())
7365              this.reviewOutcome = new ItemReviewOutcomeComponent(); // cc
7366          return this.reviewOutcome;
7367        }
7368
7369        public boolean hasReviewOutcome() { 
7370          return this.reviewOutcome != null && !this.reviewOutcome.isEmpty();
7371        }
7372
7373        /**
7374         * @param value {@link #reviewOutcome} (The high-level results of the adjudication if adjudication has been performed.)
7375         */
7376        public DetailComponent setReviewOutcome(ItemReviewOutcomeComponent value) { 
7377          this.reviewOutcome = value;
7378          return this;
7379        }
7380
7381        /**
7382         * @return {@link #adjudication} (The adjudication results.)
7383         */
7384        public List<AdjudicationComponent> getAdjudication() { 
7385          if (this.adjudication == null)
7386            this.adjudication = new ArrayList<AdjudicationComponent>();
7387          return this.adjudication;
7388        }
7389
7390        /**
7391         * @return Returns a reference to <code>this</code> for easy method chaining
7392         */
7393        public DetailComponent setAdjudication(List<AdjudicationComponent> theAdjudication) { 
7394          this.adjudication = theAdjudication;
7395          return this;
7396        }
7397
7398        public boolean hasAdjudication() { 
7399          if (this.adjudication == null)
7400            return false;
7401          for (AdjudicationComponent item : this.adjudication)
7402            if (!item.isEmpty())
7403              return true;
7404          return false;
7405        }
7406
7407        public AdjudicationComponent addAdjudication() { //3
7408          AdjudicationComponent t = new AdjudicationComponent();
7409          if (this.adjudication == null)
7410            this.adjudication = new ArrayList<AdjudicationComponent>();
7411          this.adjudication.add(t);
7412          return t;
7413        }
7414
7415        public DetailComponent addAdjudication(AdjudicationComponent t) { //3
7416          if (t == null)
7417            return this;
7418          if (this.adjudication == null)
7419            this.adjudication = new ArrayList<AdjudicationComponent>();
7420          this.adjudication.add(t);
7421          return this;
7422        }
7423
7424        /**
7425         * @return The first repetition of repeating field {@link #adjudication}, creating it if it does not already exist {3}
7426         */
7427        public AdjudicationComponent getAdjudicationFirstRep() { 
7428          if (getAdjudication().isEmpty()) {
7429            addAdjudication();
7430          }
7431          return getAdjudication().get(0);
7432        }
7433
7434        /**
7435         * @return {@link #subDetail} (Third-tier of goods and services.)
7436         */
7437        public List<SubDetailComponent> getSubDetail() { 
7438          if (this.subDetail == null)
7439            this.subDetail = new ArrayList<SubDetailComponent>();
7440          return this.subDetail;
7441        }
7442
7443        /**
7444         * @return Returns a reference to <code>this</code> for easy method chaining
7445         */
7446        public DetailComponent setSubDetail(List<SubDetailComponent> theSubDetail) { 
7447          this.subDetail = theSubDetail;
7448          return this;
7449        }
7450
7451        public boolean hasSubDetail() { 
7452          if (this.subDetail == null)
7453            return false;
7454          for (SubDetailComponent item : this.subDetail)
7455            if (!item.isEmpty())
7456              return true;
7457          return false;
7458        }
7459
7460        public SubDetailComponent addSubDetail() { //3
7461          SubDetailComponent t = new SubDetailComponent();
7462          if (this.subDetail == null)
7463            this.subDetail = new ArrayList<SubDetailComponent>();
7464          this.subDetail.add(t);
7465          return t;
7466        }
7467
7468        public DetailComponent addSubDetail(SubDetailComponent t) { //3
7469          if (t == null)
7470            return this;
7471          if (this.subDetail == null)
7472            this.subDetail = new ArrayList<SubDetailComponent>();
7473          this.subDetail.add(t);
7474          return this;
7475        }
7476
7477        /**
7478         * @return The first repetition of repeating field {@link #subDetail}, creating it if it does not already exist {3}
7479         */
7480        public SubDetailComponent getSubDetailFirstRep() { 
7481          if (getSubDetail().isEmpty()) {
7482            addSubDetail();
7483          }
7484          return getSubDetail().get(0);
7485        }
7486
7487        protected void listChildren(List<Property> children) {
7488          super.listChildren(children);
7489          children.add(new Property("sequence", "positiveInt", "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.", 0, 1, sequence));
7490          children.add(new Property("traceNumber", "Identifier", "Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.", 0, java.lang.Integer.MAX_VALUE, traceNumber));
7491          children.add(new Property("revenue", "CodeableConcept", "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue));
7492          children.add(new Property("category", "CodeableConcept", "Code to identify the general type of benefits under which products and services are provided.", 0, 1, category));
7493          children.add(new Property("productOrService", "CodeableConcept", "When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.", 0, 1, productOrService));
7494          children.add(new Property("productOrServiceEnd", "CodeableConcept", "This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.", 0, 1, productOrServiceEnd));
7495          children.add(new Property("modifier", "CodeableConcept", "Item typification or modifiers codes to convey additional context for the product or service.", 0, java.lang.Integer.MAX_VALUE, modifier));
7496          children.add(new Property("programCode", "CodeableConcept", "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode));
7497          children.add(new Property("patientPaid", "Money", "The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.", 0, 1, patientPaid));
7498          children.add(new Property("quantity", "Quantity", "The number of repetitions of a service or product.", 0, 1, quantity));
7499          children.add(new Property("unitPrice", "Money", "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.", 0, 1, unitPrice));
7500          children.add(new Property("factor", "decimal", "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.", 0, 1, factor));
7501          children.add(new Property("tax", "Money", "The total of taxes applicable for this product or service.", 0, 1, tax));
7502          children.add(new Property("net", "Money", "The total amount claimed for the group (if a grouper) or the line item.detail. Net = unit price * quantity * factor.", 0, 1, net));
7503          children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi));
7504          children.add(new Property("noteNumber", "positiveInt", "The numbers associated with notes below which apply to the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, noteNumber));
7505          children.add(new Property("reviewOutcome", "@ExplanationOfBenefit.item.reviewOutcome", "The high-level results of the adjudication if adjudication has been performed.", 0, 1, reviewOutcome));
7506          children.add(new Property("adjudication", "@ExplanationOfBenefit.item.adjudication", "The adjudication results.", 0, java.lang.Integer.MAX_VALUE, adjudication));
7507          children.add(new Property("subDetail", "", "Third-tier of goods and services.", 0, java.lang.Integer.MAX_VALUE, subDetail));
7508        }
7509
7510        @Override
7511        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
7512          switch (_hash) {
7513          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.", 0, 1, sequence);
7514          case 82505966: /*traceNumber*/  return new Property("traceNumber", "Identifier", "Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.", 0, java.lang.Integer.MAX_VALUE, traceNumber);
7515          case 1099842588: /*revenue*/  return new Property("revenue", "CodeableConcept", "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue);
7516          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "Code to identify the general type of benefits under which products and services are provided.", 0, 1, category);
7517          case 1957227299: /*productOrService*/  return new Property("productOrService", "CodeableConcept", "When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.", 0, 1, productOrService);
7518          case -717476168: /*productOrServiceEnd*/  return new Property("productOrServiceEnd", "CodeableConcept", "This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.", 0, 1, productOrServiceEnd);
7519          case -615513385: /*modifier*/  return new Property("modifier", "CodeableConcept", "Item typification or modifiers codes to convey additional context for the product or service.", 0, java.lang.Integer.MAX_VALUE, modifier);
7520          case 1010065041: /*programCode*/  return new Property("programCode", "CodeableConcept", "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode);
7521          case 525514609: /*patientPaid*/  return new Property("patientPaid", "Money", "The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.", 0, 1, patientPaid);
7522          case -1285004149: /*quantity*/  return new Property("quantity", "Quantity", "The number of repetitions of a service or product.", 0, 1, quantity);
7523          case -486196699: /*unitPrice*/  return new Property("unitPrice", "Money", "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.", 0, 1, unitPrice);
7524          case -1282148017: /*factor*/  return new Property("factor", "decimal", "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.", 0, 1, factor);
7525          case 114603: /*tax*/  return new Property("tax", "Money", "The total of taxes applicable for this product or service.", 0, 1, tax);
7526          case 108957: /*net*/  return new Property("net", "Money", "The total amount claimed for the group (if a grouper) or the line item.detail. Net = unit price * quantity * factor.", 0, 1, net);
7527          case 115642: /*udi*/  return new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
7528          case -1110033957: /*noteNumber*/  return new Property("noteNumber", "positiveInt", "The numbers associated with notes below which apply to the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, noteNumber);
7529          case -51825446: /*reviewOutcome*/  return new Property("reviewOutcome", "@ExplanationOfBenefit.item.reviewOutcome", "The high-level results of the adjudication if adjudication has been performed.", 0, 1, reviewOutcome);
7530          case -231349275: /*adjudication*/  return new Property("adjudication", "@ExplanationOfBenefit.item.adjudication", "The adjudication results.", 0, java.lang.Integer.MAX_VALUE, adjudication);
7531          case -828829007: /*subDetail*/  return new Property("subDetail", "", "Third-tier of goods and services.", 0, java.lang.Integer.MAX_VALUE, subDetail);
7532          default: return super.getNamedProperty(_hash, _name, _checkValid);
7533          }
7534
7535        }
7536
7537      @Override
7538      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
7539        switch (hash) {
7540        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
7541        case 82505966: /*traceNumber*/ return this.traceNumber == null ? new Base[0] : this.traceNumber.toArray(new Base[this.traceNumber.size()]); // Identifier
7542        case 1099842588: /*revenue*/ return this.revenue == null ? new Base[0] : new Base[] {this.revenue}; // CodeableConcept
7543        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
7544        case 1957227299: /*productOrService*/ return this.productOrService == null ? new Base[0] : new Base[] {this.productOrService}; // CodeableConcept
7545        case -717476168: /*productOrServiceEnd*/ return this.productOrServiceEnd == null ? new Base[0] : new Base[] {this.productOrServiceEnd}; // CodeableConcept
7546        case -615513385: /*modifier*/ return this.modifier == null ? new Base[0] : this.modifier.toArray(new Base[this.modifier.size()]); // CodeableConcept
7547        case 1010065041: /*programCode*/ return this.programCode == null ? new Base[0] : this.programCode.toArray(new Base[this.programCode.size()]); // CodeableConcept
7548        case 525514609: /*patientPaid*/ return this.patientPaid == null ? new Base[0] : new Base[] {this.patientPaid}; // Money
7549        case -1285004149: /*quantity*/ return this.quantity == null ? new Base[0] : new Base[] {this.quantity}; // Quantity
7550        case -486196699: /*unitPrice*/ return this.unitPrice == null ? new Base[0] : new Base[] {this.unitPrice}; // Money
7551        case -1282148017: /*factor*/ return this.factor == null ? new Base[0] : new Base[] {this.factor}; // DecimalType
7552        case 114603: /*tax*/ return this.tax == null ? new Base[0] : new Base[] {this.tax}; // Money
7553        case 108957: /*net*/ return this.net == null ? new Base[0] : new Base[] {this.net}; // Money
7554        case 115642: /*udi*/ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
7555        case -1110033957: /*noteNumber*/ return this.noteNumber == null ? new Base[0] : this.noteNumber.toArray(new Base[this.noteNumber.size()]); // PositiveIntType
7556        case -51825446: /*reviewOutcome*/ return this.reviewOutcome == null ? new Base[0] : new Base[] {this.reviewOutcome}; // ItemReviewOutcomeComponent
7557        case -231349275: /*adjudication*/ return this.adjudication == null ? new Base[0] : this.adjudication.toArray(new Base[this.adjudication.size()]); // AdjudicationComponent
7558        case -828829007: /*subDetail*/ return this.subDetail == null ? new Base[0] : this.subDetail.toArray(new Base[this.subDetail.size()]); // SubDetailComponent
7559        default: return super.getProperty(hash, name, checkValid);
7560        }
7561
7562      }
7563
7564      @Override
7565      public Base setProperty(int hash, String name, Base value) throws FHIRException {
7566        switch (hash) {
7567        case 1349547969: // sequence
7568          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
7569          return value;
7570        case 82505966: // traceNumber
7571          this.getTraceNumber().add(TypeConvertor.castToIdentifier(value)); // Identifier
7572          return value;
7573        case 1099842588: // revenue
7574          this.revenue = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7575          return value;
7576        case 50511102: // category
7577          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7578          return value;
7579        case 1957227299: // productOrService
7580          this.productOrService = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7581          return value;
7582        case -717476168: // productOrServiceEnd
7583          this.productOrServiceEnd = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7584          return value;
7585        case -615513385: // modifier
7586          this.getModifier().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
7587          return value;
7588        case 1010065041: // programCode
7589          this.getProgramCode().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
7590          return value;
7591        case 525514609: // patientPaid
7592          this.patientPaid = TypeConvertor.castToMoney(value); // Money
7593          return value;
7594        case -1285004149: // quantity
7595          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
7596          return value;
7597        case -486196699: // unitPrice
7598          this.unitPrice = TypeConvertor.castToMoney(value); // Money
7599          return value;
7600        case -1282148017: // factor
7601          this.factor = TypeConvertor.castToDecimal(value); // DecimalType
7602          return value;
7603        case 114603: // tax
7604          this.tax = TypeConvertor.castToMoney(value); // Money
7605          return value;
7606        case 108957: // net
7607          this.net = TypeConvertor.castToMoney(value); // Money
7608          return value;
7609        case 115642: // udi
7610          this.getUdi().add(TypeConvertor.castToReference(value)); // Reference
7611          return value;
7612        case -1110033957: // noteNumber
7613          this.getNoteNumber().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
7614          return value;
7615        case -51825446: // reviewOutcome
7616          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
7617          return value;
7618        case -231349275: // adjudication
7619          this.getAdjudication().add((AdjudicationComponent) value); // AdjudicationComponent
7620          return value;
7621        case -828829007: // subDetail
7622          this.getSubDetail().add((SubDetailComponent) value); // SubDetailComponent
7623          return value;
7624        default: return super.setProperty(hash, name, value);
7625        }
7626
7627      }
7628
7629      @Override
7630      public Base setProperty(String name, Base value) throws FHIRException {
7631        if (name.equals("sequence")) {
7632          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
7633        } else if (name.equals("traceNumber")) {
7634          this.getTraceNumber().add(TypeConvertor.castToIdentifier(value));
7635        } else if (name.equals("revenue")) {
7636          this.revenue = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7637        } else if (name.equals("category")) {
7638          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7639        } else if (name.equals("productOrService")) {
7640          this.productOrService = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7641        } else if (name.equals("productOrServiceEnd")) {
7642          this.productOrServiceEnd = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
7643        } else if (name.equals("modifier")) {
7644          this.getModifier().add(TypeConvertor.castToCodeableConcept(value));
7645        } else if (name.equals("programCode")) {
7646          this.getProgramCode().add(TypeConvertor.castToCodeableConcept(value));
7647        } else if (name.equals("patientPaid")) {
7648          this.patientPaid = TypeConvertor.castToMoney(value); // Money
7649        } else if (name.equals("quantity")) {
7650          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
7651        } else if (name.equals("unitPrice")) {
7652          this.unitPrice = TypeConvertor.castToMoney(value); // Money
7653        } else if (name.equals("factor")) {
7654          this.factor = TypeConvertor.castToDecimal(value); // DecimalType
7655        } else if (name.equals("tax")) {
7656          this.tax = TypeConvertor.castToMoney(value); // Money
7657        } else if (name.equals("net")) {
7658          this.net = TypeConvertor.castToMoney(value); // Money
7659        } else if (name.equals("udi")) {
7660          this.getUdi().add(TypeConvertor.castToReference(value));
7661        } else if (name.equals("noteNumber")) {
7662          this.getNoteNumber().add(TypeConvertor.castToPositiveInt(value));
7663        } else if (name.equals("reviewOutcome")) {
7664          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
7665        } else if (name.equals("adjudication")) {
7666          this.getAdjudication().add((AdjudicationComponent) value);
7667        } else if (name.equals("subDetail")) {
7668          this.getSubDetail().add((SubDetailComponent) value);
7669        } else
7670          return super.setProperty(name, value);
7671        return value;
7672      }
7673
7674  @Override
7675  public void removeChild(String name, Base value) throws FHIRException {
7676        if (name.equals("sequence")) {
7677          this.sequence = null;
7678        } else if (name.equals("traceNumber")) {
7679          this.getTraceNumber().remove(value);
7680        } else if (name.equals("revenue")) {
7681          this.revenue = null;
7682        } else if (name.equals("category")) {
7683          this.category = null;
7684        } else if (name.equals("productOrService")) {
7685          this.productOrService = null;
7686        } else if (name.equals("productOrServiceEnd")) {
7687          this.productOrServiceEnd = null;
7688        } else if (name.equals("modifier")) {
7689          this.getModifier().remove(value);
7690        } else if (name.equals("programCode")) {
7691          this.getProgramCode().remove(value);
7692        } else if (name.equals("patientPaid")) {
7693          this.patientPaid = null;
7694        } else if (name.equals("quantity")) {
7695          this.quantity = null;
7696        } else if (name.equals("unitPrice")) {
7697          this.unitPrice = null;
7698        } else if (name.equals("factor")) {
7699          this.factor = null;
7700        } else if (name.equals("tax")) {
7701          this.tax = null;
7702        } else if (name.equals("net")) {
7703          this.net = null;
7704        } else if (name.equals("udi")) {
7705          this.getUdi().remove(value);
7706        } else if (name.equals("noteNumber")) {
7707          this.getNoteNumber().remove(value);
7708        } else if (name.equals("reviewOutcome")) {
7709          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
7710        } else if (name.equals("adjudication")) {
7711          this.getAdjudication().remove((AdjudicationComponent) value);
7712        } else if (name.equals("subDetail")) {
7713          this.getSubDetail().remove((SubDetailComponent) value);
7714        } else
7715          super.removeChild(name, value);
7716        
7717      }
7718
7719      @Override
7720      public Base makeProperty(int hash, String name) throws FHIRException {
7721        switch (hash) {
7722        case 1349547969:  return getSequenceElement();
7723        case 82505966:  return addTraceNumber(); 
7724        case 1099842588:  return getRevenue();
7725        case 50511102:  return getCategory();
7726        case 1957227299:  return getProductOrService();
7727        case -717476168:  return getProductOrServiceEnd();
7728        case -615513385:  return addModifier(); 
7729        case 1010065041:  return addProgramCode(); 
7730        case 525514609:  return getPatientPaid();
7731        case -1285004149:  return getQuantity();
7732        case -486196699:  return getUnitPrice();
7733        case -1282148017:  return getFactorElement();
7734        case 114603:  return getTax();
7735        case 108957:  return getNet();
7736        case 115642:  return addUdi(); 
7737        case -1110033957:  return addNoteNumberElement();
7738        case -51825446:  return getReviewOutcome();
7739        case -231349275:  return addAdjudication(); 
7740        case -828829007:  return addSubDetail(); 
7741        default: return super.makeProperty(hash, name);
7742        }
7743
7744      }
7745
7746      @Override
7747      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
7748        switch (hash) {
7749        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
7750        case 82505966: /*traceNumber*/ return new String[] {"Identifier"};
7751        case 1099842588: /*revenue*/ return new String[] {"CodeableConcept"};
7752        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
7753        case 1957227299: /*productOrService*/ return new String[] {"CodeableConcept"};
7754        case -717476168: /*productOrServiceEnd*/ return new String[] {"CodeableConcept"};
7755        case -615513385: /*modifier*/ return new String[] {"CodeableConcept"};
7756        case 1010065041: /*programCode*/ return new String[] {"CodeableConcept"};
7757        case 525514609: /*patientPaid*/ return new String[] {"Money"};
7758        case -1285004149: /*quantity*/ return new String[] {"Quantity"};
7759        case -486196699: /*unitPrice*/ return new String[] {"Money"};
7760        case -1282148017: /*factor*/ return new String[] {"decimal"};
7761        case 114603: /*tax*/ return new String[] {"Money"};
7762        case 108957: /*net*/ return new String[] {"Money"};
7763        case 115642: /*udi*/ return new String[] {"Reference"};
7764        case -1110033957: /*noteNumber*/ return new String[] {"positiveInt"};
7765        case -51825446: /*reviewOutcome*/ return new String[] {"@ExplanationOfBenefit.item.reviewOutcome"};
7766        case -231349275: /*adjudication*/ return new String[] {"@ExplanationOfBenefit.item.adjudication"};
7767        case -828829007: /*subDetail*/ return new String[] {};
7768        default: return super.getTypesForProperty(hash, name);
7769        }
7770
7771      }
7772
7773      @Override
7774      public Base addChild(String name) throws FHIRException {
7775        if (name.equals("sequence")) {
7776          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.detail.sequence");
7777        }
7778        else if (name.equals("traceNumber")) {
7779          return addTraceNumber();
7780        }
7781        else if (name.equals("revenue")) {
7782          this.revenue = new CodeableConcept();
7783          return this.revenue;
7784        }
7785        else if (name.equals("category")) {
7786          this.category = new CodeableConcept();
7787          return this.category;
7788        }
7789        else if (name.equals("productOrService")) {
7790          this.productOrService = new CodeableConcept();
7791          return this.productOrService;
7792        }
7793        else if (name.equals("productOrServiceEnd")) {
7794          this.productOrServiceEnd = new CodeableConcept();
7795          return this.productOrServiceEnd;
7796        }
7797        else if (name.equals("modifier")) {
7798          return addModifier();
7799        }
7800        else if (name.equals("programCode")) {
7801          return addProgramCode();
7802        }
7803        else if (name.equals("patientPaid")) {
7804          this.patientPaid = new Money();
7805          return this.patientPaid;
7806        }
7807        else if (name.equals("quantity")) {
7808          this.quantity = new Quantity();
7809          return this.quantity;
7810        }
7811        else if (name.equals("unitPrice")) {
7812          this.unitPrice = new Money();
7813          return this.unitPrice;
7814        }
7815        else if (name.equals("factor")) {
7816          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.detail.factor");
7817        }
7818        else if (name.equals("tax")) {
7819          this.tax = new Money();
7820          return this.tax;
7821        }
7822        else if (name.equals("net")) {
7823          this.net = new Money();
7824          return this.net;
7825        }
7826        else if (name.equals("udi")) {
7827          return addUdi();
7828        }
7829        else if (name.equals("noteNumber")) {
7830          throw new FHIRException("Cannot call addChild on a singleton property ExplanationOfBenefit.item.detail.noteNumber");
7831        }
7832        else if (name.equals("reviewOutcome")) {
7833          this.reviewOutcome = new ItemReviewOutcomeComponent();
7834          return this.reviewOutcome;
7835        }
7836        else if (name.equals("adjudication")) {
7837          return addAdjudication();
7838        }
7839        else if (name.equals("subDetail")) {
7840          return addSubDetail();
7841        }
7842        else
7843          return super.addChild(name);
7844      }
7845
7846      public DetailComponent copy() {
7847        DetailComponent dst = new DetailComponent();
7848        copyValues(dst);
7849        return dst;
7850      }
7851
7852      public void copyValues(DetailComponent dst) {
7853        super.copyValues(dst);
7854        dst.sequence = sequence == null ? null : sequence.copy();
7855        if (traceNumber != null) {
7856          dst.traceNumber = new ArrayList<Identifier>();
7857          for (Identifier i : traceNumber)
7858            dst.traceNumber.add(i.copy());
7859        };
7860        dst.revenue = revenue == null ? null : revenue.copy();
7861        dst.category = category == null ? null : category.copy();
7862        dst.productOrService = productOrService == null ? null : productOrService.copy();
7863        dst.productOrServiceEnd = productOrServiceEnd == null ? null : productOrServiceEnd.copy();
7864        if (modifier != null) {
7865          dst.modifier = new ArrayList<CodeableConcept>();
7866          for (CodeableConcept i : modifier)
7867            dst.modifier.add(i.copy());
7868        };
7869        if (programCode != null) {
7870          dst.programCode = new ArrayList<CodeableConcept>();
7871          for (CodeableConcept i : programCode)
7872            dst.programCode.add(i.copy());
7873        };
7874        dst.patientPaid = patientPaid == null ? null : patientPaid.copy();
7875        dst.quantity = quantity == null ? null : quantity.copy();
7876        dst.unitPrice = unitPrice == null ? null : unitPrice.copy();
7877        dst.factor = factor == null ? null : factor.copy();
7878        dst.tax = tax == null ? null : tax.copy();
7879        dst.net = net == null ? null : net.copy();
7880        if (udi != null) {
7881          dst.udi = new ArrayList<Reference>();
7882          for (Reference i : udi)
7883            dst.udi.add(i.copy());
7884        };
7885        if (noteNumber != null) {
7886          dst.noteNumber = new ArrayList<PositiveIntType>();
7887          for (PositiveIntType i : noteNumber)
7888            dst.noteNumber.add(i.copy());
7889        };
7890        dst.reviewOutcome = reviewOutcome == null ? null : reviewOutcome.copy();
7891        if (adjudication != null) {
7892          dst.adjudication = new ArrayList<AdjudicationComponent>();
7893          for (AdjudicationComponent i : adjudication)
7894            dst.adjudication.add(i.copy());
7895        };
7896        if (subDetail != null) {
7897          dst.subDetail = new ArrayList<SubDetailComponent>();
7898          for (SubDetailComponent i : subDetail)
7899            dst.subDetail.add(i.copy());
7900        };
7901      }
7902
7903      @Override
7904      public boolean equalsDeep(Base other_) {
7905        if (!super.equalsDeep(other_))
7906          return false;
7907        if (!(other_ instanceof DetailComponent))
7908          return false;
7909        DetailComponent o = (DetailComponent) other_;
7910        return compareDeep(sequence, o.sequence, true) && compareDeep(traceNumber, o.traceNumber, true)
7911           && compareDeep(revenue, o.revenue, true) && compareDeep(category, o.category, true) && compareDeep(productOrService, o.productOrService, true)
7912           && compareDeep(productOrServiceEnd, o.productOrServiceEnd, true) && compareDeep(modifier, o.modifier, true)
7913           && compareDeep(programCode, o.programCode, true) && compareDeep(patientPaid, o.patientPaid, true)
7914           && compareDeep(quantity, o.quantity, true) && compareDeep(unitPrice, o.unitPrice, true) && compareDeep(factor, o.factor, true)
7915           && compareDeep(tax, o.tax, true) && compareDeep(net, o.net, true) && compareDeep(udi, o.udi, true)
7916           && compareDeep(noteNumber, o.noteNumber, true) && compareDeep(reviewOutcome, o.reviewOutcome, true)
7917           && compareDeep(adjudication, o.adjudication, true) && compareDeep(subDetail, o.subDetail, true)
7918          ;
7919      }
7920
7921      @Override
7922      public boolean equalsShallow(Base other_) {
7923        if (!super.equalsShallow(other_))
7924          return false;
7925        if (!(other_ instanceof DetailComponent))
7926          return false;
7927        DetailComponent o = (DetailComponent) other_;
7928        return compareValues(sequence, o.sequence, true) && compareValues(factor, o.factor, true) && compareValues(noteNumber, o.noteNumber, true)
7929          ;
7930      }
7931
7932      public boolean isEmpty() {
7933        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(sequence, traceNumber, revenue
7934          , category, productOrService, productOrServiceEnd, modifier, programCode, patientPaid
7935          , quantity, unitPrice, factor, tax, net, udi, noteNumber, reviewOutcome, adjudication
7936          , subDetail);
7937      }
7938
7939  public String fhirType() {
7940    return "ExplanationOfBenefit.item.detail";
7941
7942  }
7943
7944  }
7945
7946    @Block()
7947    public static class SubDetailComponent extends BackboneElement implements IBaseBackboneElement {
7948        /**
7949         * A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.
7950         */
7951        @Child(name = "sequence", type = {PositiveIntType.class}, order=1, min=1, max=1, modifier=false, summary=false)
7952        @Description(shortDefinition="Product or service provided", formalDefinition="A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items." )
7953        protected PositiveIntType sequence;
7954
7955        /**
7956         * Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.
7957         */
7958        @Child(name = "traceNumber", type = {Identifier.class}, order=2, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
7959        @Description(shortDefinition="Number for tracking", formalDefinition="Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners." )
7960        protected List<Identifier> traceNumber;
7961
7962        /**
7963         * The type of revenue or cost center providing the product and/or service.
7964         */
7965        @Child(name = "revenue", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=false)
7966        @Description(shortDefinition="Revenue or cost center code", formalDefinition="The type of revenue or cost center providing the product and/or service." )
7967        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-revenue-center")
7968        protected CodeableConcept revenue;
7969
7970        /**
7971         * Code to identify the general type of benefits under which products and services are provided.
7972         */
7973        @Child(name = "category", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
7974        @Description(shortDefinition="Benefit classification", formalDefinition="Code to identify the general type of benefits under which products and services are provided." )
7975        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-benefitcategory")
7976        protected CodeableConcept category;
7977
7978        /**
7979         * When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.
7980         */
7981        @Child(name = "productOrService", type = {CodeableConcept.class}, order=5, min=0, max=1, modifier=false, summary=false)
7982        @Description(shortDefinition="Billing, service, product, or drug code", formalDefinition="When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used." )
7983        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-uscls")
7984        protected CodeableConcept productOrService;
7985
7986        /**
7987         * This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.
7988         */
7989        @Child(name = "productOrServiceEnd", type = {CodeableConcept.class}, order=6, min=0, max=1, modifier=false, summary=false)
7990        @Description(shortDefinition="End of a range of codes", formalDefinition="This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims." )
7991        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/service-uscls")
7992        protected CodeableConcept productOrServiceEnd;
7993
7994        /**
7995         * Item typification or modifiers codes to convey additional context for the product or service.
7996         */
7997        @Child(name = "modifier", type = {CodeableConcept.class}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
7998        @Description(shortDefinition="Service/Product billing modifiers", formalDefinition="Item typification or modifiers codes to convey additional context for the product or service." )
7999        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/claim-modifiers")
8000        protected List<CodeableConcept> modifier;
8001
8002        /**
8003         * Identifies the program under which this may be recovered.
8004         */
8005        @Child(name = "programCode", type = {CodeableConcept.class}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
8006        @Description(shortDefinition="Program the product or service is provided under", formalDefinition="Identifies the program under which this may be recovered." )
8007        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/ex-program-code")
8008        protected List<CodeableConcept> programCode;
8009
8010        /**
8011         * The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.
8012         */
8013        @Child(name = "patientPaid", type = {Money.class}, order=9, min=0, max=1, modifier=false, summary=false)
8014        @Description(shortDefinition="Paid by the patient", formalDefinition="The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services." )
8015        protected Money patientPaid;
8016
8017        /**
8018         * The number of repetitions of a service or product.
8019         */
8020        @Child(name = "quantity", type = {Quantity.class}, order=10, min=0, max=1, modifier=false, summary=false)
8021        @Description(shortDefinition="Count of products or services", formalDefinition="The number of repetitions of a service or product." )
8022        protected Quantity quantity;
8023
8024        /**
8025         * If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.
8026         */
8027        @Child(name = "unitPrice", type = {Money.class}, order=11, min=0, max=1, modifier=false, summary=false)
8028        @Description(shortDefinition="Fee, charge or cost per item", formalDefinition="If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group." )
8029        protected Money unitPrice;
8030
8031        /**
8032         * A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
8033         */
8034        @Child(name = "factor", type = {DecimalType.class}, order=12, min=0, max=1, modifier=false, summary=false)
8035        @Description(shortDefinition="Price scaling factor", formalDefinition="A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount." )
8036        protected DecimalType factor;
8037
8038        /**
8039         * The total of taxes applicable for this product or service.
8040         */
8041        @Child(name = "tax", type = {Money.class}, order=13, min=0, max=1, modifier=false, summary=false)
8042        @Description(shortDefinition="Total tax", formalDefinition="The total of taxes applicable for this product or service." )
8043        protected Money tax;
8044
8045        /**
8046         * The total amount claimed for the line item.detail.subDetail. Net = unit price * quantity * factor.
8047         */
8048        @Child(name = "net", type = {Money.class}, order=14, min=0, max=1, modifier=false, summary=false)
8049        @Description(shortDefinition="Total item cost", formalDefinition="The total amount claimed for the line item.detail.subDetail. Net = unit price * quantity * factor." )
8050        protected Money net;
8051
8052        /**
8053         * Unique Device Identifiers associated with this line item.
8054         */
8055        @Child(name = "udi", type = {Device.class}, order=15, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
8056        @Description(shortDefinition="Unique device identifier", formalDefinition="Unique Device Identifiers associated with this line item." )
8057        protected List<Reference> udi;
8058
8059        /**
8060         * The numbers associated with notes below which apply to the adjudication of this item.
8061         */
8062        @Child(name = "noteNumber", type = {PositiveIntType.class}, order=16, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
8063        @Description(shortDefinition="Applicable note numbers", formalDefinition="The numbers associated with notes below which apply to the adjudication of this item." )
8064        protected List<PositiveIntType> noteNumber;
8065
8066        /**
8067         * The high-level results of the adjudication if adjudication has been performed.
8068         */
8069        @Child(name = "reviewOutcome", type = {ItemReviewOutcomeComponent.class}, order=17, min=0, max=1, modifier=false, summary=false)
8070        @Description(shortDefinition="Subdetail level adjudication results", formalDefinition="The high-level results of the adjudication if adjudication has been performed." )
8071        protected ItemReviewOutcomeComponent reviewOutcome;
8072
8073        /**
8074         * The adjudication results.
8075         */
8076        @Child(name = "adjudication", type = {AdjudicationComponent.class}, order=18, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
8077        @Description(shortDefinition="Subdetail level adjudication details", formalDefinition="The adjudication results." )
8078        protected List<AdjudicationComponent> adjudication;
8079
8080        private static final long serialVersionUID = -560048316L;
8081
8082    /**
8083     * Constructor
8084     */
8085      public SubDetailComponent() {
8086        super();
8087      }
8088
8089    /**
8090     * Constructor
8091     */
8092      public SubDetailComponent(int sequence) {
8093        super();
8094        this.setSequence(sequence);
8095      }
8096
8097        /**
8098         * @return {@link #sequence} (A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
8099         */
8100        public PositiveIntType getSequenceElement() { 
8101          if (this.sequence == null)
8102            if (Configuration.errorOnAutoCreate())
8103              throw new Error("Attempt to auto-create SubDetailComponent.sequence");
8104            else if (Configuration.doAutoCreate())
8105              this.sequence = new PositiveIntType(); // bb
8106          return this.sequence;
8107        }
8108
8109        public boolean hasSequenceElement() { 
8110          return this.sequence != null && !this.sequence.isEmpty();
8111        }
8112
8113        public boolean hasSequence() { 
8114          return this.sequence != null && !this.sequence.isEmpty();
8115        }
8116
8117        /**
8118         * @param value {@link #sequence} (A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.). This is the underlying object with id, value and extensions. The accessor "getSequence" gives direct access to the value
8119         */
8120        public SubDetailComponent setSequenceElement(PositiveIntType value) { 
8121          this.sequence = value;
8122          return this;
8123        }
8124
8125        /**
8126         * @return A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.
8127         */
8128        public int getSequence() { 
8129          return this.sequence == null || this.sequence.isEmpty() ? 0 : this.sequence.getValue();
8130        }
8131
8132        /**
8133         * @param value A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.
8134         */
8135        public SubDetailComponent setSequence(int value) { 
8136            if (this.sequence == null)
8137              this.sequence = new PositiveIntType();
8138            this.sequence.setValue(value);
8139          return this;
8140        }
8141
8142        /**
8143         * @return {@link #traceNumber} (Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.)
8144         */
8145        public List<Identifier> getTraceNumber() { 
8146          if (this.traceNumber == null)
8147            this.traceNumber = new ArrayList<Identifier>();
8148          return this.traceNumber;
8149        }
8150
8151        /**
8152         * @return Returns a reference to <code>this</code> for easy method chaining
8153         */
8154        public SubDetailComponent setTraceNumber(List<Identifier> theTraceNumber) { 
8155          this.traceNumber = theTraceNumber;
8156          return this;
8157        }
8158
8159        public boolean hasTraceNumber() { 
8160          if (this.traceNumber == null)
8161            return false;
8162          for (Identifier item : this.traceNumber)
8163            if (!item.isEmpty())
8164              return true;
8165          return false;
8166        }
8167
8168        public Identifier addTraceNumber() { //3
8169          Identifier t = new Identifier();
8170          if (this.traceNumber == null)
8171            this.traceNumber = new ArrayList<Identifier>();
8172          this.traceNumber.add(t);
8173          return t;
8174        }
8175
8176        public SubDetailComponent addTraceNumber(Identifier t) { //3
8177          if (t == null)
8178            return this;
8179          if (this.traceNumber == null)
8180            this.traceNumber = new ArrayList<Identifier>();
8181          this.traceNumber.add(t);
8182          return this;
8183        }
8184
8185        /**
8186         * @return The first repetition of repeating field {@link #traceNumber}, creating it if it does not already exist {3}
8187         */
8188        public Identifier getTraceNumberFirstRep() { 
8189          if (getTraceNumber().isEmpty()) {
8190            addTraceNumber();
8191          }
8192          return getTraceNumber().get(0);
8193        }
8194
8195        /**
8196         * @return {@link #revenue} (The type of revenue or cost center providing the product and/or service.)
8197         */
8198        public CodeableConcept getRevenue() { 
8199          if (this.revenue == null)
8200            if (Configuration.errorOnAutoCreate())
8201              throw new Error("Attempt to auto-create SubDetailComponent.revenue");
8202            else if (Configuration.doAutoCreate())
8203              this.revenue = new CodeableConcept(); // cc
8204          return this.revenue;
8205        }
8206
8207        public boolean hasRevenue() { 
8208          return this.revenue != null && !this.revenue.isEmpty();
8209        }
8210
8211        /**
8212         * @param value {@link #revenue} (The type of revenue or cost center providing the product and/or service.)
8213         */
8214        public SubDetailComponent setRevenue(CodeableConcept value) { 
8215          this.revenue = value;
8216          return this;
8217        }
8218
8219        /**
8220         * @return {@link #category} (Code to identify the general type of benefits under which products and services are provided.)
8221         */
8222        public CodeableConcept getCategory() { 
8223          if (this.category == null)
8224            if (Configuration.errorOnAutoCreate())
8225              throw new Error("Attempt to auto-create SubDetailComponent.category");
8226            else if (Configuration.doAutoCreate())
8227              this.category = new CodeableConcept(); // cc
8228          return this.category;
8229        }
8230
8231        public boolean hasCategory() { 
8232          return this.category != null && !this.category.isEmpty();
8233        }
8234
8235        /**
8236         * @param value {@link #category} (Code to identify the general type of benefits under which products and services are provided.)
8237         */
8238        public SubDetailComponent setCategory(CodeableConcept value) { 
8239          this.category = value;
8240          return this;
8241        }
8242
8243        /**
8244         * @return {@link #productOrService} (When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.)
8245         */
8246        public CodeableConcept getProductOrService() { 
8247          if (this.productOrService == null)
8248            if (Configuration.errorOnAutoCreate())
8249              throw new Error("Attempt to auto-create SubDetailComponent.productOrService");
8250            else if (Configuration.doAutoCreate())
8251              this.productOrService = new CodeableConcept(); // cc
8252          return this.productOrService;
8253        }
8254
8255        public boolean hasProductOrService() { 
8256          return this.productOrService != null && !this.productOrService.isEmpty();
8257        }
8258
8259        /**
8260         * @param value {@link #productOrService} (When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.)
8261         */
8262        public SubDetailComponent setProductOrService(CodeableConcept value) { 
8263          this.productOrService = value;
8264          return this;
8265        }
8266
8267        /**
8268         * @return {@link #productOrServiceEnd} (This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.)
8269         */
8270        public CodeableConcept getProductOrServiceEnd() { 
8271          if (this.productOrServiceEnd == null)
8272            if (Configuration.errorOnAutoCreate())
8273              throw new Error("Attempt to auto-create SubDetailComponent.productOrServiceEnd");
8274            else if (Configuration.doAutoCreate())
8275              this.productOrServiceEnd = new CodeableConcept(); // cc
8276          return this.productOrServiceEnd;
8277        }
8278
8279        public boolean hasProductOrServiceEnd() { 
8280          return this.productOrServiceEnd != null && !this.productOrServiceEnd.isEmpty();
8281        }
8282
8283        /**
8284         * @param value {@link #productOrServiceEnd} (This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.)
8285         */
8286        public SubDetailComponent setProductOrServiceEnd(CodeableConcept value) { 
8287          this.productOrServiceEnd = value;
8288          return this;
8289        }
8290
8291        /**
8292         * @return {@link #modifier} (Item typification or modifiers codes to convey additional context for the product or service.)
8293         */
8294        public List<CodeableConcept> getModifier() { 
8295          if (this.modifier == null)
8296            this.modifier = new ArrayList<CodeableConcept>();
8297          return this.modifier;
8298        }
8299
8300        /**
8301         * @return Returns a reference to <code>this</code> for easy method chaining
8302         */
8303        public SubDetailComponent setModifier(List<CodeableConcept> theModifier) { 
8304          this.modifier = theModifier;
8305          return this;
8306        }
8307
8308        public boolean hasModifier() { 
8309          if (this.modifier == null)
8310            return false;
8311          for (CodeableConcept item : this.modifier)
8312            if (!item.isEmpty())
8313              return true;
8314          return false;
8315        }
8316
8317        public CodeableConcept addModifier() { //3
8318          CodeableConcept t = new CodeableConcept();
8319          if (this.modifier == null)
8320            this.modifier = new ArrayList<CodeableConcept>();
8321          this.modifier.add(t);
8322          return t;
8323        }
8324
8325        public SubDetailComponent addModifier(CodeableConcept t) { //3
8326          if (t == null)
8327            return this;
8328          if (this.modifier == null)
8329            this.modifier = new ArrayList<CodeableConcept>();
8330          this.modifier.add(t);
8331          return this;
8332        }
8333
8334        /**
8335         * @return The first repetition of repeating field {@link #modifier}, creating it if it does not already exist {3}
8336         */
8337        public CodeableConcept getModifierFirstRep() { 
8338          if (getModifier().isEmpty()) {
8339            addModifier();
8340          }
8341          return getModifier().get(0);
8342        }
8343
8344        /**
8345         * @return {@link #programCode} (Identifies the program under which this may be recovered.)
8346         */
8347        public List<CodeableConcept> getProgramCode() { 
8348          if (this.programCode == null)
8349            this.programCode = new ArrayList<CodeableConcept>();
8350          return this.programCode;
8351        }
8352
8353        /**
8354         * @return Returns a reference to <code>this</code> for easy method chaining
8355         */
8356        public SubDetailComponent setProgramCode(List<CodeableConcept> theProgramCode) { 
8357          this.programCode = theProgramCode;
8358          return this;
8359        }
8360
8361        public boolean hasProgramCode() { 
8362          if (this.programCode == null)
8363            return false;
8364          for (CodeableConcept item : this.programCode)
8365            if (!item.isEmpty())
8366              return true;
8367          return false;
8368        }
8369
8370        public CodeableConcept addProgramCode() { //3
8371          CodeableConcept t = new CodeableConcept();
8372          if (this.programCode == null)
8373            this.programCode = new ArrayList<CodeableConcept>();
8374          this.programCode.add(t);
8375          return t;
8376        }
8377
8378        public SubDetailComponent addProgramCode(CodeableConcept t) { //3
8379          if (t == null)
8380            return this;
8381          if (this.programCode == null)
8382            this.programCode = new ArrayList<CodeableConcept>();
8383          this.programCode.add(t);
8384          return this;
8385        }
8386
8387        /**
8388         * @return The first repetition of repeating field {@link #programCode}, creating it if it does not already exist {3}
8389         */
8390        public CodeableConcept getProgramCodeFirstRep() { 
8391          if (getProgramCode().isEmpty()) {
8392            addProgramCode();
8393          }
8394          return getProgramCode().get(0);
8395        }
8396
8397        /**
8398         * @return {@link #patientPaid} (The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.)
8399         */
8400        public Money getPatientPaid() { 
8401          if (this.patientPaid == null)
8402            if (Configuration.errorOnAutoCreate())
8403              throw new Error("Attempt to auto-create SubDetailComponent.patientPaid");
8404            else if (Configuration.doAutoCreate())
8405              this.patientPaid = new Money(); // cc
8406          return this.patientPaid;
8407        }
8408
8409        public boolean hasPatientPaid() { 
8410          return this.patientPaid != null && !this.patientPaid.isEmpty();
8411        }
8412
8413        /**
8414         * @param value {@link #patientPaid} (The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.)
8415         */
8416        public SubDetailComponent setPatientPaid(Money value) { 
8417          this.patientPaid = value;
8418          return this;
8419        }
8420
8421        /**
8422         * @return {@link #quantity} (The number of repetitions of a service or product.)
8423         */
8424        public Quantity getQuantity() { 
8425          if (this.quantity == null)
8426            if (Configuration.errorOnAutoCreate())
8427              throw new Error("Attempt to auto-create SubDetailComponent.quantity");
8428            else if (Configuration.doAutoCreate())
8429              this.quantity = new Quantity(); // cc
8430          return this.quantity;
8431        }
8432
8433        public boolean hasQuantity() { 
8434          return this.quantity != null && !this.quantity.isEmpty();
8435        }
8436
8437        /**
8438         * @param value {@link #quantity} (The number of repetitions of a service or product.)
8439         */
8440        public SubDetailComponent setQuantity(Quantity value) { 
8441          this.quantity = value;
8442          return this;
8443        }
8444
8445        /**
8446         * @return {@link #unitPrice} (If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.)
8447         */
8448        public Money getUnitPrice() { 
8449          if (this.unitPrice == null)
8450            if (Configuration.errorOnAutoCreate())
8451              throw new Error("Attempt to auto-create SubDetailComponent.unitPrice");
8452            else if (Configuration.doAutoCreate())
8453              this.unitPrice = new Money(); // cc
8454          return this.unitPrice;
8455        }
8456
8457        public boolean hasUnitPrice() { 
8458          return this.unitPrice != null && !this.unitPrice.isEmpty();
8459        }
8460
8461        /**
8462         * @param value {@link #unitPrice} (If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.)
8463         */
8464        public SubDetailComponent setUnitPrice(Money value) { 
8465          this.unitPrice = value;
8466          return this;
8467        }
8468
8469        /**
8470         * @return {@link #factor} (A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.). This is the underlying object with id, value and extensions. The accessor "getFactor" gives direct access to the value
8471         */
8472        public DecimalType getFactorElement() { 
8473          if (this.factor == null)
8474            if (Configuration.errorOnAutoCreate())
8475              throw new Error("Attempt to auto-create SubDetailComponent.factor");
8476            else if (Configuration.doAutoCreate())
8477              this.factor = new DecimalType(); // bb
8478          return this.factor;
8479        }
8480
8481        public boolean hasFactorElement() { 
8482          return this.factor != null && !this.factor.isEmpty();
8483        }
8484
8485        public boolean hasFactor() { 
8486          return this.factor != null && !this.factor.isEmpty();
8487        }
8488
8489        /**
8490         * @param value {@link #factor} (A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.). This is the underlying object with id, value and extensions. The accessor "getFactor" gives direct access to the value
8491         */
8492        public SubDetailComponent setFactorElement(DecimalType value) { 
8493          this.factor = value;
8494          return this;
8495        }
8496
8497        /**
8498         * @return A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
8499         */
8500        public BigDecimal getFactor() { 
8501          return this.factor == null ? null : this.factor.getValue();
8502        }
8503
8504        /**
8505         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
8506         */
8507        public SubDetailComponent setFactor(BigDecimal value) { 
8508          if (value == null)
8509            this.factor = null;
8510          else {
8511            if (this.factor == null)
8512              this.factor = new DecimalType();
8513            this.factor.setValue(value);
8514          }
8515          return this;
8516        }
8517
8518        /**
8519         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
8520         */
8521        public SubDetailComponent setFactor(long value) { 
8522              this.factor = new DecimalType();
8523            this.factor.setValue(value);
8524          return this;
8525        }
8526
8527        /**
8528         * @param value A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.
8529         */
8530        public SubDetailComponent setFactor(double value) { 
8531              this.factor = new DecimalType();
8532            this.factor.setValue(value);
8533          return this;
8534        }
8535
8536        /**
8537         * @return {@link #tax} (The total of taxes applicable for this product or service.)
8538         */
8539        public Money getTax() { 
8540          if (this.tax == null)
8541            if (Configuration.errorOnAutoCreate())
8542              throw new Error("Attempt to auto-create SubDetailComponent.tax");
8543            else if (Configuration.doAutoCreate())
8544              this.tax = new Money(); // cc
8545          return this.tax;
8546        }
8547
8548        public boolean hasTax() { 
8549          return this.tax != null && !this.tax.isEmpty();
8550        }
8551
8552        /**
8553         * @param value {@link #tax} (The total of taxes applicable for this product or service.)
8554         */
8555        public SubDetailComponent setTax(Money value) { 
8556          this.tax = value;
8557          return this;
8558        }
8559
8560        /**
8561         * @return {@link #net} (The total amount claimed for the line item.detail.subDetail. Net = unit price * quantity * factor.)
8562         */
8563        public Money getNet() { 
8564          if (this.net == null)
8565            if (Configuration.errorOnAutoCreate())
8566              throw new Error("Attempt to auto-create SubDetailComponent.net");
8567            else if (Configuration.doAutoCreate())
8568              this.net = new Money(); // cc
8569          return this.net;
8570        }
8571
8572        public boolean hasNet() { 
8573          return this.net != null && !this.net.isEmpty();
8574        }
8575
8576        /**
8577         * @param value {@link #net} (The total amount claimed for the line item.detail.subDetail. Net = unit price * quantity * factor.)
8578         */
8579        public SubDetailComponent setNet(Money value) { 
8580          this.net = value;
8581          return this;
8582        }
8583
8584        /**
8585         * @return {@link #udi} (Unique Device Identifiers associated with this line item.)
8586         */
8587        public List<Reference> getUdi() { 
8588          if (this.udi == null)
8589            this.udi = new ArrayList<Reference>();
8590          return this.udi;
8591        }
8592
8593        /**
8594         * @return Returns a reference to <code>this</code> for easy method chaining
8595         */
8596        public SubDetailComponent setUdi(List<Reference> theUdi) { 
8597          this.udi = theUdi;
8598          return this;
8599        }
8600
8601        public boolean hasUdi() { 
8602          if (this.udi == null)
8603            return false;
8604          for (Reference item : this.udi)
8605            if (!item.isEmpty())
8606              return true;
8607          return false;
8608        }
8609
8610        public Reference addUdi() { //3
8611          Reference t = new Reference();
8612          if (this.udi == null)
8613            this.udi = new ArrayList<Reference>();
8614          this.udi.add(t);
8615          return t;
8616        }
8617
8618        public SubDetailComponent addUdi(Reference t) { //3
8619          if (t == null)
8620            return this;
8621          if (this.udi == null)
8622            this.udi = new ArrayList<Reference>();
8623          this.udi.add(t);
8624          return this;
8625        }
8626
8627        /**
8628         * @return The first repetition of repeating field {@link #udi}, creating it if it does not already exist {3}
8629         */
8630        public Reference getUdiFirstRep() { 
8631          if (getUdi().isEmpty()) {
8632            addUdi();
8633          }
8634          return getUdi().get(0);
8635        }
8636
8637        /**
8638         * @return {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
8639         */
8640        public List<PositiveIntType> getNoteNumber() { 
8641          if (this.noteNumber == null)
8642            this.noteNumber = new ArrayList<PositiveIntType>();
8643          return this.noteNumber;
8644        }
8645
8646        /**
8647         * @return Returns a reference to <code>this</code> for easy method chaining
8648         */
8649        public SubDetailComponent setNoteNumber(List<PositiveIntType> theNoteNumber) { 
8650          this.noteNumber = theNoteNumber;
8651          return this;
8652        }
8653
8654        public boolean hasNoteNumber() { 
8655          if (this.noteNumber == null)
8656            return false;
8657          for (PositiveIntType item : this.noteNumber)
8658            if (!item.isEmpty())
8659              return true;
8660          return false;
8661        }
8662
8663        /**
8664         * @return {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
8665         */
8666        public PositiveIntType addNoteNumberElement() {//2 
8667          PositiveIntType t = new PositiveIntType();
8668          if (this.noteNumber == null)
8669            this.noteNumber = new ArrayList<PositiveIntType>();
8670          this.noteNumber.add(t);
8671          return t;
8672        }
8673
8674        /**
8675         * @param value {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
8676         */
8677        public SubDetailComponent addNoteNumber(int value) { //1
8678          PositiveIntType t = new PositiveIntType();
8679          t.setValue(value);
8680          if (this.noteNumber == null)
8681            this.noteNumber = new ArrayList<PositiveIntType>();
8682          this.noteNumber.add(t);
8683          return this;
8684        }
8685
8686        /**
8687         * @param value {@link #noteNumber} (The numbers associated with notes below which apply to the adjudication of this item.)
8688         */
8689        public boolean hasNoteNumber(int value) { 
8690          if (this.noteNumber == null)
8691            return false;
8692          for (PositiveIntType v : this.noteNumber)
8693            if (v.getValue().equals(value)) // positiveInt
8694              return true;
8695          return false;
8696        }
8697
8698        /**
8699         * @return {@link #reviewOutcome} (The high-level results of the adjudication if adjudication has been performed.)
8700         */
8701        public ItemReviewOutcomeComponent getReviewOutcome() { 
8702          if (this.reviewOutcome == null)
8703            if (Configuration.errorOnAutoCreate())
8704              throw new Error("Attempt to auto-create SubDetailComponent.reviewOutcome");
8705            else if (Configuration.doAutoCreate())
8706              this.reviewOutcome = new ItemReviewOutcomeComponent(); // cc
8707          return this.reviewOutcome;
8708        }
8709
8710        public boolean hasReviewOutcome() { 
8711          return this.reviewOutcome != null && !this.reviewOutcome.isEmpty();
8712        }
8713
8714        /**
8715         * @param value {@link #reviewOutcome} (The high-level results of the adjudication if adjudication has been performed.)
8716         */
8717        public SubDetailComponent setReviewOutcome(ItemReviewOutcomeComponent value) { 
8718          this.reviewOutcome = value;
8719          return this;
8720        }
8721
8722        /**
8723         * @return {@link #adjudication} (The adjudication results.)
8724         */
8725        public List<AdjudicationComponent> getAdjudication() { 
8726          if (this.adjudication == null)
8727            this.adjudication = new ArrayList<AdjudicationComponent>();
8728          return this.adjudication;
8729        }
8730
8731        /**
8732         * @return Returns a reference to <code>this</code> for easy method chaining
8733         */
8734        public SubDetailComponent setAdjudication(List<AdjudicationComponent> theAdjudication) { 
8735          this.adjudication = theAdjudication;
8736          return this;
8737        }
8738
8739        public boolean hasAdjudication() { 
8740          if (this.adjudication == null)
8741            return false;
8742          for (AdjudicationComponent item : this.adjudication)
8743            if (!item.isEmpty())
8744              return true;
8745          return false;
8746        }
8747
8748        public AdjudicationComponent addAdjudication() { //3
8749          AdjudicationComponent t = new AdjudicationComponent();
8750          if (this.adjudication == null)
8751            this.adjudication = new ArrayList<AdjudicationComponent>();
8752          this.adjudication.add(t);
8753          return t;
8754        }
8755
8756        public SubDetailComponent addAdjudication(AdjudicationComponent t) { //3
8757          if (t == null)
8758            return this;
8759          if (this.adjudication == null)
8760            this.adjudication = new ArrayList<AdjudicationComponent>();
8761          this.adjudication.add(t);
8762          return this;
8763        }
8764
8765        /**
8766         * @return The first repetition of repeating field {@link #adjudication}, creating it if it does not already exist {3}
8767         */
8768        public AdjudicationComponent getAdjudicationFirstRep() { 
8769          if (getAdjudication().isEmpty()) {
8770            addAdjudication();
8771          }
8772          return getAdjudication().get(0);
8773        }
8774
8775        protected void listChildren(List<Property> children) {
8776          super.listChildren(children);
8777          children.add(new Property("sequence", "positiveInt", "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.", 0, 1, sequence));
8778          children.add(new Property("traceNumber", "Identifier", "Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.", 0, java.lang.Integer.MAX_VALUE, traceNumber));
8779          children.add(new Property("revenue", "CodeableConcept", "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue));
8780          children.add(new Property("category", "CodeableConcept", "Code to identify the general type of benefits under which products and services are provided.", 0, 1, category));
8781          children.add(new Property("productOrService", "CodeableConcept", "When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.", 0, 1, productOrService));
8782          children.add(new Property("productOrServiceEnd", "CodeableConcept", "This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.", 0, 1, productOrServiceEnd));
8783          children.add(new Property("modifier", "CodeableConcept", "Item typification or modifiers codes to convey additional context for the product or service.", 0, java.lang.Integer.MAX_VALUE, modifier));
8784          children.add(new Property("programCode", "CodeableConcept", "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode));
8785          children.add(new Property("patientPaid", "Money", "The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.", 0, 1, patientPaid));
8786          children.add(new Property("quantity", "Quantity", "The number of repetitions of a service or product.", 0, 1, quantity));
8787          children.add(new Property("unitPrice", "Money", "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.", 0, 1, unitPrice));
8788          children.add(new Property("factor", "decimal", "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.", 0, 1, factor));
8789          children.add(new Property("tax", "Money", "The total of taxes applicable for this product or service.", 0, 1, tax));
8790          children.add(new Property("net", "Money", "The total amount claimed for the line item.detail.subDetail. Net = unit price * quantity * factor.", 0, 1, net));
8791          children.add(new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi));
8792          children.add(new Property("noteNumber", "positiveInt", "The numbers associated with notes below which apply to the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, noteNumber));
8793          children.add(new Property("reviewOutcome", "@ExplanationOfBenefit.item.reviewOutcome", "The high-level results of the adjudication if adjudication has been performed.", 0, 1, reviewOutcome));
8794          children.add(new Property("adjudication", "@ExplanationOfBenefit.item.adjudication", "The adjudication results.", 0, java.lang.Integer.MAX_VALUE, adjudication));
8795        }
8796
8797        @Override
8798        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
8799          switch (_hash) {
8800          case 1349547969: /*sequence*/  return new Property("sequence", "positiveInt", "A claim detail line. Either a simple (a product or service) or a 'group' of sub-details which are simple items.", 0, 1, sequence);
8801          case 82505966: /*traceNumber*/  return new Property("traceNumber", "Identifier", "Trace number for tracking purposes. May be defined at the jurisdiction level or between trading partners.", 0, java.lang.Integer.MAX_VALUE, traceNumber);
8802          case 1099842588: /*revenue*/  return new Property("revenue", "CodeableConcept", "The type of revenue or cost center providing the product and/or service.", 0, 1, revenue);
8803          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "Code to identify the general type of benefits under which products and services are provided.", 0, 1, category);
8804          case 1957227299: /*productOrService*/  return new Property("productOrService", "CodeableConcept", "When the value is a group code then this item collects a set of related item details, otherwise this contains the product, service, drug or other billing code for the item. This element may be the start of a range of .productOrService codes used in conjunction with .productOrServiceEnd or it may be a solo element where .productOrServiceEnd is not used.", 0, 1, productOrService);
8805          case -717476168: /*productOrServiceEnd*/  return new Property("productOrServiceEnd", "CodeableConcept", "This contains the end of a range of product, service, drug or other billing codes for the item. This element is not used when the .productOrService is a group code. This value may only be present when a .productOfService code has been provided to convey the start of the range. Typically this value may be used only with preauthorizations and not with claims.", 0, 1, productOrServiceEnd);
8806          case -615513385: /*modifier*/  return new Property("modifier", "CodeableConcept", "Item typification or modifiers codes to convey additional context for the product or service.", 0, java.lang.Integer.MAX_VALUE, modifier);
8807          case 1010065041: /*programCode*/  return new Property("programCode", "CodeableConcept", "Identifies the program under which this may be recovered.", 0, java.lang.Integer.MAX_VALUE, programCode);
8808          case 525514609: /*patientPaid*/  return new Property("patientPaid", "Money", "The amount paid by the patient, in total at the claim claim level or specifically for the item and detail level, to the provider for goods and services.", 0, 1, patientPaid);
8809          case -1285004149: /*quantity*/  return new Property("quantity", "Quantity", "The number of repetitions of a service or product.", 0, 1, quantity);
8810          case -486196699: /*unitPrice*/  return new Property("unitPrice", "Money", "If the item is not a group then this is the fee for the product or service, otherwise this is the total of the fees for the details of the group.", 0, 1, unitPrice);
8811          case -1282148017: /*factor*/  return new Property("factor", "decimal", "A real number that represents a multiplier used in determining the overall value of services delivered and/or goods received. The concept of a Factor allows for a discount or surcharge multiplier to be applied to a monetary amount.", 0, 1, factor);
8812          case 114603: /*tax*/  return new Property("tax", "Money", "The total of taxes applicable for this product or service.", 0, 1, tax);
8813          case 108957: /*net*/  return new Property("net", "Money", "The total amount claimed for the line item.detail.subDetail. Net = unit price * quantity * factor.", 0, 1, net);
8814          case 115642: /*udi*/  return new Property("udi", "Reference(Device)", "Unique Device Identifiers associated with this line item.", 0, java.lang.Integer.MAX_VALUE, udi);
8815          case -1110033957: /*noteNumber*/  return new Property("noteNumber", "positiveInt", "The numbers associated with notes below which apply to the adjudication of this item.", 0, java.lang.Integer.MAX_VALUE, noteNumber);
8816          case -51825446: /*reviewOutcome*/  return new Property("reviewOutcome", "@ExplanationOfBenefit.item.reviewOutcome", "The high-level results of the adjudication if adjudication has been performed.", 0, 1, reviewOutcome);
8817          case -231349275: /*adjudication*/  return new Property("adjudication", "@ExplanationOfBenefit.item.adjudication", "The adjudication results.", 0, java.lang.Integer.MAX_VALUE, adjudication);
8818          default: return super.getNamedProperty(_hash, _name, _checkValid);
8819          }
8820
8821        }
8822
8823      @Override
8824      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
8825        switch (hash) {
8826        case 1349547969: /*sequence*/ return this.sequence == null ? new Base[0] : new Base[] {this.sequence}; // PositiveIntType
8827        case 82505966: /*traceNumber*/ return this.traceNumber == null ? new Base[0] : this.traceNumber.toArray(new Base[this.traceNumber.size()]); // Identifier
8828        case 1099842588: /*revenue*/ return this.revenue == null ? new Base[0] : new Base[] {this.revenue}; // CodeableConcept
8829        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
8830        case 1957227299: /*productOrService*/ return this.productOrService == null ? new Base[0] : new Base[] {this.productOrService}; // CodeableConcept
8831        case -717476168: /*productOrServiceEnd*/ return this.productOrServiceEnd == null ? new Base[0] : new Base[] {this.productOrServiceEnd}; // CodeableConcept
8832        case -615513385: /*modifier*/ return this.modifier == null ? new Base[0] : this.modifier.toArray(new Base[this.modifier.size()]); // CodeableConcept
8833        case 1010065041: /*programCode*/ return this.programCode == null ? new Base[0] : this.programCode.toArray(new Base[this.programCode.size()]); // CodeableConcept
8834        case 525514609: /*patientPaid*/ return this.patientPaid == null ? new Base[0] : new Base[] {this.patientPaid}; // Money
8835        case -1285004149: /*quantity*/ return this.quantity == null ? new Base[0] : new Base[] {this.quantity}; // Quantity
8836        case -486196699: /*unitPrice*/ return this.unitPrice == null ? new Base[0] : new Base[] {this.unitPrice}; // Money
8837        case -1282148017: /*factor*/ return this.factor == null ? new Base[0] : new Base[] {this.factor}; // DecimalType
8838        case 114603: /*tax*/ return this.tax == null ? new Base[0] : new Base[] {this.tax}; // Money
8839        case 108957: /*net*/ return this.net == null ? new Base[0] : new Base[] {this.net}; // Money
8840        case 115642: /*udi*/ return this.udi == null ? new Base[0] : this.udi.toArray(new Base[this.udi.size()]); // Reference
8841        case -1110033957: /*noteNumber*/ return this.noteNumber == null ? new Base[0] : this.noteNumber.toArray(new Base[this.noteNumber.size()]); // PositiveIntType
8842        case -51825446: /*reviewOutcome*/ return this.reviewOutcome == null ? new Base[0] : new Base[] {this.reviewOutcome}; // ItemReviewOutcomeComponent
8843        case -231349275: /*adjudication*/ return this.adjudication == null ? new Base[0] : this.adjudication.toArray(new Base[this.adjudication.size()]); // AdjudicationComponent
8844        default: return super.getProperty(hash, name, checkValid);
8845        }
8846
8847      }
8848
8849      @Override
8850      public Base setProperty(int hash, String name, Base value) throws FHIRException {
8851        switch (hash) {
8852        case 1349547969: // sequence
8853          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
8854          return value;
8855        case 82505966: // traceNumber
8856          this.getTraceNumber().add(TypeConvertor.castToIdentifier(value)); // Identifier
8857          return value;
8858        case 1099842588: // revenue
8859          this.revenue = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8860          return value;
8861        case 50511102: // category
8862          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8863          return value;
8864        case 1957227299: // productOrService
8865          this.productOrService = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8866          return value;
8867        case -717476168: // productOrServiceEnd
8868          this.productOrServiceEnd = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8869          return value;
8870        case -615513385: // modifier
8871          this.getModifier().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
8872          return value;
8873        case 1010065041: // programCode
8874          this.getProgramCode().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
8875          return value;
8876        case 525514609: // patientPaid
8877          this.patientPaid = TypeConvertor.castToMoney(value); // Money
8878          return value;
8879        case -1285004149: // quantity
8880          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
8881          return value;
8882        case -486196699: // unitPrice
8883          this.unitPrice = TypeConvertor.castToMoney(value); // Money
8884          return value;
8885        case -1282148017: // factor
8886          this.factor = TypeConvertor.castToDecimal(value); // DecimalType
8887          return value;
8888        case 114603: // tax
8889          this.tax = TypeConvertor.castToMoney(value); // Money
8890          return value;
8891        case 108957: // net
8892          this.net = TypeConvertor.castToMoney(value); // Money
8893          return value;
8894        case 115642: // udi
8895          this.getUdi().add(TypeConvertor.castToReference(value)); // Reference
8896          return value;
8897        case -1110033957: // noteNumber
8898          this.getNoteNumber().add(TypeConvertor.castToPositiveInt(value)); // PositiveIntType
8899          return value;
8900        case -51825446: // reviewOutcome
8901          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
8902          return value;
8903        case -231349275: // adjudication
8904          this.getAdjudication().add((AdjudicationComponent) value); // AdjudicationComponent
8905          return value;
8906        default: return super.setProperty(hash, name, value);
8907        }
8908
8909      }
8910
8911      @Override
8912      public Base setProperty(String name, Base value) throws FHIRException {
8913        if (name.equals("sequence")) {
8914          this.sequence = TypeConvertor.castToPositiveInt(value); // PositiveIntType
8915        } else if (name.equals("traceNumber")) {
8916          this.getTraceNumber().add(TypeConvertor.castToIdentifier(value));
8917        } else if (name.equals("revenue")) {
8918          this.revenue = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8919        } else if (name.equals("category")) {
8920          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8921        } else if (name.equals("productOrService")) {
8922          this.productOrService = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8923        } else if (name.equals("productOrServiceEnd")) {
8924          this.productOrServiceEnd = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8925        } else if (name.equals("modifier")) {
8926          this.getModifier().add(TypeConvertor.castToCodeableConcept(value));
8927        } else if (name.equals("programCode")) {
8928          this.getProgramCode().add(TypeConvertor.castToCodeableConcept(value));
8929        } else if (name.equals("patientPaid")) {
8930          this.patientPaid = TypeConvertor.castToMoney(value); // Money
8931        } else if (name.equals("quantity")) {
8932          this.quantity = TypeConvertor.castToQuantity(value); // Quantity
8933        } else if (name.equals("unitPrice")) {
8934          this.unitPrice = TypeConvertor.castToMoney(value); // Money
8935        } else if (name.equals("factor")) {
8936          this.factor = TypeConvertor.castToDecimal(value); // DecimalType
8937        } else if (name.equals("tax")) {
8938          this.tax = TypeConvertor.castToMoney(value); // Money
8939        } else if (name.equals("net")) {
8940          this.net = TypeConvertor.castToMoney(value); // Money
8941        } else if (name.equals("udi")) {
8942          this.getUdi().add(TypeConvertor.castToReference(value));
8943        } else if (name.equals("noteNumber")) {
8944          this.getNoteNumber().add(TypeConvertor.castToPositiveInt(value));
8945        } else if (name.equals("reviewOutcome")) {
8946          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
8947        } else if (name.equals("adjudication")) {
8948          this.getAdjudication().add((AdjudicationComponent) value);
8949        } else
8950          return super.setProperty(name, value);
8951        return value;
8952      }
8953
8954  @Override
8955  public void removeChild(String name, Base value) throws FHIRException {
8956        if (name.equals("sequence")) {
8957          this.sequence = null;
8958        } else if (name.equals("traceNumber")) {
8959          this.getTraceNumber().remove(value);
8960        } else if (name.equals("revenue")) {
8961          this.revenue = null;
8962        } else if (name.equals("category")) {
8963          this.category = null;
8964        } else if (name.equals("productOrService")) {
8965          this.productOrService = null;
8966        } else if (name.equals("productOrServiceEnd")) {
8967          this.productOrServiceEnd = null;
8968        } else if (name.equals("modifier")) {
8969          this.getModifier().remove(value);
8970        } else if (name.equals("programCode")) {
8971          this.getProgramCode().remove(value);
8972        } else if (name.equals("patientPaid")) {
8973          this.patientPaid = null;
8974        } else if (name.equals("quantity")) {
8975          this.quantity = null;
8976        } else if (name.equals("unitPrice")) {
8977          this.unitPrice = null;
8978        } else if (name.equals("factor")) {
8979          this.factor = null;
8980        } else if (name.equals("tax")) {
8981          this.tax = null;
8982        } else if (name.equals("net")) {
8983          this.net = null;
8984        } else if (name.equals("udi")) {
8985          this.getUdi().remove(value);
8986        } else if (name.equals("noteNumber")) {
8987          this.getNoteNumber().remove(value);
8988        } else if (name.equals("reviewOutcome")) {
8989          this.reviewOutcome = (ItemReviewOutcomeComponent) value; // ItemReviewOutcomeComponent
8990        } else if (name.equals("adjudication")) {
8991          this.getAdjudication().remove((AdjudicationComponent) value);
8992        } else
8993          super.removeChild(name, value);
8994        
8995      }
8996
8997      @Override
8998      public Base makeProperty(int hash, String name) throws FHIRException {
8999        switch (hash) {
9000        case 1349547969:  return getSequenceElement();
9001        case 82505966:  return addTraceNumber(); 
9002        case 1099842588:  return getRevenue();
9003        case 50511102:  return getCategory();
9004        case 1957227299:  return getProductOrService();
9005        case -717476168:  return getProductOrServiceEnd();
9006        case -615513385:  return addModifier(); 
9007        case 1010065041:  return addProgramCode(); 
9008        case 525514609:  return getPatientPaid();
9009        case -1285004149:  return getQuantity();
9010        case -486196699:  return getUnitPrice();
9011        case -1282148017:  return getFactorElement();
9012        case 114603:  return getTax();
9013        case 108957:  return getNet();
9014        case 115642:  return addUdi(); 
9015        case -1110033957:  return addNoteNumberElement();
9016        case -51825446:  return getReviewOutcome();
9017        case -231349275:  return addAdjudication(); 
9018        default: return super.makeProperty(hash, name);
9019        }
9020
9021      }
9022
9023      @Override
9024      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
9025        switch (hash) {
9026        case 1349547969: /*sequence*/ return new String[] {"positiveInt"};
9027        case 82505966: /*traceNumber*/ return new String[] {"Identifier"};
9028        case 1099842588: /*revenue*/ return new String[] {"CodeableConcept"};
9029        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
9030        case 1957227299: /*productOrService*/ return new String[] {"CodeableConcept"};
9031        case -717476168: /*productOrServiceEnd*/ return new String[] {"CodeableConcept"};
9032        case -615513385: /*modifier*/ return new String[] {"CodeableConcept"};
9033        case 1010065041: /*programCode*/ return new String[] {"CodeableConcept"};
9034        case 525514609: /*patientPaid*/ return new String[] {"Money"};
9035        case -1285004149: /*quantity*/ return new String[] {"Quantity"};
9036        case -486196699: /*unitPrice*/ return new String[] {"Money"};
9037        case -1282148017: /*factor*/ return new String[] {"decimal"};
9038        case 114603: /*tax*/ return new String[] {"Money"};
9039        case 108957: /*net*/ return new String[] {"Money"};