package Ġio . p 8 e . spec Ċ Ċ import Ġcom . google . protobuf . Message Ċ import Ġio . p 8 e . annotations . Pr erequis ite Ċ import Ġio . p 8 e . annotations . Function Ċ import Ġio . p 8 e . annotations . Fact Ċ import Ġio . p 8 e . annotations . Input Ċ import Ġio . p 8 e . annotations . Participants Ċ import Ġio . p 8 e . annotations . Scope Specification Ċ import Ġio . p 8 e . proto . Common . Definition Spec Ċ import Ġio . p 8 e . proto . Common . Definition Spec . Type . FACT Ċ import Ġio . p 8 e . proto . Common . Definition Spec . Type . FACT _ LIST Ċ import Ġio . p 8 e . proto . Common . Definition Spec . Type . PRO POSE D Ċ import Ġio . p 8 e . proto . Common . Location Ċ import Ġio . p 8 e . proto . Common . Provenance Reference Ċ import Ġio . p 8 e . proto . Contract Specs . Condition Spec Ċ import Ġio . p 8 e . proto . Contract Specs . Consider ation Spec Ċ import Ġio . p 8 e . proto . Contract Specs . Contract Spec Ċ import Ġio . p 8 e . proto . Contract Specs . Party Type Ċ import Ġio . p 8 e . proto . Contracts Ċ import Ġio . p 8 e . proto . Contracts . Condition Proto Ċ import Ġio . p 8 e . proto . Contracts . Consider ation Proto Ċ import Ġio . p 8 e . proto . Contracts . Contract Ċ import Ġio . p 8 e . proto . Contracts . Fact Ġas ĠFact Proto Ċ import Ġio . p 8 e . proto . Proto Util Ċ import Ġio . p 8 e . util .* Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Function Ċ import Ġkotlin . reflect . full . find Annotation Ċ import Ġkotlin . reflect . full . functions Ċ import Ġkotlin . reflect . full . is Subclass Of Ċ import Ġkotlin . reflect . full . value Parameters Ċ import Ġkotlin . reflect . jvm . java Type Ċ import Ġkotlin . reflect . jvm . jvm Name Ċ Ċ object ĠContract Spec Mapper Ġ{ ĊĊĠĠĠ Ġfun ĠContract Spec . new Contract (): ĠContract . Builder Ġ= ĊĠĠĠĠĠĠĠ ĠContract . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFact Proto . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setName ( this . definition . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setData Location ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Class name ( Contract Spec :: class . java . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ref ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro venance Reference . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Hash ( this . toByteArray (). base 6 4 Sha 5 1 2 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Inputs ( this . input Specs List . map Ġ{ Ġit . new Fact (). build () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Conditions ( this . condition Specs List . map Ġ{ Ġit . new Condition Proto (). build () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Consider ations ( this . consider ation Specs List . map Ġ{ Ġit . new Consider ation Proto (). build () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Rec it als ( this . part ies In volved List . map Ġ{ Ġit . new Rec ital (). build () Ġ}) ĊĊĠĠĠ Ġfun ĠCondition Spec . new Condition Proto () Ġ= ĊĠĠĠĠĠĠĠ ĠCondition Proto . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Condition Name ( this . func Name ) ĊĊĠĠĠ Ġfun ĠConsider ation Spec . new Consider ation Proto () Ġ= ĊĠĠĠĠĠĠĠ ĠConsider ation Proto . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Consider ation Name ( this . func Name ) ĊĊĠĠĠ Ġfun ĠDefinition Spec . new Fact () Ġ= ĊĠĠĠĠĠĠĠ ĠFact Proto . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setName ( this . name ) ĊĊĠĠĠ Ġfun ĠParty Type . new Rec ital () Ġ= ĊĠĠĠĠĠĠĠ ĠContract s . Rec ital . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Signer Role ( this ) ĊĊĠĠĠ Ġfun Ġfind Rec ital ( clazz : ĠK Class < out ĠP 8 e Contract >) Ġ= Ġclazz . find Annotation < Participants >() ĊĊĠĠĠ Ġfun Ġde hyd rate Spec ( ĊĠĠĠĠĠĠĠ Ġclazz : ĠK Class < out ĠP 8 e Contract >, ĊĠĠĠĠĠĠĠ Ġcontract Ref : ĠPro venance Reference , ĊĠĠĠĠĠĠĠ Ġproto Ref : ĠPro venance Reference ĊĠĠĠ Ġ): ĠContract Spec Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthe Ġcontract Ġis Ġvalid Ġby Ġchecking Ġfor Ġthe Ġappropriate Ġjava Ġinterface . ĊĠĠĠĠĠĠĠ Ġclazz . is Subclass Of ( P 8 e Contract :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" Contract Ġclass Ġ${ clazz :: class . java . name } Ġis Ġnot Ġa Ġsubclass Ġof ĠP 8 e Contract ") ĊĊĠĠĠĠĠĠĠ Ġval Ġscope Spec ifications Ġ= Ġclazz . annotations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠScope Specification Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠScope Specification Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . names . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take Unless Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" Class Ġrequires Ġa ĠScope Specification Ġannotation ") ĊĊĠĠĠĠĠĠĠ Ġval Ġspec Ġ= ĠContract Spec . newBuilder () ĊĊĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspec . definition Ġ= Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . simple Name !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . jvm Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontract Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ACT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclazz . construct ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . size Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" No Ġconstructor Ġfound , Ġor Ġmore Ġthan Ġone Ġconstructor Ġidentified ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfact Annotation Ġ= Ġparam . find Annotation < Fact >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw Contract Definition (" Constructor Ġparam (${ param . name }) Ġis Ġmissing Ġ@ Fact Ġannotation ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( List :: class Ġ== Ġparam . type . classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġer ased Type Ġ= Ġ( param . type . java Type Ġas ĠParameter ized Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. actual Type Arguments [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġit Ġas ĠClass < *> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage :: class . java . isAssignableFrom ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. or Throw Contract Definition (" Constructor Ġparameter Ġof Ġtype ĠList < T > Ġmust Ġhave Ġa Ġtype ĠT Ġthat Ġimplements Ġ${ Message :: class . java . name }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . add Input Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfact Annotation . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġer ased Type . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ACT _ LIST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . add Input Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfact Annotation . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . type . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġrec ital Ġto Ġthe Ġcontract Ġspec . ĊĠĠĠĠĠĠĠ Ġclazz . annotations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠPart icipants Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠPart icipants Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . roles . toList () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( spec :: addAll Part ies In volved ) ĊĊĠĠĠĠĠĠĠ Ġclazz . functions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . find Annotation < Pr erequis ite >() Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfunc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Condition Spec ( proto Ref , Ġfunc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let ( spec :: addAll Condition Specs ) ĊĊĠĠĠĠĠĠĠ Ġclazz . functions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . find Annotation < Function >() Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġfunc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Consider ation Spec ( proto Ref , Ġfunc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . addAll Consider ation Specs ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġspec . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Condition Spec ( ĊĠĠĠĠĠĠĠ Ġproto Ref : ĠPro venance Reference , ĊĠĠĠĠĠĠĠ Ġfunc : ĠK Function < *> ĊĠĠĠ Ġ): ĠCondition Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠCondition Spec . newBuilder () ĊĊĠĠĠĠĠĠĠ Ġbuilder . func Name Ġ= Ġfunc . name ĊĊĠĠĠĠĠĠĠ Ġfunc . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . find Annotation < Fact >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Input Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . type . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġparam . find Annotation < Input >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw NotFound (" No Ġ@ Input Ġor Ġ@ Fact ĠFound Ġfor ĠParam Ġ${ param }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Input Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . type . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRO POSE D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfunc . find Annotation < Fact >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw NotFound (" No Ġ@ Fact ĠFound Ġfor ĠFunction Ġ${ func }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġfact Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setOutput Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfact . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . returnType . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRO POSE D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Consider ation Spec ( ĊĠĠĠĠĠĠĠ Ġproto Ref : ĠPro venance Reference , ĊĠĠĠĠĠĠĠ Ġfunc : ĠK Function < *> ĊĠĠĠ Ġ): ĠConsider ation Spec Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠConsider ation Spec . newBuilder () ĊĠĠĠĠĠĠĠ Ġfunction . func Name Ġ= Ġfunc . name ĊĊĠĠĠĠĠĠĠ Ġval Ġconsideration Decorator Ġ= Ġfunc . find Annotation < Function >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw NotFound (" Function ĠAnnotation Ġnot Ġfound Ġon Ġ${ func }") ĊĠĠĠĠĠĠĠ Ġfunction . respons ible Party Ġ= Ġconsideration Decorator . inv oked By ĊĊĠĠĠĠĠĠĠ Ġfunc . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . find Annotation < Fact >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . add Input Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . type . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġparam . find Annotation < Input >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw NotFound (" No Ġ@ Input Ġor Ġ@ Fact ĠFound Ġfor ĠParam Ġ${ param }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . add Input Specs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . type . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRO POSE D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfunc . find Annotation < Fact >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. or Throw NotFound (" No Ġ@ Fact ĠFound Ġfor ĠFunction Ġ${ func }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġfact Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Proto Util ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . setOutput Spec ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Spec Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfact . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Builder Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunc . returnType . java Type . typeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproto Ref ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRO POSE D ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction . build () ĊĠĠĠ Ġ} Ċ } Ċ