diff --git a/FAQs/UseASubscriptionInAnEventHandler/index.html b/FAQs/UseASubscriptionInAnEventHandler/index.html index a7db1e244..a0b0d9c3f 100644 --- a/FAQs/UseASubscriptionInAnEventHandler/index.html +++ b/FAQs/UseASubscriptionInAnEventHandler/index.html @@ -1707,7 +1707,7 @@

Re-frame event handlerssubscribe inside an event handler goes against re-frame's design, which is based on handlers being pure functions.

Incidental safety

Calling subscribe outside a component is somewhat safe, as long as you've also called it inside a component. -The outside one has no way to dispose, but the inside one might dispose it later.

+The outside one has no way to dispose, but the inside one might dispose later.

Of course, that requires your component to be around while your other code runs. If that component unmounts and never comes back, then you're on your own again.

This isn't a real solution, it's just incidental safety.

@@ -1717,7 +1717,8 @@

Restructure your app
(reg-sub :areas (fn [db] (map (fn [r] (* Math/PI r r)) (:circles db))))
 
-(reg-event-fx store-areas
+(reg-event-fx 
+  :store-areas
   (fn [{:keys [db]} _]
     {:local-store @(subscribe [:areas])}))
 
@@ -1730,7 +1731,8 @@

Do factor out calculation helpers:

(reg-sub areas (fn [db _] (get-areas db))) -(reg-event-fx store-areas +(reg-event-fx + :store-areas (fn [{:keys [db]} _] {:local-store (get-areas db)})) @@ -1744,7 +1746,9 @@

Don't call subscribe in a callback:

Do dispatch an event in a callback:

-
(re-frame.core/reg-event-fx
+
(rf/reg-fx :circle-effect circle-effect!)
+
+(re-frame.core/reg-event-fx
   :clicked-button
   (fn [{{:keys [circles]} :db :as coeffects} event-v]
     {:circle-effect circles}))
diff --git a/flows-advanced-topics/index.html b/flows-advanced-topics/index.html
index 134b253c6..0c503f72f 100644
--- a/flows-advanced-topics/index.html
+++ b/flows-advanced-topics/index.html
@@ -1630,13 +1630,13 @@ 

Flows - advanced topics

and memory leaks... oh my!

Reactive context

To know if a thing has changed, you have to remember what it was. -To propagate change from one value to the next, you have to remember the relationship between them (a watchable). -Remembering is a side-effect.

+To propagate change from one value to the next, you have to remember their relationship (a watchable). +Memory is state. Remembering is a side-effect.

Reagent does this. Its main constructs - reactive atom, and component - are stateful, impure. We depend on this memory. It abstracts the essential complexity of reactive programming.

-

Reagent manages atoms and components with an event loop. Only in the context of this loop can be sure reagent's memory is consistent. +

Reagent manages atoms and components with an event loop. Only in the context of this loop can we be sure reagent's memory is consistent. Literally, this is called *ratom-context*.

-

Generally, *ratom-context* only has value during the evaluation of a component function (i.e., at "render time"). +

Generally, *ratom-context* only has value during the evaluation of a component function (i.e., at "render time"). When *ratom-context* has no value, reactive atoms behave differently.

You can simply call reagent.ratom/reactive? to find out whether your code is running in a reactive context.

@@ -1644,11 +1644,12 @@

Reactive context in re-frame

Now, here's where re-frame enters the picture:

  • An event handler is a pure function, with no reactive context (it has an interceptor context).
  • +
  • A subscription handler is pure, too.
  • A subscription, on the other hand, is a reactive atom (with no interceptor context).
  • Calling subscribe has the side-effect of creating a subscription.
-

Outside of a component function, a subscription's behavior differs: -Not only the behavior of the reactive atom, but also the behavior of re-frame's subscription caching mechanism.

+

Outside of a reactive context, a subscription's behavior differs: +Not only the behavior of the reactive atom, but also the behavior of its caching mechanism.

What this means for your app

Subscriptions and event handlers differ in purity and runtime context. This means they have a coloring problem.

diff --git a/js/docs.js b/js/docs.js index 77ff5832a..9cb7fe77d 100644 --- a/js/docs.js +++ b/js/docs.js @@ -1820,205 +1820,205 @@ function Ko(a){var b=q.h(a);if("_DOT__DOT_"===b)var c="..";else a:{c=new RegExp( -2121144334),mp=new x(null,"hash-map","hash-map",-439030950,null),np=new x(null,"vary-meta","vary-meta",-1580067831,null),op=new x(null,"pad","pad",1603796986,null),pp=new z(null,"dotted-access","dotted-access",114961112),qp=new x(null,"apropos","apropos",-1511857537,null),rp=new x(null,"Error","Error",-1692662047,null),sp=new x(null,"ns-refers","ns-refers",-2030918515,null),tp=new z(null,"reify-fn","reify-fn",-1360983316),up=new x("cljs.core","ex-cause","cljs.core/ex-cause",1843478517,null),vp=new x(null, "start-key","start-key",790225477,null),wp=new x("re-frame.alpha","reg-sub","re-frame.alpha/reg-sub",-219957952,null),xp=new x(null,"not-any?","not-any?",-2114707554,null),yp=new x(null,"apply","apply",-1334050276,null),zp=new x(null,"when-let","when-let",-1383043480,null),Ap=new x(null,"cljs.core","cljs.core",770546058,null),Bp=new x(null,"start","start",1285322546,null),Cp=new z(null,"miser","miser",-556060186),Dp=new x(null,"-\x3e\x3e","-\x3e\x3e",-1874332161,null),Ep=new x(null,"ifn?","ifn?", -2106461064,null),Fp=new x(null,"-\x3eEduction","-\x3eEduction",-188511967,null),Gp=new z(null,"fn-name","fn-name",-766594004),Hp=new x(null,"merge","merge",-163787882,null),Ip=new z(null,"current","current",-1088038603),Jp=new x(null,"qualified-symbol?","qualified-symbol?",98763807,null),Kp=new x(null,"ns-obj","ns-obj",-635821906,null),Lp=new x(null,"xform*","xform*",264470622,null),Mp=new x(null,"letfn","letfn",-480490827,null),Np=new z(null,"js-libs","js-libs",-502933721),Op=new x(null,"psym", -"psym",752521989,null),Pp=new x(null,"-\x3e","-\x3e",-2139605430,null),Qp=new x(null,"Inf","Inf",647172781,null),Rp=new z(null,"new","new",-2085437848),Sp=new z(null,"class","class",-2030961996),Tp=new z(null,"all","all",892129742),Up=new x(null,"nil?","nil?",1612038930,null),Vp=new x(null,"p__34739__auto__","p__34739__auto__",-787576350,null),Wp=new x(null,"uri?","uri?",2029475116,null),Xp=new x("sci.configs.reagent.reagent","error","sci.configs.reagent.reagent/error",1433174531,null),Yp=new x(null, -"cat","cat",182721320,null),Zp=new x(null,"..","..",-300507420,null),$p=new x(null,"children","children",699969545,null),aq=new x(null,"read-char*","read-char*",1494526523,null),bq=new z(null,"default","default",-1987822328),cq=new x(null,"object-array","object-array",206434647,null),dq=new z(null,"reagentRender","reagentRender",-358306383),eq=new x(null,"nnext","nnext",-2065435598,null),fq=new x("cljs.core","chunk-first","cljs.core/chunk-first",-1157877305,null),gq=new z(null,"ex-kind","ex-kind", -1581199296),hq=new x(null,"sorted-map-by","sorted-map-by",218894812,null),iq=new z("edamame","opened-delimiter","edamame/opened-delimiter",-1906008305),jq=new x("re-frame.alpha","make-restore-fn","re-frame.alpha/make-restore-fn",623194816,null),kq=new x(null,"default__29929__auto__","default__29929__auto__",1266199289,null),gm=new z("cljs.core","none","cljs.core/none",926646439),lq=new x("cljs.reader","read-date","cljs.reader/read-date",1663417238,null),mq=new x("reagent.core","reactify-component", -"reagent.core/reactify-component",-385504376,null),nq=new x(null,"params*","params*",336153603,null),oq=new x("re-frame.alpha","reg-event-db","re-frame.alpha/reg-event-db",-1319957931,null),pq=new x(null,"sci.impl.records","sci.impl.records",-393424368,null),qq=new x(null,"unreduced","unreduced",780976083,null),rq=new x(null,"add-watch","add-watch",1389887634,null),sq=new x(null,"-new-dynamic-var","-new-dynamic-var",-1029088918,null),tq=new x(null,"pop-thread-bindings","pop-thread-bindings",-1312224790, -null),uq=new x(null,"end-key","end-key",-1592097336,null),vq=new x("cljs.analyzer.api","resolve","cljs.analyzer.api/resolve",498213843,null),wq=new z(null,"do-fx","do-fx",1194163050),xq=new x(null,"unchecked-byte","unchecked-byte",1091664664,null),yq=new x(null,"opts","opts",1795607228,null),zq=new x(null,"remove-all-methods","remove-all-methods",-728267092,null),Aq=new x("re-frame.core","add-post-event-callback","re-frame.core/add-post-event-callback",-441107040,null),Bq=new x(null,"initch","initch", -946908919,null),Cq=new x("clojure.repl","source-fn","clojure.repl/source-fn",1877923323,null),Dq=new x("reagent.ratom","track!","reagent.ratom/track!",1183599982,null),Eq=new z(null,"render","render",-1408033454),Fq=new x(null,"uuid?","uuid?",400077689,null),Gq=new z(null,"reload","reload",863702807),Hq=new x(null,"a__34535__auto__","a__34535__auto__",398151068,null),Iq=new x("cljs.core","atom","cljs.core/atom",1943839529,null),Jq=new x(null,"quoted-ns","quoted-ns",-2054280928,null),Kq=new x("re-frame.core", -"reg-event-error-handler","re-frame.core/reg-event-error-handler",351507335,null),Lq=new x(null,"first","first",996428481,null),Mq=new x(null,"cursor","cursor",-1642498285,null),Nq=new x("cljs.tools.reader.impl.commons","parse-symbol","cljs.tools.reader.impl.commons/parse-symbol",-903976395,null),Oq=new z(null,"pointer-events","pointer-events",-1053858853),Pq=new z(null,"end-pos","end-pos",-1643883926),Qq=new z(null,"opts","opts",155075701),Rq=new x(null,"handler-fn","handler-fn",841143797,null), -Sq=new x("re-frame.core","reg-fx","re-frame.core/reg-fx",1560429967,null),Tq=new x(null,"event","event",1941966969,null),Uq=new x(null,"fnil","fnil",-187395162,null),Vq=new x(null,"reduced","reduced",-1189224808,null),Wq=new x(null,"on-set","on-set",1499578057,null),Xq=new z(null,"location?","location?",425878086),Yq=new z("sci.impl","eval-string+","sci.impl/eval-string+",-178784582),Zq=new x(null,"re-frame.core","re-frame.core",-1549073474,null),$q=new x(null,"pop!","pop!",-1253383511,null),ar=new x(null, -"make-reaction","make-reaction",1935680112,null),br=new x(null,"unchecked-negate-int","unchecked-negate-int",-825297602,null),cr=new x(null,"bindings","bindings",-1383038577,null),dr=new z(null,"per-line-prefix","per-line-prefix",846941813),er=new x(null,"unchecked-add-int","unchecked-add-int",-1821763285,null),fr=new z(null,".ͼb",".ͼb",909055546),gr=new z(null,".ͼc",".ͼc",-99948571),hr=new z(null,"forever","forever",2103455015),ir=new z("edamame.impl.parser","suppress","edamame.impl.parser/suppress", -1718484755),jr=new z(null,".ͼg",".ͼg",419059200),kr=new z(null,"on-change","on-change",-732046149),lr=new z(null,"fn-expr","fn-expr",-933027985),mr=new z(null,"editable?","editable?",-1805477333),nr=new z(null,".ͼm",".ͼm",-283676620),or=new x("clojure.core","multi-fn-add-method-impl","clojure.core/multi-fn-add-method-impl",-1293834231,null),pr=new x("cljs.core","nil?","cljs.core/nil?",945071861,null),qr=new z(null,"event-handler","event-handler",-487718843),rr=new x("clojure.core","-new-dynamic-var", -"clojure.core/-new-dynamic-var",-1873937019,null),sr=new z("re-frame","lifecycle","re-frame/lifecycle",-2078095936),tr=new z(null,"eof","eof",-489063237),ur=new x(null,"defrecord","defrecord",273038109,null),vr=new x(null,"even?","even?",-1827825394,null),wr=new x(null,"temp__34395__auto__","temp__34395__auto__",1706318446,null),xr=new x(null,"neg?","neg?",-1902175577,null),yr=new x(null,"float","float",-91857841,null),zr=new x(null,"chunk","chunk",449371907,null),Ar=new z(null,"queue","queue",1455835879), -Br=new x("cljs.core","fnil","cljs.core/fnil",479587341,null),Cr=new x(null,"if-let","if-let",1803593690,null),Dr=new x(null,"object?","object?",327472310,null),Er=new z(null,"on-eval","on-eval",-1349336659),Fr=new z(null,"end","end",-268185958),Gr=new z(null,"reactive","reactive",717758366),Hr=new x("reagent.ratom","make-reaction","reagent.ratom/make-reaction",272608527,null),Ir=new x(null,"parent","parent",761652748,null),Jr=new x("clojure.core","-new-var","clojure.core/-new-var",363339052,null), -Kr=new x(null,"not-native","not-native",-236392494,null),Lr=new z(null,"env","env",-1815813235),Mr=new x(null,"error","error",661562495,null),Nr=new x(null,"*print-fn*","*print-fn*",138509853,null),Or=new x("js","Number","js/Number",-508133572,null),Pr=new x(null,"dispose!","dispose!",-395693497,null),Qr=new z(null,"deftype-fields","deftype-fields",-222569172),Rr=new x("reagent.ratom","-destroy","reagent.ratom/-destroy",-1284026419,null),Sr=new z(null,"post","post",269697687),Tr=new x(null,"pos?", -"pos?",-244377722,null),Ur=new x(null,"tcoll","tcoll",-1341294481,null),Vr=new z(null,"col-key","col-key",-2009675766),Wr=new z("sci.impl","type-name","sci.impl/type-name",-1528979388),Xr=new x(null,"array","array",-440182315,null),Yr=new z(null,"no-recur-reason","no-recur-reason",-1993064353),Zr=new x(null,"ns-interns","ns-interns",535532824,null),oo=new x(null,"letfn*","letfn*",-110097810,null),zn=new z(null,"parents","parents",-2027538891),$r=new x(null,"unchecked-dec-int","unchecked-dec-int", -1339067442,null),as=new z(null,"fx-handler","fx-handler",-549783097),bs=new x(null,"bit-shift-left","bit-shift-left",-1814765981,null),cs=new x(null,"clear-sub","clear-sub",-1368681160,null),ds=new z(null,"ref","ref",1289896967),es=new x(null,"take-last","take-last",-41013151,null),fs=new z(null,"remaining-arg-count","remaining-arg-count",-1216589335),gs=new z(null,"logical-blocks","logical-blocks",-1466339776),hs=new x(null,"-\x3etype-impl","-\x3etype-impl",483401048,null),is=new z(null,"clear-flow", -"clear-flow",2086400997),js=new x(null,"short","short",-725675253,null),ks=new x(null,"atom","atom",1243487874,null),ls=new z(null,"result?","result?",1877293881),ms=new x(null,"symbol?","symbol?",1820680511,null),ns=new x(null,"defmacro","defmacro",2054157304,null),os=new x(null,"tagged-literal","tagged-literal",-896422703,null),ps=new x(null,"NaN","NaN",666918153,null),qs=new z(null,"end-col","end-col",-724155879),rs=new z(null,"inputs","inputs",865803858),ss=new z(null,"on-blur","on-blur",814300747), -ts=new x("re-frame.core","clear-event","re-frame.core/clear-event",1624271650,null),us=new x(null,"dynv","dynv",-405952138,null),vs=new x(null,"methods__29915__auto__","methods__29915__auto__",1246007595,null),ws=new z(null,"atom","atom",-397043653),xs=new x(null,"extends?","extends?",-2012201234,null),ys=new z("re-frame.std-interceptors","not-found","re-frame.std-interceptors/not-found",-1614827865),zs=new x(null,"bit-set","bit-set",-910710655,null),As=new z(null,"contextType","contextType",1033066077), -Bs=new z("clojure.core","eval-file","clojure.core/eval-file",801420726),Cs=new x("reagent.core","dispose!","reagent.core/dispose!",239740642,null),Ds=new x(null,"protocol-type-impl","protocol-type-impl",561934718,null),Es=new z(null,"phase","phase",575722892),Ym=new z(null,"ready","ready",1086465795),Fs=new x(null,"kmap","kmap",-2108296910,null),Gs=new z("sci.impl","f-meta","sci.impl/f-meta",-1735495322),Hs=new x("reagent.core","create-compiler","reagent.core/create-compiler",491047088,null),Is=new x(null, -"doc-string?","doc-string?",393166599,null),Js=new x(null,"end-test","end-test",2122505254,null),Ks=new x(null,"IRecord","IRecord",-903221169,null),T=new z(null,"arglists","arglists",1661989754),Ls=new x(null,"when-first","when-first",821699168,null),Ms=new x(null,"writer","writer",1362963291,null),Ns=new x("cljs.core","declare","cljs.core/declare",1312638100,null),Os=new z(null,"end-column","end-column",1425389514),Ps=new x(null,"xset","xset",-371743149,null),Qs=new z(null,"error-promise","error-promise", --1028111683),Rs=new x(null,"odd?","odd?",-1458588199,null),Ss=new x("cljs.core","alter-var-root","cljs.core/alter-var-root",-1342668238,null),Ts=new x(null,"split-with","split-with",1853047034,null),Us=new x("cljs.core","when","cljs.core/when",120293186,null),Vs=new x(null,"prefer-method","prefer-method",-876100205,null),Ws=new z(null,"unquote-splicing","unquote-splicing",1295267556),Xs=new z("sci.impl.analyzer","instance-expr","sci.impl.analyzer/instance-expr",629338719),Ys=new x(null,"var-args", -"var-args",1341745925,null),Zs=new z(null,"copy-enclosed-\x3einvocation","copy-enclosed-\x3einvocation",-1322388729),$s=new x(null,"sub","sub",-453228498,null),at=new x("clojure.core","sequence","clojure.core/sequence",1998774218,null),bt=new z(null,"expr","expr",745722291),ct=new x(null,"bit-or","bit-or",-1144943723,null),dt=new x(null,"sci.impl.protocols","sci.impl.protocols",-697012432,null),et=new x("js","Boolean","js/Boolean",1661145260,null),ft=new z(null,"start-block-t","start-block-t",-373430594), -gt=new x(null,"find","find",2136810983,null),ht=new x(null,"key","key",124488940,null),it=new z(null,"loaded-libs","loaded-libs",-1156389652),jt=new z("sci.impl.protocols","reified","sci.impl.protocols/reified",-2019939396),kt=new x(null,"count","count",-514511684,null),lt=new x(null,"binding","binding",-2114503176,null),mt=new x("re-frame.core","console","re-frame.core/console",1914748698,null),nt=new x(null,"interceptor","interceptor",-1526696693,null),ot=new x("sci.impl.deftype","-create-type", -"sci.impl.deftype/-create-type",-1020101113,null),Gt=new x(null,"IDeref","IDeref",1738423197,null),Ht=new x(null,"purge-event-queue","purge-event-queue",-1780102203,null),It=new z("re-frame.flow.alpha","ref","re-frame.flow.alpha/ref",854314016),Jt=new z(null,"componentWillUnmount","componentWillUnmount",1573788814),Lt=new x("re-frame.core","get-coeffect","re-frame.core/get-coeffect",1741350824,null),Mt=new x(null,"when-some","when-some",1700415903,null),Nt=new x(null,"remove-ns","remove-ns",-1915058781, -null),Ot=new x(null,"-swap!","-swap!",-535359318,null),Pt=new z(null,"className","className",-1983287057),Qt=new z(null,"resolve-symbol","resolve-symbol",-319166964),Rt=new x("cljs.core","push-thread-bindings","cljs.core/push-thread-bindings",-703482450,null),St=new x(null,"number?","number?",-1747282210,null),Tt=new x("re-frame.alpha","enrich","re-frame.alpha/enrich",618935041,null),Ut=new z("sci.impl.parser.edamame","eof","sci.impl.parser.edamame/eof",-917261517),Vt=new z(null,"exclude","exclude", --1230250334),Wt=new x(null,"query-id","query-id",-1180306927,null),Xt=new x(null,"unchecked-subtract","unchecked-subtract",-2137458667,null),Yt=new x("cljs.core","when-first","cljs.core/when-first",-667185267,null),Zt=new x(null,"sort","sort",-1700969851,null),$t=new z("sci.impl.record","map-constructor","sci.impl.record/map-constructor",1072184780),au=new x("cljs.core","in-ns","cljs.core/in-ns",1807208747,null),bu=new x(null,"-tracking?","-tracking?",-1106885352,null),cu=new z(null,"direction","direction", --633359395),du=new x(null,"juxt","juxt",671085604,null),eu=new z(null,"bracket-info","bracket-info",-1600092774),fu=new x("cljs.core","when-let","cljs.core/when-let",-2049838349,null),gu=new z(null,"body","body",-2049205669),hu=new z(null,"special","special",-1125941630),iu=new x(null,"get-effect","get-effect",116827434,null),ju=new x(null,"alength","alength",-1268305401,null),ku=new z(null,"mode","mode",654403691),lu=new z(null,"outer-idens","outer-idens",1197381241),mu=new x(null,"with-redefs", -"with-redefs",-1143728263,null),nu=new x(null,"nfirst","nfirst",-554736533,null),ou=new x(null,"volatile!","volatile!",919368405,null),pu=new z(null,"closure-bindings","closure-bindings",112932037),qu=new z(null,"border","border",1444987323),Dm=new z(null,"fallback-impl","fallback-impl",-1501286995),U=new z(null,"name","name",1843675177),ru=new z(null,"syms","syms",-1575891762),su=new x("re-frame.alpha","get-flow","re-frame.alpha/get-flow",1069428713,null),tu=new x(null,"reset-meta!","reset-meta!", -1699493291,null),uu=new x(null,"do-template","do-template",-1578627476,null),vu=new x(null,"map?","map?",-1780568534,null),wu=new x(null,"into","into",1489695498,null),xu=new x(null,"sorted-set","sorted-set",992325424,null),yu=new x(null,"ints","ints",-1761239845,null),zu=new x(null,"contains?","contains?",-1676812576,null),Au=new z(null,"component-did-update","component-did-update",-1468549173),Bu=new x("re-frame.core","enqueue","re-frame.core/enqueue",-170225827,null),Cu=new x(null,"flow\x3c-", -"flow\x3c-",-1214873134,null),Du=new x(null,"-deref","-deref",-283116853,null),Eu=new z(null,"illegal-argument","illegal-argument",-1845493170),Fu=new z(null,"class-\x3eopts","class-\x3eopts",2061906477),Gu=new x(null,"index-of","index-of",1275975485,null),Hu=new z("edamame","opened-delimiter-loc","edamame/opened-delimiter-loc",443885208),Iu=new x(null,"all-ns","all-ns",1571857784,null),Ju=new x(null,"with-bindings","with-bindings",-1197589787,null),Ku=new z(null,"writing","writing",-1486865108), -Lu=new x(null,"src","src",-10544524,null),Mu=new z(null,"parameter-from-args","parameter-from-args",-758446196),Nu=new x(null,"js-keys","js-keys",-1388365203,null),tn=new z(null,"keywordize-keys","keywordize-keys",1310784252),Ou=new z(null,"logical-block-callback","logical-block-callback",1612691194),Pu=new x(null,"inst","inst",-2008473268,null),Qu=new z(null,"selector","selector",762528866),Ru=new x(null,"struct","struct",325972931,null),Su=new z(null,"auto-resolve","auto-resolve",1851201983),Tu= -new x(null,"int?","int?",1799729645,null),Uu=new x("cljs.core","next","cljs.core/next",-1291438473,null),Vu=new x(null,"cmap","cmap",1947829886,null),Wu=new z(null,"buffer","buffer",617295198),Xu=new x(null,"empty?","empty?",76408555,null),Yu=new x(null,"lazy-cat","lazy-cat",-89906116,null),Zu=new x(null,"replacement","replacement",-195707312,null),$u=new x(null,"clear-subscription-cache!","clear-subscription-cache!",1196020095,null),av=new x(null,"*print-readably*","*print-readably*",-761361221, -null),bv=new x(null,"dissoc","dissoc",1039760994,null),cv=new x("cljs.core","refer","cljs.core/refer",269577817,null),dv=new x(null,"replace-first","replace-first",-943534331,null),ev=new z(null,"displayName","displayName",-809144601),fv=new z(null,"const","const",1709929842),gv=new x(null,"meta","meta",-1154898805,null),hv=new z(null,"indent","indent",-148200125),iv=new x(null,"reader","reader",1810192380,null),An=new z(null,"descendants","descendants",1824886031),jv=new z("sci.impl.deftype","object", -"sci.impl.deftype/object",-248099673),kv=new x(null,"str","str",-1564826950,null),lv=new x(null,"type-sym","type-sym",-1942856509,null),mv=new x(null,"IPrintWithWriter","IPrintWithWriter",-1205316154,null),nv=new z(null,"end-location","end-location",-1199449467),ov=new z("sci","error","sci/error",-979082803),pv=new z("sci.impl","constructor","sci.impl/constructor",1320345666),qv=new x(null,"*print-err-fn*","*print-err-fn*",1241679298,null),rv=new x(null,"print-str","print-str",-699700354,null),sv= -new x(null,"fn-tail","fn-tail",-178337841,null),tv=new z("edamame","error","edamame/error",882529634),Sm=new z(null,"val","val",128701612),uv=new x(null,"args__31015__auto__","args__31015__auto__",2004379211,null),vv=new z(null,"var","var",-769682797),wv=new z(null,"next","next",-117701485),xv=new x(null,"get","get",-971253014,null),yv=new x(null,"step","step",-1365547645,null),zv=new x(null,"dispatch-fn","dispatch-fn",-1401088155,null),Av=new x(null,"ex-cause","ex-cause",95392590,null),Bv=new x("cljs.core", -"let","cljs.core/let",-308701135,null),Cv=new x(null,"remove","remove",1509103113,null),Dv=new z(null,"variadic?","variadic?",584179762),Ev=new z(null,"live-inputs","live-inputs",1350889395),Fv=new x(null,"isa?","isa?",1358492324,null),mb=new z(null,"flush-on-newline","flush-on-newline",-151457939),Gv=new x("sci.configs.reagent.reagent","-generation","sci.configs.reagent.reagent/-generation",-1754580423,null),Hv=new z("re-frame","q","re-frame/q",-1128715212),Iv=new x(null,"default__29917__auto__", -"default__29917__auto__",-1914786745,null),Jv=new x(null,"iterate","iterate",694501410,null),Kv=new x(null,"backslash","backslash",-863649243,null),Lv=new x(null,"-add-loaded-lib","-add-loaded-lib",368206419,null),Mv=new x(null,"maps","maps",-71029607,null),Nv=new x(null,"mapv","mapv",-241595241,null),Ov=new x(null,"deref","deref",1494944732,null),Pv=new x(null,"loop","loop",1244978678,null),Qv=new x("cljs.core","assoc","cljs.core/assoc",322326297,null),Rv=new z(null,"event-v","event-v",1378681365), -Sv=new z(null,"public-class","public-class",1127293019),Tv=new x(null,"reagent.core","reagent.core",1841519592,null),Uv=new x(null,"map-invert","map-invert",1258886340,null),Vv=new z(null,"unquote","unquote",1649741032),Wv=new x(null,"docstring?","docstring?",-180217883,null),Xv=new x(null,"in-paths","in-paths",-1809668720,null),Yv=new x(null,"boolean","boolean",-278886877,null),Zv=new x(null,"bytes","bytes",-1478569089,null),$v=new x(null,"vector","vector",-751469611,null),aw=new x(null,"long","long", -1469079434,null),bw=new x(null,"size-or-seq","size-or-seq",-2062823589,null),cw=new z(null,"satisfies","satisfies",-311664218),dw=new x(null,"butlast","butlast",1573039585,null),ew=new z(null,"max-columns","max-columns",1742323262),fw=new z(null,"display-name","display-name",694513143),gw=new x(null,"delay?","delay?",-1528239209,null),hw=new x("clojure.repl","print-doc","clojure.repl/print-doc",-375546711,null),iw=new x(null,"tag","tag",350170304,null),jw=new x(null,"unquote","unquote",-1004694737, -null),kw=new z("sci.impl.evaluator","not-found","sci.impl.evaluator/not-found",1684798426),lw=new z(null,"reader-error","reader-error",1610253121),mw=new x(null,"%\x26","%\x26",-728707069,null),nw=new x(null,"bit-not","bit-not",1508529851,null),ow=new x(null,"temp__34348__auto__","temp__34348__auto__",1803725675,null),pw=new x(null,"%1","%1",1309450150,null),qw=new x(null,"sym","sym",195671222,null),rw=new x(null,"names","names",-302543131,null),sw=new x(null,"int-array","int-array",459176616,null), -tw=new x(null,"app-db","app-db",-1788829467,null),uw=new z(null,"deprecated","deprecated",1498275348),vw=new z(null,"both","both",-393648840),ww=new x(null,"reset-thread-binding-frame-impl","reset-thread-binding-frame-impl",-826674194,null),xw=new x(null,"global-hierarchy","global-hierarchy",-2014004345,null),yw=new x(null,"size__33926__auto__","size__33926__auto__",-402711466,null),zw=new x(null,"aget","aget",1491056546,null),Aw=new x("sci.impl.protocols","default","sci.impl.protocols/default",-1134880191, -null),Bw=new z(null,"symbol","symbol",-1038572696),Cw=new z(null,"on-changes","on-changes",1345912602),Dw=new x(null,"not-every?","not-every?",-729672558,null),Ew=new x(null,"comment","comment",-2122229700,null),Fw=new z(null,"validators","validators",-1973346672),Gw=new x("reagent.dom.client","create-root","reagent.dom.client/create-root",477373782,null),Hw=new x("js","String","js/String",-2070054036,null),Iw=new x("cljs.core","lazy-seq","cljs.core/lazy-seq",627681297,null),Jw=new x(null,"branch?", -"branch?",641208520,null),Kw=new z(null,"colnum","colnum",2023796854),Lw=new x(null,"doseq","doseq",221164135,null),Mw=new z(null,"fsm-state","fsm-state",1656310533),Nw=new x("clojure.core","list","clojure.core/list",-1119203325,null),Ow=new x(null,"some-\x3e","some-\x3e",-1011172200,null),Pw=new x("js","Error","js/Error",-1692659266,null),Qw=new x("cljs.core","with-bindings*","cljs.core/with-bindings*",-768558084,null),Co=new x(null,"throw","throw",595905694,null),Rw=new x(null,"seqable?","seqable?", -72462495,null),Sw=new z(null,"length","length",588987862),Tw=new x(null,"with-let","with-let",-1310113408,null),Uw=new x(null,"indexed?","indexed?",1234610384,null),Vw=new z(null,"when","when",-576417306),Ww=new z(null,"char-format","char-format",-1016499218),Xw=new z(null,"sub-lifecycle","sub-lifecycle",-1044743020),Yw=new z("sci.impl.protocols","IPrintWithWriter","sci.impl.protocols/IPrintWithWriter",1832791161),Zw=new x(null,"compare-and-set!","compare-and-set!",-1997299382,null),$w=new z(null, -"extend-via-metadata","extend-via-metadata",-427346794),ax=new x(null,"union","union",-511498270,null),bx=new x(null,"zero?","zero?",325758897,null),cx=new x(null,"partition-all","partition-all",-1985005385,null),dx=new x("re-frame.core","trim-v","re-frame.core/trim-v",-1158424979,null),ex=new x(null,"run!","run!",-2055483725,null),fx=new x("re-frame.core","set-loggers!","re-frame.core/set-loggers!",886929143,null),gx=new x("cljs.core","-add-loaded-lib","cljs.core/-add-loaded-lib",-38500354,null), -hx=new x(null,"with-let-values","with-let-values",1929572375,null),ix=new x(null,"not-found","not-found",1011451547,null),jx=new z(null,"fx","fx",-1237829572),kx=new x(null,"specs","specs",-1227865028,null),lx=new x(null,"retf","retf",73249638,null),mx=new x(null,"rand-int","rand-int",-495012157,null),nx=new z(null,"trim-v","trim-v",-1274938640),ox=new x(null,"others","others",-569561186,null),px=new x(null,"rest","rest",398835108,null),qx=new x(null,"user","user",-1122004413,null),rx=new x(null, -"l__34553__auto__","l__34553__auto__",2024702373,null),sx=new x(null,"set","set",1945134081,null),Fx=new z(null,"prefix","prefix",-265908465),Gx=new z(null,"deregister-event-handler","deregister-event-handler",-1096518994),Hx=new z(null,"namespace","namespace",-377510372),Ix=new x(null,"take-nth","take-nth",1378204353,null),Jx=new x(null,"drop-while","drop-while",719206685,null),Kx=new x(null,"sep","sep",-684005239,null),Lx=new x("re-frame.core","debug","re-frame.core/debug",1759164285,null),vo=new x(null, -"fn*","fn*",-752876845,null),Mx=new x(null,"seq","seq",-177272256,null),Nx=new x("re-frame.db","app-db","re-frame.db/app-db",1918166498,null),Ox=new x(null,"fn?","fn?",1820990818,null),Px=new z(null,"hr","hr",1377740067),Qx=new z(null,"dispatch","dispatch",1319337009),Rx=new z(null,"rest","rest",-1241696419),Sx=new z(null,"pause","pause",-2095325672),Tx=new x("clojure.core","cond","clojure.core/cond",1906951420,null),Ux=new x(null,"create-class","create-class",-665911586,null),Vx=new x(null,"reg-event-db", -"reg-event-db",1898199338,null),Wx=new z(null,"margin-top","margin-top",392161226),Xx=new x(null,"remove-method","remove-method",72923733,null),Yx=new z(null,"gensyms","gensyms",248713782),Zx=new z(null,"require-macros","require-macros",707947416),$x=new z(null,"uneval","uneval",1932037707),ay=new z(null,"colon-up-arrow","colon-up-arrow",244853007),by=new x(null,"get-method","get-method",185754457,null),cy=new x(null,"update-in","update-in",-1445516941,null),dy=new z(null,"message","message",-406056002), -ey=new x("cljs.core","LazySeq","cljs.core/LazySeq",1986389673,null),fy=new x(null,"kind","kind",923265724,null),gy=new z("edamame","read-cond-splicing","edamame/read-cond-splicing",-1992728777),hy=new z(null,"getDerivedStateFromProps","getDerivedStateFromProps",-991834739),iy=new x("re-frame.alpha","reg-event-error-handler","re-frame.alpha/reg-event-error-handler",-1117973154,null),jy=new z(null,"parse-tag","parse-tag",1427313738),ky=new x("cljs.core","count","cljs.core/count",-921270233,null),ly= -new x("re-frame.alpha","enqueue","re-frame.alpha/enqueue",306450166,null),my=new x("sci.configs.reagent.reagent","-ratom-generation","sci.configs.reagent.reagent/-ratom-generation",662254794,null),ny=new z(null,"ex","ex",-1413771341),oy=new x(null,"keep","keep",-492807003,null),py=new x(null,"clear-cofx","clear-cofx",1267145204,null),qy=new x("cljs.core","fn","cljs.core/fn",-1065745098,null),ry=new x("re-frame.alpha","console","re-frame.alpha/console",-360039995,null),sy=new x(null,"destroy","destroy", -796871122,null),ty=new x("re-frame.core","after","re-frame.core/after",705151839,null),uy=new z(null,"shouldComponentUpdate","shouldComponentUpdate",1795750960),vy=new z(null,"requires","requires",-1201390927),wy=new z(null,"fn","fn",-1175266204),xy=new x(null,"*loaded-libs*","*loaded-libs*",1951428860,null),yy=new z(null,"childContextTypes","childContextTypes",578717991),zy=new x(null,"default__30091__auto__","default__30091__auto__",1642882479,null),Ay=new x(null,"create-ns","create-ns",-782886354, -null),By=new x("cljs.tools.reader.edn","escape-char","cljs.tools.reader.edn/escape-char",17562632,null),Cy=new x(null,"sort-by","sort-by",1317932224,null),Dy=new x("re-frame.alpha","reg-flow","re-frame.alpha/reg-flow",1343157800,null),Ey=new z("api-docs","heading","api-docs/heading",2007966345),Fy=new x("reagent.core","track!","reagent.core/track!",-954652078,null),Gy=new x(null,"reg-event-fx","reg-event-fx",350713021,null),Hy=new z(null,"end-row-key","end-row-key",-1126662680),Iy=new x("reagent.core", -"atom","reagent.core/atom",1748890217,null),Jy=new x(null,"defprotocol","defprotocol",1388695348,null),Ky=new x(null,"frequencies","frequencies",1757430425,null),Ly=new z(null,"dead","dead",-1946604091),My=new x("cljs.core","defonce","cljs.core/defonce",-1291833100,null),Ny=new x(null,"class2","class2",-1266396392,null),Oy=new z(null,"db","db",993250759),Py=new x(null,"into-array","into-array",-1875808354,null),Qy=new x(null,"class1","class1",-1905977651,null),Ry=new z(null,"unwrap","unwrap",-1399175462), -Sy=new x("re-frame.alpha","reg-global-interceptor","re-frame.alpha/reg-global-interceptor",973995842,null),Ty=new x(null,"thread-bound?","thread-bound?",2075334115,null),Uy=new x(null,"method__29928__auto__","method__29928__auto__",-1299624717,null),Vy=new x(null,"transduce","transduce",-2083619734,null),Wy=new x(null,"ancestors","ancestors",864486103,null),Xy=new x("cljs.core","chunk-cons","cljs.core/chunk-cons",-250075688,null),Yy=new z(null,"volatile-mutable","volatile-mutable",1731728411),Zy= -new x(null,"ensure-reduced","ensure-reduced",-1606421005,null),$y=new x(null,"re-find","re-find",1143444147,null),az=new x("reagent.core","cursor","reagent.core/cursor",-1137097804,null),bz=new z(null,"max-fixed","max-fixed",166770124),cz=new z(null,"original-event","original-event",2121330403),dz=new x("js","Error.","js/Error.",750655924,null),ez=new x(null,"oldval","oldval",-221475803,null),fz=new x("re-frame.core","dispatch-sync","re-frame.core/dispatch-sync",-1113172660,null),gz=new x(null,"rand", -"rand",-1745930995,null),hz=new x(null,"c__33734__auto__","c__33734__auto__",68467937,null),iz=new x(null,"auto-run","auto-run",-696035332,null),uo=new x(null,"js*","js*",-1134233646,null),jz=new x("reagent.core","as-element","reagent.core/as-element",-1369748434,null),kz=new z(null,"suffix","suffix",367373057),lz=new x("cljs.core","println","cljs.core/println",-331834442,null),mz=new x(null,"-ratom-generation","-ratom-generation",-176468250,null),nz=new x(null,"smap","smap",-2041991975,null),oz= -new z("sci.impl","record","sci.impl/record",-1939193950),pz=new x(null,"gensym","gensym",-1693147401,null),qz=new z(null,"at","at",1476951349),rz=new z(null,"as","as",1148689641),sz=new x(null,"*print-length*","*print-length*",-687693654,null),tz=new z(null,"nl-t","nl-t",-1608382114),uz=new x(null,"js-\x3eclj","js-\x3eclj",1544462432,null),vz=new x("cljs.core","and","cljs.core/and",-6692549,null),wz=new x("cljs.core","reify*","cljs.core/reify*",1256833160,null),xz=new z(null,"read-cond","read-cond", -1056899244),yz=new z(null,"on-mouse-leave","on-mouse-leave",-1864319528),zz=new z(null,"evaluable?","evaluable?",1236572321),Az=new x("js","Function","js/Function",-749892063,null),Bz=new x(null,"unchecked-char","unchecked-char",1662742943,null),Cz=new x(null,"unchecked-int","unchecked-int",1672898125,null),Dz=new x("cljs.core","int","cljs.core/int",20935062,null),Ez=new x(null,"unchecked-multiply-int","unchecked-multiply-int",-788546068,null),Fz=new z(null,"column","column",2078222095),Gz=new x("reagent.core", -"create-class","reagent.core/create-class",-1100017147,null),Hz=new z(null,"ok","ok",967785236),Iz=new z(null,"after","after",594996914),Jz=new z(null,"or","or",235744169),Kz=new x(null,"unchecked-inc","unchecked-inc",-1170131490,null),Lz=new x(null,"number-literal?","number-literal?",843787662,null),Mz=new x(null,"prn-str","prn-str",-145225943,null),Nz=new x(null,"rename-keys","rename-keys",355340888,null),Oz=new x(null,"xform","xform",-85179481,null),Pz=new x("re-frame.alpha","reg-sub-raw","re-frame.alpha/reg-sub-raw", -1855704039,null),Qz=new x(null,"init-val-or-seq","init-val-or-seq",-1168783320,null),Rz=new z(null,"ctx-handler","ctx-handler",-1777672230),Sz=new z(null,"directive","directive",793559132),Tz=new x(null,"max-key","max-key",-2132814732,null),Uz=new x(null,"get-thread-binding-frame-impl","get-thread-binding-frame-impl",-701667726,null),Vz=new z(null,"obj","obj",981763962),Wz=new z("re-frame","query-v","re-frame/query-v",972533792),Xz=new x(null,"form","form",16469056,null),Yz=new z(null,"buffer-level", -"buffer-level",928864731),Zz=new x("re-frame.alpha","get-coeffect","re-frame.alpha/get-coeffect",-60529129,null),$z=new z(null,"background-color","background-color",570434026),aA=new x(null,"object","object",-1179821820,null),bA=new x(null,"conj!","conj!",-841007895,null),cA=new x(null,"meth__30095__auto__","meth__30095__auto__",883573818,null),dA=new z(null,"bodies","bodies",-1295887172),eA=new x(null,"alias","alias",-399220103,null),fA=new x(null,"parents","parents",-387007364,null),gA=new x(null, -"value","value",1946509744,null),hA=new x(null,"keyword?","keyword?",1917797069,null),iA=new z(null,"form","form",-1624062471),jA=new z(null,"group","group",582596132),kA=new x(null,"inject-cofx","inject-cofx",-1494968627,null),lA=new x("cljs.core","or","cljs.core/or",1201033885,null),mA=new x("re-frame.alpha","on-changes","re-frame.alpha/on-changes",-229591442,null),nA=new x(null,"disj!","disj!",-1383872088,null),oA=new z(null,"ms","ms",-1152709733),pA=new z("sci.error","realized-beyond-max","sci.error/realized-beyond-max", --1094268187),qA=new x(null,"cached-hierarchy__29824__auto__","cached-hierarchy__29824__auto__",179211805,null),rA=new x(null,"*print-meta*","*print-meta*",-919406644,null),sA=new x(null,"counted?","counted?",1703071664,null),tA=new z(null,"mandatory","mandatory",542802336),uA=new x("reagent.ratom","make-track","reagent.ratom/make-track",267038680,null),vA=new x("cljs.core","protocol-type-impl","cljs.core/protocol-type-impl",155177701,null),wA=new x(null,"cljs.core.PersistentQueue.EMPTY","cljs.core.PersistentQueue.EMPTY", -399917828,null),xA=new x(null,"outer","outer",1265345571,null),yA=new z("sci.impl.evaluator","try-result","sci.impl.evaluator/try-result",-1394897780),zA=new x(null,"debug","debug",32358931,null),AA=new z(null,"pretty-writer","pretty-writer",-1222834267),BA=new x(null,"descendants","descendants",-829549738,null),CA=new x("re-frame.core","clear-global-interceptor","re-frame.core/clear-global-interceptor",166960890,null),DA=new x("cljs.core","defmethod","cljs.core/defmethod",-180785162,null),EA=new x(null, -"long-array","long-array",217579190,null),W=new z(null,"ns","ns",441598760),FA=new x(null,"track","track",1836319014,null),GA=new x(null,"associative?","associative?",-141666771,null),HA=new z(null,"done-nl","done-nl",-381024340),IA=new x(null,"amap","amap",635923055,null),JA=new x(null,"concat","concat",-467652465,null),KA=new z("sci.impl","callstack","sci.impl/callstack",-1621010557),LA=new x(null,"meth__30170__auto__","meth__30170__auto__",-1626073499,null),MA=new x("re-frame.alpha","reg","re-frame.alpha/reg", -44066626,null),NA=new x(null,"as-\x3e","as-\x3e",1430690540,null),OA=new x(null,".hasOwnProperty",".hasOwnProperty",-1264659034,null),PA=new z(null,"source","source",-433931539),QA=new z("sci.impl.records","object","sci.impl.records/object",-590699738),RA=new z(null,"ns-state","ns-state",-532270771),SA=new x(null,"for","for",316745208,null),TA=new x(null,"oldform","oldform",1995222417,null),UA=new x(null,"condp","condp",1054325175,null),VA=new x(null,"else","else",132154381,null),WA=new z(null,"keyword", -"keyword",811389747),XA=new x(null,"args__29914__auto__","args__29914__auto__",1674734481,null),YA=new x(null,"reduced?","reduced?",1361797384,null),ZA=new x("re-frame.alpha","inject-cofx","re-frame.alpha/inject-cofx",1720429518,null),$A=new x(null,"var-get","var-get",-767472097,null),aB=new x(null,"trimr","trimr",-1739157155,null),bB=new x(null,"triml","triml",-286546306,null),cB=new x(null,"join","join",881669637,null),dB=new x(null,"obj","obj",-1672671807,null),eB=new x(null,"*file*","*file*", +"psym",752521989,null),Pp=new x(null,"-\x3e","-\x3e",-2139605430,null),Qp=new x(null,"Inf","Inf",647172781,null),Rp=new z(null,"new","new",-2085437848),Sp=new z(null,"class","class",-2030961996),Tp=new z(null,"all","all",892129742),Up=new x(null,"nil?","nil?",1612038930,null),Vp=new x(null,"uri?","uri?",2029475116,null),Wp=new x("sci.configs.reagent.reagent","error","sci.configs.reagent.reagent/error",1433174531,null),Xp=new x(null,"cat","cat",182721320,null),Yp=new x(null,"..","..",-300507420,null), +Zp=new x(null,"children","children",699969545,null),$p=new x(null,"read-char*","read-char*",1494526523,null),aq=new z(null,"default","default",-1987822328),bq=new x(null,"object-array","object-array",206434647,null),cq=new z(null,"reagentRender","reagentRender",-358306383),dq=new x(null,"nnext","nnext",-2065435598,null),eq=new x("cljs.core","chunk-first","cljs.core/chunk-first",-1157877305,null),fq=new z(null,"ex-kind","ex-kind",1581199296),gq=new x(null,"sorted-map-by","sorted-map-by",218894812, +null),hq=new z("edamame","opened-delimiter","edamame/opened-delimiter",-1906008305),iq=new x("re-frame.alpha","make-restore-fn","re-frame.alpha/make-restore-fn",623194816,null),gm=new z("cljs.core","none","cljs.core/none",926646439),jq=new x("cljs.reader","read-date","cljs.reader/read-date",1663417238,null),kq=new x("reagent.core","reactify-component","reagent.core/reactify-component",-385504376,null),lq=new x(null,"params*","params*",336153603,null),mq=new x("re-frame.alpha","reg-event-db","re-frame.alpha/reg-event-db", +-1319957931,null),nq=new x(null,"sci.impl.records","sci.impl.records",-393424368,null),oq=new x(null,"unreduced","unreduced",780976083,null),pq=new x(null,"add-watch","add-watch",1389887634,null),qq=new x(null,"-new-dynamic-var","-new-dynamic-var",-1029088918,null),rq=new x(null,"pop-thread-bindings","pop-thread-bindings",-1312224790,null),sq=new x(null,"end-key","end-key",-1592097336,null),tq=new x("cljs.analyzer.api","resolve","cljs.analyzer.api/resolve",498213843,null),uq=new z(null,"do-fx","do-fx", +1194163050),vq=new x(null,"unchecked-byte","unchecked-byte",1091664664,null),wq=new x(null,"opts","opts",1795607228,null),xq=new x(null,"destroy__36987__auto__","destroy__36987__auto__",1943374839,null),yq=new x(null,"remove-all-methods","remove-all-methods",-728267092,null),zq=new x("re-frame.core","add-post-event-callback","re-frame.core/add-post-event-callback",-441107040,null),Aq=new x(null,"initch","initch",946908919,null),Bq=new x("clojure.repl","source-fn","clojure.repl/source-fn",1877923323, +null),Cq=new x("reagent.ratom","track!","reagent.ratom/track!",1183599982,null),Dq=new z(null,"render","render",-1408033454),Eq=new x(null,"uuid?","uuid?",400077689,null),Fq=new z(null,"reload","reload",863702807),Gq=new x("cljs.core","atom","cljs.core/atom",1943839529,null),Hq=new x(null,"quoted-ns","quoted-ns",-2054280928,null),Iq=new x("re-frame.core","reg-event-error-handler","re-frame.core/reg-event-error-handler",351507335,null),Jq=new x(null,"first","first",996428481,null),Kq=new x(null,"cursor", +"cursor",-1642498285,null),Lq=new x("cljs.tools.reader.impl.commons","parse-symbol","cljs.tools.reader.impl.commons/parse-symbol",-903976395,null),Mq=new z(null,"pointer-events","pointer-events",-1053858853),Nq=new z(null,"end-pos","end-pos",-1643883926),Oq=new z(null,"opts","opts",155075701),Pq=new x(null,"handler-fn","handler-fn",841143797,null),Qq=new x("re-frame.core","reg-fx","re-frame.core/reg-fx",1560429967,null),Rq=new x(null,"event","event",1941966969,null),Sq=new x(null,"fnil","fnil",-187395162, +null),Tq=new x(null,"reduced","reduced",-1189224808,null),Uq=new x(null,"on-set","on-set",1499578057,null),Vq=new z(null,"location?","location?",425878086),Wq=new z("sci.impl","eval-string+","sci.impl/eval-string+",-178784582),Xq=new x(null,"re-frame.core","re-frame.core",-1549073474,null),Yq=new x(null,"pop!","pop!",-1253383511,null),Zq=new x(null,"make-reaction","make-reaction",1935680112,null),$q=new x(null,"unchecked-negate-int","unchecked-negate-int",-825297602,null),ar=new x(null,"bindings", +"bindings",-1383038577,null),br=new z(null,"per-line-prefix","per-line-prefix",846941813),cr=new x(null,"unchecked-add-int","unchecked-add-int",-1821763285,null),dr=new z(null,".ͼb",".ͼb",909055546),er=new z(null,".ͼc",".ͼc",-99948571),fr=new z(null,"forever","forever",2103455015),gr=new z("edamame.impl.parser","suppress","edamame.impl.parser/suppress",1718484755),hr=new z(null,".ͼg",".ͼg",419059200),ir=new z(null,"on-change","on-change",-732046149),jr=new z(null,"fn-expr","fn-expr",-933027985),kr= +new z(null,"editable?","editable?",-1805477333),lr=new z(null,".ͼm",".ͼm",-283676620),mr=new x("clojure.core","multi-fn-add-method-impl","clojure.core/multi-fn-add-method-impl",-1293834231,null),nr=new x("cljs.core","nil?","cljs.core/nil?",945071861,null),or=new z(null,"event-handler","event-handler",-487718843),pr=new x("clojure.core","-new-dynamic-var","clojure.core/-new-dynamic-var",-1873937019,null),qr=new z("re-frame","lifecycle","re-frame/lifecycle",-2078095936),rr=new z(null,"eof","eof",-489063237), +sr=new x(null,"defrecord","defrecord",273038109,null),tr=new x(null,"even?","even?",-1827825394,null),ur=new x(null,"neg?","neg?",-1902175577,null),vr=new x(null,"float","float",-91857841,null),wr=new x(null,"chunk","chunk",449371907,null),xr=new z(null,"queue","queue",1455835879),yr=new x("cljs.core","fnil","cljs.core/fnil",479587341,null),zr=new x(null,"if-let","if-let",1803593690,null),Ar=new x(null,"object?","object?",327472310,null),Br=new z(null,"on-eval","on-eval",-1349336659),Cr=new z(null, +"end","end",-268185958),Dr=new z(null,"reactive","reactive",717758366),Er=new x("reagent.ratom","make-reaction","reagent.ratom/make-reaction",272608527,null),Fr=new x(null,"parent","parent",761652748,null),Gr=new x(null,"default__29926__auto__","default__29926__auto__",774498676,null),Hr=new x("clojure.core","-new-var","clojure.core/-new-var",363339052,null),Ir=new x(null,"not-native","not-native",-236392494,null),Jr=new z(null,"env","env",-1815813235),Kr=new x(null,"error","error",661562495,null), +Lr=new x(null,"*print-fn*","*print-fn*",138509853,null),Mr=new x("js","Number","js/Number",-508133572,null),Nr=new x(null,"dispose!","dispose!",-395693497,null),Or=new z(null,"deftype-fields","deftype-fields",-222569172),Pr=new x("reagent.ratom","-destroy","reagent.ratom/-destroy",-1284026419,null),Qr=new z(null,"post","post",269697687),Rr=new x(null,"pos?","pos?",-244377722,null),Sr=new x(null,"tcoll","tcoll",-1341294481,null),Tr=new z(null,"col-key","col-key",-2009675766),Ur=new z("sci.impl","type-name", +"sci.impl/type-name",-1528979388),Vr=new x(null,"array","array",-440182315,null),Wr=new z(null,"no-recur-reason","no-recur-reason",-1993064353),Xr=new x(null,"ns-interns","ns-interns",535532824,null),oo=new x(null,"letfn*","letfn*",-110097810,null),zn=new z(null,"parents","parents",-2027538891),Yr=new x(null,"unchecked-dec-int","unchecked-dec-int",1339067442,null),Zr=new z(null,"fx-handler","fx-handler",-549783097),$r=new x(null,"bit-shift-left","bit-shift-left",-1814765981,null),as=new x(null,"clear-sub", +"clear-sub",-1368681160,null),bs=new z(null,"ref","ref",1289896967),cs=new x(null,"take-last","take-last",-41013151,null),ds=new z(null,"remaining-arg-count","remaining-arg-count",-1216589335),es=new z(null,"logical-blocks","logical-blocks",-1466339776),fs=new x(null,"-\x3etype-impl","-\x3etype-impl",483401048,null),gs=new z(null,"clear-flow","clear-flow",2086400997),hs=new x(null,"short","short",-725675253,null),is=new x(null,"atom","atom",1243487874,null),js=new z(null,"result?","result?",1877293881), +ks=new x(null,"symbol?","symbol?",1820680511,null),ls=new x(null,"defmacro","defmacro",2054157304,null),ms=new x(null,"tagged-literal","tagged-literal",-896422703,null),ns=new x(null,"NaN","NaN",666918153,null),os=new z(null,"end-col","end-col",-724155879),ps=new z(null,"inputs","inputs",865803858),qs=new z(null,"on-blur","on-blur",814300747),rs=new x("re-frame.core","clear-event","re-frame.core/clear-event",1624271650,null),ss=new x(null,"dynv","dynv",-405952138,null),ts=new x(null,"methods__29915__auto__", +"methods__29915__auto__",1246007595,null),us=new z(null,"atom","atom",-397043653),vs=new x(null,"extends?","extends?",-2012201234,null),ws=new z("re-frame.std-interceptors","not-found","re-frame.std-interceptors/not-found",-1614827865),xs=new x(null,"bit-set","bit-set",-910710655,null),ys=new z(null,"contextType","contextType",1033066077),zs=new z("clojure.core","eval-file","clojure.core/eval-file",801420726),As=new x("reagent.core","dispose!","reagent.core/dispose!",239740642,null),Bs=new x(null, +"protocol-type-impl","protocol-type-impl",561934718,null),Cs=new z(null,"phase","phase",575722892),Ym=new z(null,"ready","ready",1086465795),Ds=new x(null,"kmap","kmap",-2108296910,null),Es=new z("sci.impl","f-meta","sci.impl/f-meta",-1735495322),Fs=new x("reagent.core","create-compiler","reagent.core/create-compiler",491047088,null),Gs=new x(null,"doc-string?","doc-string?",393166599,null),Hs=new x(null,"end-test","end-test",2122505254,null),Is=new x(null,"IRecord","IRecord",-903221169,null),T=new z(null, +"arglists","arglists",1661989754),Js=new x(null,"when-first","when-first",821699168,null),Ks=new x(null,"writer","writer",1362963291,null),Ls=new x("cljs.core","declare","cljs.core/declare",1312638100,null),Ms=new z(null,"end-column","end-column",1425389514),Ns=new x(null,"xset","xset",-371743149,null),Os=new z(null,"error-promise","error-promise",-1028111683),Ps=new x(null,"odd?","odd?",-1458588199,null),Qs=new x("cljs.core","alter-var-root","cljs.core/alter-var-root",-1342668238,null),Rs=new x(null, +"split-with","split-with",1853047034,null),Ss=new x("cljs.core","when","cljs.core/when",120293186,null),Ts=new x(null,"prefer-method","prefer-method",-876100205,null),Us=new z(null,"unquote-splicing","unquote-splicing",1295267556),Vs=new z("sci.impl.analyzer","instance-expr","sci.impl.analyzer/instance-expr",629338719),Ws=new x(null,"var-args","var-args",1341745925,null),Xs=new z(null,"copy-enclosed-\x3einvocation","copy-enclosed-\x3einvocation",-1322388729),Ys=new x(null,"sub","sub",-453228498,null), +Zs=new x("clojure.core","sequence","clojure.core/sequence",1998774218,null),$s=new z(null,"expr","expr",745722291),at=new x(null,"bit-or","bit-or",-1144943723,null),bt=new x(null,"sci.impl.protocols","sci.impl.protocols",-697012432,null),ct=new x("js","Boolean","js/Boolean",1661145260,null),dt=new z(null,"start-block-t","start-block-t",-373430594),et=new x(null,"find","find",2136810983,null),ft=new x(null,"key","key",124488940,null),gt=new z(null,"loaded-libs","loaded-libs",-1156389652),ht=new z("sci.impl.protocols", +"reified","sci.impl.protocols/reified",-2019939396),it=new x(null,"count","count",-514511684,null),jt=new x(null,"binding","binding",-2114503176,null),kt=new x("re-frame.core","console","re-frame.core/console",1914748698,null),lt=new x(null,"interceptor","interceptor",-1526696693,null),mt=new x("sci.impl.deftype","-create-type","sci.impl.deftype/-create-type",-1020101113,null),nt=new x(null,"IDeref","IDeref",1738423197,null),ot=new x(null,"purge-event-queue","purge-event-queue",-1780102203,null), +Gt=new z("re-frame.flow.alpha","ref","re-frame.flow.alpha/ref",854314016),Ht=new z(null,"componentWillUnmount","componentWillUnmount",1573788814),It=new x("re-frame.core","get-coeffect","re-frame.core/get-coeffect",1741350824,null),Jt=new x(null,"when-some","when-some",1700415903,null),Lt=new x(null,"remove-ns","remove-ns",-1915058781,null),Mt=new x(null,"-swap!","-swap!",-535359318,null),Nt=new z(null,"className","className",-1983287057),Ot=new z(null,"resolve-symbol","resolve-symbol",-319166964), +Pt=new x("cljs.core","push-thread-bindings","cljs.core/push-thread-bindings",-703482450,null),Qt=new x(null,"number?","number?",-1747282210,null),Rt=new x("re-frame.alpha","enrich","re-frame.alpha/enrich",618935041,null),St=new z("sci.impl.parser.edamame","eof","sci.impl.parser.edamame/eof",-917261517),Tt=new z(null,"exclude","exclude",-1230250334),Ut=new x(null,"query-id","query-id",-1180306927,null),Vt=new x(null,"unchecked-subtract","unchecked-subtract",-2137458667,null),Wt=new x("cljs.core","when-first", +"cljs.core/when-first",-667185267,null),Xt=new x(null,"sort","sort",-1700969851,null),Yt=new z("sci.impl.record","map-constructor","sci.impl.record/map-constructor",1072184780),Zt=new x("cljs.core","in-ns","cljs.core/in-ns",1807208747,null),$t=new x(null,"-tracking?","-tracking?",-1106885352,null),au=new z(null,"direction","direction",-633359395),bu=new x(null,"juxt","juxt",671085604,null),cu=new z(null,"bracket-info","bracket-info",-1600092774),du=new x("cljs.core","when-let","cljs.core/when-let", +-2049838349,null),eu=new z(null,"body","body",-2049205669),fu=new z(null,"special","special",-1125941630),gu=new x(null,"get-effect","get-effect",116827434,null),hu=new x(null,"alength","alength",-1268305401,null),iu=new z(null,"mode","mode",654403691),ju=new z(null,"outer-idens","outer-idens",1197381241),ku=new x(null,"with-redefs","with-redefs",-1143728263,null),lu=new x(null,"nfirst","nfirst",-554736533,null),mu=new x(null,"volatile!","volatile!",919368405,null),nu=new z(null,"closure-bindings", +"closure-bindings",112932037),ou=new z(null,"border","border",1444987323),Dm=new z(null,"fallback-impl","fallback-impl",-1501286995),U=new z(null,"name","name",1843675177),pu=new x(null,"farg__30105__auto__","farg__30105__auto__",1820593428,null),qu=new z(null,"syms","syms",-1575891762),ru=new x("re-frame.alpha","get-flow","re-frame.alpha/get-flow",1069428713,null),su=new x(null,"reset-meta!","reset-meta!",1699493291,null),tu=new x(null,"do-template","do-template",-1578627476,null),uu=new x(null, +"map?","map?",-1780568534,null),vu=new x(null,"into","into",1489695498,null),wu=new x(null,"sorted-set","sorted-set",992325424,null),xu=new x(null,"ints","ints",-1761239845,null),yu=new x(null,"contains?","contains?",-1676812576,null),zu=new z(null,"component-did-update","component-did-update",-1468549173),Au=new x("re-frame.core","enqueue","re-frame.core/enqueue",-170225827,null),Bu=new x(null,"flow\x3c-","flow\x3c-",-1214873134,null),Cu=new x(null,"-deref","-deref",-283116853,null),Du=new z(null, +"illegal-argument","illegal-argument",-1845493170),Eu=new z(null,"class-\x3eopts","class-\x3eopts",2061906477),Fu=new x(null,"index-of","index-of",1275975485,null),Gu=new z("edamame","opened-delimiter-loc","edamame/opened-delimiter-loc",443885208),Hu=new x(null,"all-ns","all-ns",1571857784,null),Iu=new x(null,"with-bindings","with-bindings",-1197589787,null),Ju=new z(null,"writing","writing",-1486865108),Ku=new x(null,"src","src",-10544524,null),Lu=new z(null,"parameter-from-args","parameter-from-args", +-758446196),Mu=new x(null,"js-keys","js-keys",-1388365203,null),tn=new z(null,"keywordize-keys","keywordize-keys",1310784252),Nu=new z(null,"logical-block-callback","logical-block-callback",1612691194),Ou=new x(null,"inst","inst",-2008473268,null),Pu=new z(null,"selector","selector",762528866),Qu=new x(null,"struct","struct",325972931,null),Ru=new z(null,"auto-resolve","auto-resolve",1851201983),Su=new x(null,"int?","int?",1799729645,null),Tu=new x("cljs.core","next","cljs.core/next",-1291438473, +null),Uu=new x(null,"cmap","cmap",1947829886,null),Vu=new z(null,"buffer","buffer",617295198),Wu=new x(null,"empty?","empty?",76408555,null),Xu=new x(null,"lazy-cat","lazy-cat",-89906116,null),Yu=new x(null,"replacement","replacement",-195707312,null),Zu=new x(null,"clear-subscription-cache!","clear-subscription-cache!",1196020095,null),$u=new x(null,"*print-readably*","*print-readably*",-761361221,null),av=new x(null,"dissoc","dissoc",1039760994,null),bv=new x("cljs.core","refer","cljs.core/refer", +269577817,null),cv=new x(null,"replace-first","replace-first",-943534331,null),dv=new z(null,"displayName","displayName",-809144601),ev=new z(null,"const","const",1709929842),fv=new x(null,"meta","meta",-1154898805,null),gv=new z(null,"indent","indent",-148200125),hv=new x(null,"reader","reader",1810192380,null),An=new z(null,"descendants","descendants",1824886031),iv=new z("sci.impl.deftype","object","sci.impl.deftype/object",-248099673),jv=new x(null,"str","str",-1564826950,null),kv=new x(null, +"type-sym","type-sym",-1942856509,null),lv=new x(null,"IPrintWithWriter","IPrintWithWriter",-1205316154,null),mv=new z(null,"end-location","end-location",-1199449467),nv=new z("sci","error","sci/error",-979082803),ov=new z("sci.impl","constructor","sci.impl/constructor",1320345666),pv=new x(null,"*print-err-fn*","*print-err-fn*",1241679298,null),qv=new x(null,"print-str","print-str",-699700354,null),rv=new x(null,"fn-tail","fn-tail",-178337841,null),sv=new z("edamame","error","edamame/error",882529634), +Sm=new z(null,"val","val",128701612),tv=new z(null,"var","var",-769682797),uv=new z(null,"next","next",-117701485),vv=new x(null,"get","get",-971253014,null),wv=new x(null,"step","step",-1365547645,null),xv=new x(null,"dispatch-fn","dispatch-fn",-1401088155,null),yv=new x(null,"ex-cause","ex-cause",95392590,null),zv=new x("cljs.core","let","cljs.core/let",-308701135,null),Av=new x(null,"remove","remove",1509103113,null),Bv=new z(null,"variadic?","variadic?",584179762),Cv=new z(null,"live-inputs", +"live-inputs",1350889395),Dv=new x(null,"isa?","isa?",1358492324,null),mb=new z(null,"flush-on-newline","flush-on-newline",-151457939),Ev=new x("sci.configs.reagent.reagent","-generation","sci.configs.reagent.reagent/-generation",-1754580423,null),Fv=new z("re-frame","q","re-frame/q",-1128715212),Gv=new x(null,"default__29917__auto__","default__29917__auto__",-1914786745,null),Hv=new x(null,"iterate","iterate",694501410,null),Iv=new x(null,"backslash","backslash",-863649243,null),Jv=new x(null,"-add-loaded-lib", +"-add-loaded-lib",368206419,null),Kv=new x(null,"maps","maps",-71029607,null),Lv=new x(null,"mapv","mapv",-241595241,null),Mv=new x(null,"deref","deref",1494944732,null),Nv=new x(null,"loop","loop",1244978678,null),Ov=new x("cljs.core","assoc","cljs.core/assoc",322326297,null),Pv=new z(null,"event-v","event-v",1378681365),Qv=new z(null,"public-class","public-class",1127293019),Rv=new x(null,"reagent.core","reagent.core",1841519592,null),Sv=new x(null,"map-invert","map-invert",1258886340,null),Tv= +new z(null,"unquote","unquote",1649741032),Uv=new x(null,"docstring?","docstring?",-180217883,null),Vv=new x(null,"in-paths","in-paths",-1809668720,null),Wv=new x(null,"boolean","boolean",-278886877,null),Xv=new x(null,"bytes","bytes",-1478569089,null),Yv=new x(null,"vector","vector",-751469611,null),Zv=new x(null,"long","long",1469079434,null),$v=new x(null,"size-or-seq","size-or-seq",-2062823589,null),aw=new z(null,"satisfies","satisfies",-311664218),bw=new x(null,"butlast","butlast",1573039585, +null),cw=new z(null,"max-columns","max-columns",1742323262),dw=new z(null,"display-name","display-name",694513143),ew=new x(null,"delay?","delay?",-1528239209,null),fw=new x("clojure.repl","print-doc","clojure.repl/print-doc",-375546711,null),gw=new x(null,"tag","tag",350170304,null),hw=new x(null,"unquote","unquote",-1004694737,null),iw=new z("sci.impl.evaluator","not-found","sci.impl.evaluator/not-found",1684798426),jw=new z(null,"reader-error","reader-error",1610253121),kw=new x(null,"%\x26","%\x26", +-728707069,null),lw=new x(null,"bit-not","bit-not",1508529851,null),mw=new x(null,"%1","%1",1309450150,null),nw=new x(null,"ns__35551__auto__","ns__35551__auto__",1078133844,null),ow=new x(null,"sym","sym",195671222,null),pw=new x(null,"names","names",-302543131,null),qw=new x(null,"int-array","int-array",459176616,null),rw=new x(null,"app-db","app-db",-1788829467,null),sw=new z(null,"deprecated","deprecated",1498275348),tw=new z(null,"both","both",-393648840),uw=new x(null,"reset-thread-binding-frame-impl", +"reset-thread-binding-frame-impl",-826674194,null),vw=new x(null,"global-hierarchy","global-hierarchy",-2014004345,null),ww=new x(null,"aget","aget",1491056546,null),xw=new x("sci.impl.protocols","default","sci.impl.protocols/default",-1134880191,null),yw=new z(null,"symbol","symbol",-1038572696),zw=new z(null,"on-changes","on-changes",1345912602),Aw=new x(null,"not-every?","not-every?",-729672558,null),Bw=new x(null,"comment","comment",-2122229700,null),Cw=new z(null,"validators","validators",-1973346672), +Dw=new x("reagent.dom.client","create-root","reagent.dom.client/create-root",477373782,null),Ew=new x("js","String","js/String",-2070054036,null),Fw=new x("cljs.core","lazy-seq","cljs.core/lazy-seq",627681297,null),Gw=new x(null,"branch?","branch?",641208520,null),Hw=new z(null,"colnum","colnum",2023796854),Iw=new x(null,"doseq","doseq",221164135,null),Jw=new z(null,"fsm-state","fsm-state",1656310533),Kw=new x("clojure.core","list","clojure.core/list",-1119203325,null),Lw=new x(null,"some-\x3e","some-\x3e", +-1011172200,null),Mw=new x("js","Error","js/Error",-1692659266,null),Nw=new x("cljs.core","with-bindings*","cljs.core/with-bindings*",-768558084,null),Co=new x(null,"throw","throw",595905694,null),Ow=new x(null,"seqable?","seqable?",72462495,null),Pw=new z(null,"length","length",588987862),Qw=new x(null,"with-let","with-let",-1310113408,null),Rw=new x(null,"indexed?","indexed?",1234610384,null),Sw=new z(null,"when","when",-576417306),Tw=new z(null,"char-format","char-format",-1016499218),Uw=new z(null, +"sub-lifecycle","sub-lifecycle",-1044743020),Vw=new z("sci.impl.protocols","IPrintWithWriter","sci.impl.protocols/IPrintWithWriter",1832791161),Ww=new x(null,"compare-and-set!","compare-and-set!",-1997299382,null),Xw=new z(null,"extend-via-metadata","extend-via-metadata",-427346794),Yw=new x(null,"union","union",-511498270,null),Zw=new x(null,"default__30198__auto__","default__30198__auto__",-2110027677,null),$w=new x(null,"zero?","zero?",325758897,null),ax=new x(null,"partition-all","partition-all", +-1985005385,null),bx=new x("re-frame.core","trim-v","re-frame.core/trim-v",-1158424979,null),cx=new x(null,"run!","run!",-2055483725,null),dx=new x("re-frame.core","set-loggers!","re-frame.core/set-loggers!",886929143,null),ex=new x("cljs.core","-add-loaded-lib","cljs.core/-add-loaded-lib",-38500354,null),fx=new x(null,"with-let-values","with-let-values",1929572375,null),gx=new x(null,"s__34170__auto__","s__34170__auto__",-576810085,null),hx=new x(null,"not-found","not-found",1011451547,null),ix= +new z(null,"fx","fx",-1237829572),jx=new x(null,"specs","specs",-1227865028,null),kx=new x(null,"retf","retf",73249638,null),lx=new x(null,"rand-int","rand-int",-495012157,null),mx=new z(null,"trim-v","trim-v",-1274938640),nx=new x(null,"others","others",-569561186,null),ox=new x(null,"rest","rest",398835108,null),px=new x(null,"user","user",-1122004413,null),qx=new x(null,"set","set",1945134081,null),rx=new z(null,"prefix","prefix",-265908465),sx=new x(null,"temp__34565__auto__","temp__34565__auto__", +1214629792,null),Fx=new z(null,"deregister-event-handler","deregister-event-handler",-1096518994),Gx=new z(null,"namespace","namespace",-377510372),Hx=new x(null,"take-nth","take-nth",1378204353,null),Ix=new x(null,"drop-while","drop-while",719206685,null),Jx=new x(null,"sep","sep",-684005239,null),Kx=new x("re-frame.core","debug","re-frame.core/debug",1759164285,null),vo=new x(null,"fn*","fn*",-752876845,null),Lx=new x(null,"seq","seq",-177272256,null),Mx=new x("re-frame.db","app-db","re-frame.db/app-db", +1918166498,null),Nx=new x(null,"fn?","fn?",1820990818,null),Ox=new z(null,"hr","hr",1377740067),Px=new z(null,"dispatch","dispatch",1319337009),Qx=new z(null,"rest","rest",-1241696419),Rx=new z(null,"pause","pause",-2095325672),Sx=new x("clojure.core","cond","clojure.core/cond",1906951420,null),Tx=new x(null,"create-class","create-class",-665911586,null),Ux=new x(null,"reg-event-db","reg-event-db",1898199338,null),Vx=new z(null,"margin-top","margin-top",392161226),Wx=new x(null,"remove-method","remove-method", +72923733,null),Xx=new z(null,"gensyms","gensyms",248713782),Yx=new z(null,"require-macros","require-macros",707947416),Zx=new z(null,"uneval","uneval",1932037707),$x=new z(null,"colon-up-arrow","colon-up-arrow",244853007),ay=new x(null,"farg__30087__auto__","farg__30087__auto__",709045804,null),by=new x(null,"get-method","get-method",185754457,null),cy=new x(null,"update-in","update-in",-1445516941,null),dy=new z(null,"message","message",-406056002),ey=new x("cljs.core","LazySeq","cljs.core/LazySeq", +1986389673,null),fy=new x(null,"kind","kind",923265724,null),gy=new z("edamame","read-cond-splicing","edamame/read-cond-splicing",-1992728777),hy=new x(null,"n__34340__auto__","n__34340__auto__",737588941,null),iy=new z(null,"getDerivedStateFromProps","getDerivedStateFromProps",-991834739),jy=new x("re-frame.alpha","reg-event-error-handler","re-frame.alpha/reg-event-error-handler",-1117973154,null),ky=new z(null,"parse-tag","parse-tag",1427313738),ly=new x("cljs.core","count","cljs.core/count",-921270233, +null),my=new x("re-frame.alpha","enqueue","re-frame.alpha/enqueue",306450166,null),ny=new x("sci.configs.reagent.reagent","-ratom-generation","sci.configs.reagent.reagent/-ratom-generation",662254794,null),oy=new z(null,"ex","ex",-1413771341),py=new x(null,"keep","keep",-492807003,null),qy=new x(null,"clear-cofx","clear-cofx",1267145204,null),ry=new x("cljs.core","fn","cljs.core/fn",-1065745098,null),sy=new x("re-frame.alpha","console","re-frame.alpha/console",-360039995,null),ty=new x(null,"destroy", +"destroy",796871122,null),uy=new x("re-frame.core","after","re-frame.core/after",705151839,null),vy=new z(null,"shouldComponentUpdate","shouldComponentUpdate",1795750960),wy=new z(null,"requires","requires",-1201390927),xy=new z(null,"fn","fn",-1175266204),yy=new x(null,"*loaded-libs*","*loaded-libs*",1951428860,null),zy=new z(null,"childContextTypes","childContextTypes",578717991),Ay=new x(null,"default__30091__auto__","default__30091__auto__",1642882479,null),By=new x(null,"create-ns","create-ns", +-782886354,null),Cy=new x("cljs.tools.reader.edn","escape-char","cljs.tools.reader.edn/escape-char",17562632,null),Dy=new x(null,"sort-by","sort-by",1317932224,null),Ey=new x("re-frame.alpha","reg-flow","re-frame.alpha/reg-flow",1343157800,null),Fy=new x(null,"temp__34616__auto__","temp__34616__auto__",-712059830,null),Gy=new z("api-docs","heading","api-docs/heading",2007966345),Hy=new x("reagent.core","track!","reagent.core/track!",-954652078,null),Iy=new x(null,"reg-event-fx","reg-event-fx",350713021, +null),Jy=new z(null,"end-row-key","end-row-key",-1126662680),Ky=new x("reagent.core","atom","reagent.core/atom",1748890217,null),Ly=new x(null,"defprotocol","defprotocol",1388695348,null),My=new x(null,"frequencies","frequencies",1757430425,null),Ny=new z(null,"dead","dead",-1946604091),Oy=new x("cljs.core","defonce","cljs.core/defonce",-1291833100,null),Py=new x(null,"class2","class2",-1266396392,null),Qy=new z(null,"db","db",993250759),Ry=new x(null,"into-array","into-array",-1875808354,null),Sy= +new x(null,"class1","class1",-1905977651,null),Ty=new z(null,"unwrap","unwrap",-1399175462),Uy=new x("re-frame.alpha","reg-global-interceptor","re-frame.alpha/reg-global-interceptor",973995842,null),Vy=new x(null,"thread-bound?","thread-bound?",2075334115,null),Wy=new x(null,"transduce","transduce",-2083619734,null),Xy=new x(null,"ancestors","ancestors",864486103,null),Yy=new x("cljs.core","chunk-cons","cljs.core/chunk-cons",-250075688,null),Zy=new z(null,"volatile-mutable","volatile-mutable",1731728411), +$y=new x(null,"ensure-reduced","ensure-reduced",-1606421005,null),az=new x(null,"re-find","re-find",1143444147,null),bz=new x("reagent.core","cursor","reagent.core/cursor",-1137097804,null),cz=new z(null,"max-fixed","max-fixed",166770124),dz=new z(null,"original-event","original-event",2121330403),ez=new x("js","Error.","js/Error.",750655924,null),fz=new x(null,"oldval","oldval",-221475803,null),gz=new x("re-frame.core","dispatch-sync","re-frame.core/dispatch-sync",-1113172660,null),hz=new x(null, +"rand","rand",-1745930995,null),iz=new x(null,"auto-run","auto-run",-696035332,null),uo=new x(null,"js*","js*",-1134233646,null),jz=new x("reagent.core","as-element","reagent.core/as-element",-1369748434,null),kz=new z(null,"suffix","suffix",367373057),lz=new x("cljs.core","println","cljs.core/println",-331834442,null),mz=new x(null,"-ratom-generation","-ratom-generation",-176468250,null),nz=new x(null,"smap","smap",-2041991975,null),oz=new z("sci.impl","record","sci.impl/record",-1939193950),pz= +new x(null,"gensym","gensym",-1693147401,null),qz=new z(null,"at","at",1476951349),rz=new z(null,"as","as",1148689641),sz=new x(null,"*print-length*","*print-length*",-687693654,null),tz=new z(null,"nl-t","nl-t",-1608382114),uz=new x(null,"js-\x3eclj","js-\x3eclj",1544462432,null),vz=new x("cljs.core","and","cljs.core/and",-6692549,null),wz=new x("cljs.core","reify*","cljs.core/reify*",1256833160,null),xz=new z(null,"read-cond","read-cond",1056899244),yz=new z(null,"on-mouse-leave","on-mouse-leave", +-1864319528),zz=new z(null,"evaluable?","evaluable?",1236572321),Az=new x("js","Function","js/Function",-749892063,null),Bz=new x(null,"unchecked-char","unchecked-char",1662742943,null),Cz=new x(null,"unchecked-int","unchecked-int",1672898125,null),Dz=new x("cljs.core","int","cljs.core/int",20935062,null),Ez=new x(null,"unchecked-multiply-int","unchecked-multiply-int",-788546068,null),Fz=new z(null,"column","column",2078222095),Gz=new x("reagent.core","create-class","reagent.core/create-class",-1100017147, +null),Hz=new z(null,"ok","ok",967785236),Iz=new z(null,"after","after",594996914),Jz=new z(null,"or","or",235744169),Kz=new x(null,"unchecked-inc","unchecked-inc",-1170131490,null),Lz=new x(null,"number-literal?","number-literal?",843787662,null),Mz=new x(null,"prn-str","prn-str",-145225943,null),Nz=new x(null,"rename-keys","rename-keys",355340888,null),Oz=new x(null,"xform","xform",-85179481,null),Pz=new x("re-frame.alpha","reg-sub-raw","re-frame.alpha/reg-sub-raw",1855704039,null),Qz=new x(null, +"init-val-or-seq","init-val-or-seq",-1168783320,null),Rz=new z(null,"ctx-handler","ctx-handler",-1777672230),Sz=new x(null,"v__35215__auto__","v__35215__auto__",-428346497,null),Tz=new z(null,"directive","directive",793559132),Uz=new x(null,"max-key","max-key",-2132814732,null),Vz=new x(null,"get-thread-binding-frame-impl","get-thread-binding-frame-impl",-701667726,null),Wz=new z(null,"obj","obj",981763962),Xz=new z("re-frame","query-v","re-frame/query-v",972533792),Yz=new x(null,"fs__33923__auto__", +"fs__33923__auto__",402923297,null),Zz=new x(null,"form","form",16469056,null),$z=new z(null,"buffer-level","buffer-level",928864731),aA=new x("re-frame.alpha","get-coeffect","re-frame.alpha/get-coeffect",-60529129,null),bA=new z(null,"background-color","background-color",570434026),cA=new x(null,"object","object",-1179821820,null),dA=new x(null,"conj!","conj!",-841007895,null),eA=new z(null,"bodies","bodies",-1295887172),fA=new x(null,"alias","alias",-399220103,null),gA=new x(null,"parents","parents", +-387007364,null),hA=new x(null,"value","value",1946509744,null),iA=new x(null,"keyword?","keyword?",1917797069,null),jA=new z(null,"form","form",-1624062471),kA=new z(null,"group","group",582596132),lA=new x(null,"inject-cofx","inject-cofx",-1494968627,null),mA=new x("cljs.core","or","cljs.core/or",1201033885,null),nA=new x("re-frame.alpha","on-changes","re-frame.alpha/on-changes",-229591442,null),oA=new x(null,"disj!","disj!",-1383872088,null),pA=new z(null,"ms","ms",-1152709733),qA=new z("sci.error", +"realized-beyond-max","sci.error/realized-beyond-max",-1094268187),rA=new x(null,"*print-meta*","*print-meta*",-919406644,null),sA=new x(null,"counted?","counted?",1703071664,null),tA=new z(null,"mandatory","mandatory",542802336),uA=new x("reagent.ratom","make-track","reagent.ratom/make-track",267038680,null),vA=new x("cljs.core","protocol-type-impl","cljs.core/protocol-type-impl",155177701,null),wA=new x(null,"cljs.core.PersistentQueue.EMPTY","cljs.core.PersistentQueue.EMPTY",399917828,null),xA= +new x(null,"outer","outer",1265345571,null),yA=new z("sci.impl.evaluator","try-result","sci.impl.evaluator/try-result",-1394897780),zA=new x(null,"debug","debug",32358931,null),AA=new z(null,"pretty-writer","pretty-writer",-1222834267),BA=new x(null,"descendants","descendants",-829549738,null),CA=new x("re-frame.core","clear-global-interceptor","re-frame.core/clear-global-interceptor",166960890,null),DA=new x("cljs.core","defmethod","cljs.core/defmethod",-180785162,null),EA=new x(null,"long-array", +"long-array",217579190,null),W=new z(null,"ns","ns",441598760),FA=new x(null,"track","track",1836319014,null),GA=new x(null,"associative?","associative?",-141666771,null),HA=new z(null,"done-nl","done-nl",-381024340),IA=new x(null,"amap","amap",635923055,null),JA=new x(null,"concat","concat",-467652465,null),KA=new z("sci.impl","callstack","sci.impl/callstack",-1621010557),LA=new x("re-frame.alpha","reg","re-frame.alpha/reg",44066626,null),MA=new x(null,"as-\x3e","as-\x3e",1430690540,null),NA=new x(null, +".hasOwnProperty",".hasOwnProperty",-1264659034,null),OA=new z(null,"source","source",-433931539),PA=new z("sci.impl.records","object","sci.impl.records/object",-590699738),QA=new z(null,"ns-state","ns-state",-532270771),RA=new x(null,"for","for",316745208,null),SA=new x(null,"oldform","oldform",1995222417,null),TA=new x(null,"condp","condp",1054325175,null),UA=new x(null,"else","else",132154381,null),VA=new z(null,"keyword","keyword",811389747),WA=new x(null,"args__29914__auto__","args__29914__auto__", +1674734481,null),XA=new x(null,"reduced?","reduced?",1361797384,null),YA=new x(null,"iterys__33922__auto__","iterys__33922__auto__",-627674610,null),ZA=new x("re-frame.alpha","inject-cofx","re-frame.alpha/inject-cofx",1720429518,null),$A=new x(null,"var-get","var-get",-767472097,null),aB=new x(null,"trimr","trimr",-1739157155,null),bB=new x(null,"triml","triml",-286546306,null),cB=new x(null,"join","join",881669637,null),dB=new x(null,"obj","obj",-1672671807,null),eB=new x(null,"*file*","*file*", 624866474,null),fB=new x("re-frame.core","reg-event-db","re-frame.core/reg-event-db",418153612,null),gB=new x(null,"binding-conveyor-fn","binding-conveyor-fn",2076077877,null),hB=new x("re-frame.alpha","dispatch","re-frame.alpha/dispatch",-262973571,null),iB=new z(null,"debug","debug",-1608172596),jB=new x(null,"re-seq","re-seq",-2105554076,null),kB=new x(null,"bit-xor","bit-xor",-1334295033,null),lB=new z(null,"id","id",-1388402092),mB=new x("re-frame.core","reg-event-fx","re-frame.core/reg-event-fx", --63037421,null),nB=new z(null,"else","else",-1508377146),oB=new z(null,"seq","seq",-1817803783),pB=new x(null,"defn","defn",-126010802,null),qB=new z(null,"local-\x3emutator","local-\x3emutator",1004070878),rB=new x("cljs.core","aset","cljs.core/aset",-898215545,null),sB=new z(null,"set","set",304602554),tB=new x("re-frame.alpha","remove-post-event-callback","re-frame.alpha/remove-post-event-callback",154896443,null),uB=new x(null,"unchecked-add","unchecked-add",-2030665965,null),vB=new x(null,"memfn", -"memfn",-881453486,null),wB=new x(null,"ffirst","ffirst",-694902E3,null),xB=new x(null,"bounded-count","bounded-count",1030640883,null),yB=new x(null,"swap!","swap!",-655677516,null),zB=new z(null,"interceptor","interceptor",1127739076),AB=new x(null,"args__29919__auto__","args__29919__auto__",-1527062630,null),BB=new z(null,"protocol","protocol",652470118),CB=new x(null,"capitalize","capitalize",-2143275164,null),DB=new x(null,"bound-fn*","bound-fn*",102308621,null),EB=new x(null,"prefers","prefers", --374265406,null),FB=new x(null,"after","after",-2059438855,null),GB=new x(null,"reagent.dom.client","reagent.dom.client",547914900,null),HB=new x("clojure.core","array-map","clojure.core/array-map",-1351833961,null),IB=new x("cljs.core","chunk","cljs.core/chunk",847936424,null),JB=new z("re-frame.db","path-history","re-frame.db/path-history",-1466258079),KB=new z(null,".cm-line",".cm-line",-1263581949),LB=new z(null,"colinc","colinc",-584873385),MB=new x(null,"empty","empty",-1886564811,null),NB= -new x(null,"shorts","shorts",107738238,null),OB=new x(null,"options","options",1740170016,null),PB=new x(null,"defmethod","defmethod",-579171823,null),QB=new x(null,"-inner-impl","-inner-impl",-1295431849,null),go=new x(null,"\x26","\x26",-2144855648,null),RB=new z(null,"deny","deny",1589338523),SB=new x(null,"repeat","repeat",-1821743682,null),TB=new x(null,"%","%",-950237169,null),UB=new x(null,"*","*",345799209,null),qb=new z(null,"print-length","print-length",1931866356),VB=new z(null,"up-arrow", -"up-arrow",1705310333),WB=new x(null,"child","child",-2030468224,null),XB=new x(null,"+","+",-740910886,null),yo=new x(null,".",".",1975675962,null),YB=new x(null,"-","-",-471816912,null),ZB=new x(null,"/","/",-1371932971,null),$B=new z(null,"keys","keys",1068423698),aC=new x(null,"c__33925__auto__","c__33925__auto__",425909889,null),bC=new x(null,"boolean?","boolean?",1790940868,null),cC=new x("cljs.core","chunked-seq?","cljs.core/chunked-seq?",-712922369,null),dC=new x("re-frame.alpha","after", -"re-frame.alpha/after",1163936230,null),eC=new x(null,"-set-ratom-generation!","-set-ratom-generation!",-1545989828,null),fC=new x(null,"remove-watch","remove-watch",-1105301448,null),gC=new x(null,"multi-fn-add-method-impl","multi-fn-add-method-impl",-523930142,null),hC=new x(null,"IReset","IReset",-1893729426,null),iC=new x(null,"arr","arr",2115492975,null),jC=new z(null,"eval-result","eval-result",937286342),kC=new z(null,"right-bracket","right-bracket",951856080),lC=new x(null,"_","_",-1201019570, -null),mC=new x(null,"cond-\x3e","cond-\x3e",561741875,null),nC=new x(null,"source","source",1206599988,null),oC=new x(null,"b","b",-1172211299,null),pC=new x(null,"a","a",-482876059,null),qC=new x(null,"d","d",-682293345,null),rC=new x("sci.impl.deftype","-inner-impl","sci.impl.deftype/-inner-impl",528349233,null),sC=new x(null,"body","body",-408674142,null),tC=new x(null,"booleans","booleans",756846088,null),uC=new x(null,"c","c",-122660552,null),vC=new x(null,"f","f",43394975,null),wC=new z(null, -"sigs","sigs",-1653119622),xC=new x(null,"e","e",-1273166571,null),yC=new x(null,"h","h",-1544777029,null),zC=new x(null,"g","g",-916345864,null),AC=new x(null,"escape","escape",648929575,null),BC=new x(null,"k","k",-505765866,null),CC=new x(null,"n","n",-2092305744,null),DC=new x(null,"m","m",-1021758608,null),EC=new x(null,"attr-map?","attr-map?",116307443,null),FC=new x(null,"p","p",1791580836,null),GC=new x("sci.configs.reagent.reagent","-ratom-context","sci.configs.reagent.reagent/-ratom-context", -270989566,null),HC=new x(null,"o","o",290524299,null),IC=new x(null,"lazy-seq","lazy-seq",489632906,null),JC=new x(null,"read","read",-1514377108,null),KC=new x(null,"r","r",1169147337,null),LC=new x(null,"q","q",-1965434072,null),MC=new x(null,"doubles","doubles",-1517872169,null),NC=new x(null,"t","t",242699008,null),OC=new x(null,"s","s",-948495851,null),PC=new x(null,"__sci_this","__sci_this",-193704996,null),QC=new x(null,"re-pattern","re-pattern",1047705161,null),RC=new x("re-frame.alpha","subscribe", -"re-frame.alpha/subscribe",963246726,null),SC=new x(null,"v","v",1661996586,null),TC=new x(null,"\x3c\x3d","\x3c\x3d",1244895369,null),UC=new x(null,"x","x",-555367584,null),VC=new x(null,"get-in","get-in",-1965644065,null),WC=new x(null,"\x3c","\x3c",993667236,null),XC=new x(null,"yrel","yrel",-1573821256,null),YC=new x(null,"\x3e","\x3e",1085014381,null),ZC=new x(null,"\x3d","\x3d",-1501502141,null),$C=new x(null,"macroexpand","macroexpand",1509933344,null),aD=new x(null,"every?","every?",2083724064, -null),bD=new z(null,"hierarchy","hierarchy",-1053470341),cD=new x(null,"keywordize-keys","keywordize-keys",-1343651517,null),dD=new z(null,"async-load-fn","async-load-fn",-472170029),eD=new x("cljs.core","alength","cljs.core/alength",-1012804190,null),fD=new z(null,"radix","radix",857016463),gD=new x(null,"\x3d\x3d","\x3d\x3d",-234118149,null),hD=new z(null,"classes","classes",2037804510),iD=new z(null,"first","first",-644103046),jD=new x(null,"chunk-append","chunk-append",-1447349559,null),kD=new x(null, -"double?","double?",-2146564276,null),lD=new x(null,"*print-level*","*print-level*",-634488505,null),mD=new x("re-frame.alpha","clear-flow","re-frame.alpha/clear-flow",-1636094165,null),nD=new x(null,"args__29927__auto__","args__29927__auto__",1468136420,null),oD=new x(null,"areduce","areduce",-1873477878,null),pD=new z(null,"gen-class","gen-class",-426712454),qD=new x("re-frame.alpha","debug","re-frame.alpha/debug",-1044564714,null),rD=new x(null,"and","and",668631710,null),sD=new x(null,"\x3e\x3d", -"\x3e\x3d",1016916022,null),tD=new x("sci.configs.reagent.reagent","-tracking?","sci.configs.reagent.reagent/-tracking?",201600244,null),uD=new x(null,"z","z",851004344,null),vD=new x(null,"y","y",-117328249,null),wD=new z(null,"allow","allow",-1857325745),xD=new x(null,"reagent.debug","reagent.debug",1010511129,null),yD=new z(null,"hover?","hover?",-1201331489),zD=new x(null,"*data-readers*","*data-readers*",1269051058,null),AD=new x(null,"reactify-component","reactify-component",-882526483,null), -BD=new x(null,"separator","separator",11782402,null),CD=new x("cljs.core","unchecked-inc","cljs.core/unchecked-inc",-501313167,null),DD=new x(null,"read-string","read-string",-558384455,null),ED=new z(null,"var-args?","var-args?",-1630678710),FD=new x(null,"interleave","interleave",165488106,null),GD=new x(null,"subs","subs",1453849536,null),HD=new x("cljs.core","binding","cljs.core/binding",2050379843,null),ID=new z("sci.impl.analyzer","static-access","sci.impl.analyzer/static-access",-79014E3), -JD=new z(null,"sections","sections",-886710106),KD=new x(null,"substr","substr",-2116301839,null),LD=new x(null,"m__30094__auto__","m__30094__auto__",-403357196,null),MD=new x(null,"js-delete","js-delete",170306730,null),ND=new x(null,"sorted?","sorted?",892797714,null),OD=new z(null,"run-queue","run-queue",-1701798027),PD=new x("js","console","js/console",-1426368245,null),QD=new z(null,"raw-classes","raw-classes",1669916511),RD=new x(null,"partial","partial",1881673272,null),SD=new x(null,"memoize", -"memoize",2019341169,null),TD=new x("cljs.core","*print-fn*","cljs.core/*print-fn*",1342365176,null),UD=new x(null,"impls","impls",326516674,null),VD=new z(null,"orig","orig",-1678309870),WD=new z(null,"cofx","cofx",2013202907),XD=new x(null,"*out*","*out*",1277591796,null),YD=new x(null,"clear-fx","clear-fx",1936947081,null),ZD=new z(null,"display","display",242065432),$D=new x("cljs.core","aget","cljs.core/aget",6345791,null),aE=new z("edamame.impl.parser","cond-splice","edamame.impl.parser/cond-splice", -1534599765),bE=new z(null,"libname","libname",135992497),cE=new x("re-frame.alpha","clear-event","re-frame.alpha/clear-event",-931468981,null),dE=new x(null,"array?","array?",-1249008197,null),eE=new x(null,"reset!","reset!",527275632,null),fE=new z(null,"start","start",-355208981),gE=new z("sci.impl.deftype","IPrintWithWriter","sci.impl.deftype/IPrintWithWriter",-1280030107),hE=new x(null,"x__29926__auto__","x__29926__auto__",-1001506330,null),iE=new x(null,"xs__34377__auto__","xs__34377__auto__", -326624510,null),jE=new x(null,"sorted-set-by","sorted-set-by",899099765,null),kE=new x(null,"expr","expr",-1908713478,null),lE=new z(null,"user-select","user-select",-346451650),mE=new x("clojure.core","hash-set","clojure.core/hash-set",1229125967,null),nE=new x(null,"ns-resolve","ns-resolve",1788675756,null),oE=new x(null,"*flush-on-newline*","*flush-on-newline*",-737526501,null),pE=new z(null,"ns-aliases","ns-aliases",1290254821),qE=new z(null,"margin","margin",-995903681),rE=new x("cljs.core", -"doseq","cljs.core/doseq",-169320766,null),sE=new x(null,"temp__34331__auto__","temp__34331__auto__",-157851524,null),tE=new x(null,"keyword-identical?","keyword-identical?",931555714,null),X=new z("sci","built-in","sci/built-in",1244659599),uE=new x(null,"prefix-string","prefix-string",-922371041,null),vE=new z(null,"box-sizing","box-sizing",-1956090239),wE=new x(null,"unchecked-subtract-int","unchecked-subtract-int",-1899147615,null),xE=new x(null,"prewalk-replace","prewalk-replace",2117002030, -null),yE=new z(null,"return-str","return-str",-1734195356),zE=new x(null,"-create-type","-create-type",805234013,null),AE=new x(null,"zipmap","zipmap",-690049687,null),BE=new x(null,"temp__34366__auto__","temp__34366__auto__",367753055,null),CE=new z(null,"flush-dom","flush-dom",-933676816),DE=new x(null,"upper-case","upper-case",1427515769,null),EE=new x("cljs.core","into","cljs.core/into",1879938733,null),FE=new x(null,"nth","nth",1529209554,null),wo=new x(null,"recur","recur",1202958259,null), -GE=new x(null,"destroy__36979__auto__","destroy__36979__auto__",584334794,null),HE=new x(null,"multifn","multifn",-1904313150,null),IE=new x(null,"m__29916__auto__","m__29916__auto__",-1949617224,null),JE=new x(null,"clojure.walk","clojure.walk",1625897340,null),KE=new x(null,"capacity","capacity",1713221261,null),LE=new x(null,"-reset!","-reset!",1965723739,null),ME=new x("cljs.core","long","cljs.core/long",241154833,null),NE=new x(null,"dispatch-val-y","dispatch-val-y",1016388320,null),OE=new z(null, -"font-size","font-size",-1847940346),PE=new x(null,"inst?","inst?",1614698981,null),QE=new x(null,"dispatch-val-x","dispatch-val-x",-1545100153,null),RE=new x(null,"remove-post-event-callback","remove-post-event-callback",-909482234,null),SE=new z("tools.reader","opts","tools.reader/opts",-2121810901),TE=new x(null,"name","name",-810760592,null),UE=new x(null,"ex-data","ex-data",1331491268,null),VE=new x(null,"prefer-table__29822__auto__","prefer-table__29822__auto__",443953487,null),WE=new z(null, -"font-family","font-family",-667419874),XE=new x(null,"print","print",-1354873355,null),YE=new x(null,"cause","cause",1872432779,null),ZE=new z(null,"top-fn","top-fn",-2056129173),$E=new x("cljs.core","unquote","cljs.core/unquote",1013085760,null),aF=new x(null,"prepost-map?","prepost-map?",869562481,null),bF=new x(null,"cljs.reader","cljs.reader",1327473948,null),cF=new z("sci.impl.analyzer","unresolved","sci.impl.analyzer/unresolved",308754858),dF=new x("cljs.core","loop","cljs.core/loop",-1829423021, -null),eF=new x(null,"to-array","to-array",-585705189,null),fF=new x(null,"defn-","defn-",1097765044,null),gF=new x("re-frame.alpha","set-loggers!","re-frame.alpha/set-loggers!",-877137906,null),hF=new z(null,"padding","padding",1660304693),iF=new z(null,"read-eval","read-eval",1788733932),jF=new z(null,"effects","effects",-282369292),kF=new z(null,"add-event","add-event",938429088),lF=new z(null,"safe","safe",-125058214),dn=new z("cljs.core","halt","cljs.core/halt",-1049036715),mF=new x(null,"-\x3einterceptor", -"-\x3einterceptor",-390826100,null),nF=new x(null,"unchecked-inc-int","unchecked-inc-int",1402783397,null),oF=new x("cljs.core","deref","cljs.core/deref",1901963335,null),pF=new x("re-frame.alpha","register-sub","re-frame.alpha/register-sub",957846040,null),qF=new x(null,"sci.configs.reagent.reagent","sci.configs.reagent.reagent",94604865,null),rF=new z(null,"block","block",664686210),sF=new x(null,"refer-clojure","refer-clojure",-1840651329,null),tF=new x(null,"more","more",-418290273,null),uF=new x(null, -"not","not",1044554643,null),vF=new x(null,"reduce-kv","reduce-kv",1856296400,null),wF=new x(null,"Math","Math",2033287572,null),xF=new x(null,"re-matches","re-matches",-1865705768,null),yF=new x(null,"when","when",1064114221,null),zF=new z(null,"key-bindings","key-bindings",-1464217982),AF=new x("sci.configs.reagent.reagent","-destroy","sci.configs.reagent.reagent/-destroy",-1999711192,null),BF=new x("re-frame.alpha","reg-cofx","re-frame.alpha/reg-cofx",-964274651,null),CF=new z(null,"min-var-args", -"min-var-args",-1883389660),DF=new x(null,"validator","validator",-325659154,null),EF=new x(null,"case","case",-1510733573,null),FF=new z("sci.error","parse","sci.error/parse",-264338844),GF=new x(null,"l__34536__auto__","l__34536__auto__",-1341715107,null),tm=new z(null,"more-marker","more-marker",-14717935),HF=new x("re-frame.core","clear-fx","re-frame.core/clear-fx",-894786861,null),IF=new z(null,"run","run",-1821166653),JF=new x("cljs.core","vreset!","cljs.core/vreset!",-1308835928,null),KF=new x(null, -"completing","completing",565832990,null),LF=new x(null,"rand-nth","rand-nth",-1227719931,null),MF=new x("re-frame.alpha","flow\x3c-","re-frame.alpha/flow\x3c-",-144200489,null),NF=new x("cljs.core","defmulti","cljs.core/defmulti",723984225,null),OF=new x(null,"alter-var-root","alter-var-root",-1749458519,null),PF=new x(null,"unchecked-double","unchecked-double",-1593778036,null),QF=new x(null,"distinct","distinct",-148347594,null),ko=new x(null,"ns*","ns*",1840949383,null),RF=new z(null,"button", -"button",1456579943),SF=new x("cljs.core","meta","cljs.core/meta",-748218346,null),TF=new x("cljs.core","find-ns","cljs.core/find-ns",-486459417,null),UF=new x(null,"x__29918__auto__","x__29918__auto__",-1754369201,null),VF=new z(null,"type","type",1174270348),WF=new x("cljs.core","aclone","cljs.core/aclone",-758078968,null),XF=new x(null,"list?","list?",-1494629,null),YF=new x("sci.impl.protocols","type-\x3estr","sci.impl.protocols/type-\x3estr",1214133319,null),ZF=new z(null,"none","none",1333468478), -$F=new x(null,"vector?","vector?",-61367869,null),aG=new x(null,"bound?","bound?",767722602,null),bG=new x(null,"list*","list*",765415731,null),cG=new x(null,"dispatch-sync","dispatch-sync",-990037526,null),dG=new x("re-frame.core","remove-post-event-callback","re-frame.core/remove-post-event-callback",-1601893792,null),eG=new z("sci.impl","inlined","sci.impl/inlined",-478453593),fG=new z(null,"else-params","else-params",-832171646),gG=new x(null,"next","next",1522830042,null),hG=new z("re-frame.flow.alpha", -"flow\x3c-","re-frame.flow.alpha/flow\x3c-",1540916150),iG=new z("sci.impl","type","sci.impl/type",1797552241),jG=new x(null,"dispatch","dispatch",-1335098760,null),kG=new z(null,"let","let",-1282412701),lG=new z(null,"flex","flex",-1425124628),mG=new x(null,"Delay","Delay",-956795572,null),nG=new x(null,"not\x3d","not\x3d",1466536204,null),oG=new z(null,"line","line",212345235),pG=new x("sci.configs.reagent.reagent","-destroy!","sci.configs.reagent.reagent/-destroy!",-561262631,null),qG=new z(null, -"mutable","mutable",875778266),rG=new z(null,"ctx","ctx",-493610118),sG=new z(null,"methods","methods",453930866),tG=new x(null,"seq?","seq?",-1951934719,null),uG=new x(null,"expand-constructor","expand-constructor",-343741576,null),vG=new x(null,"level","level",-1363938217,null),wG=new x(null,"js","js",-886355190,null),xG=new z("sci","macro","sci/macro",-868536151),yG=new x(null,"unchecked-float","unchecked-float",1485658216,null),ho=new x(null,"case*","case*",-1938255072,null),zG=new x(null,"data", -"data",1407862150,null),AG=new z(null,"constructor","constructor",-1953928811),BG=new x(null,"find-doc","find-doc",-1096800949,null),CG=new x("re-frame.core","assoc-coeffect","re-frame.core/assoc-coeffect",-832544285,null),DG=new z(null,"no-cache","no-cache",1588056370),EG=new x(null,"ISwap","ISwap",484378193,null),FG=new x(null,"last-index-of","last-index-of",215608200,null),GG=new x(null,"constantly","constantly",-271143939,null),HG=new z(null,"idle","idle",-2007156861),IG=new z(null,"count","count", -2139924085),JG=new x(null,"km","km",-1276648257,null),KG=new x(null,"rdr","rdr",190007785,null),LG=new x(null,"-destroy","-destroy",-557272508,null),MG=new x("re-frame.core","make-restore-fn","re-frame.core/make-restore-fn",-1130647527,null),NG=new z(null,"right","right",-452581833),OG=new x(null,"ks","ks",-754231827,null),PG=new z(null,"groupEnd","groupEnd",-337721382),QG=new z(null,"linear","linear",872268697),RG=new z("sci.impl","macroexpanding","sci.impl/macroexpanding",2113471825),SG=new z("sci.impl", -"inner-fn","sci.impl/inner-fn",1663302998),TG=new x(null,"default__30171__auto__","default__30171__auto__",-784606190,null),UG=new x(null,"flush","flush",501820328,null),VG=new z(null,"auto-run","auto-run",1958400437),WG=new x(null,"nthrest","nthrest",1219890118,null),XG=new x("re-frame.alpha","clear-subscription-cache!","re-frame.alpha/clear-subscription-cache!",-2028281230,null),nb=new z(null,"readably","readably",1129599760),YG=new x(null,"reg","reg",-1018219425,null),ZG=new x(null,"true?","true?", --1600332395,null),$G=new x(null,"var-set","var-set",-1361408121,null),aH=new z(null,"only","only",1907811652),bH=new x(null,"rem","rem",664046770,null),cH=new x(null,"ns-map","ns-map",-434605548,null),dH=new x("cljs.core","pop-thread-bindings","cljs.core/pop-thread-bindings",-1994943347,null),eH=new x("cljs.core","chunk-rest","cljs.core/chunk-rest",-398161143,null),fH=new x(null,"rev","rev",1653234197,null),gH=new z(null,"data","data",-232669377),hH=new z(null,"try","try",1380742522),iH=new x(null, -"ret","ret",1172308713,null),jH=new x(null,"limit","limit",284709164,null),kH=new x(null,"clojure.lang.IChunk","clojure.lang.IChunk",195957271,null),lH=new x(null,"make-array","make-array",-1135103906,null),mH=new x("cljs.core","*print-newline*","cljs.core/*print-newline*",6231625,null),nH=new x(null,"select-keys","select-keys",-708556589,null),oH=new x(null,"instance?","instance?",1075939923,null),pH=new x(null,"assoc-coeffect","assoc-coeffect",891917445,null),qH=new x(null,"double","double",-1769548886, -null),rH=new x("sci.impl.namespaces","with-open","sci.impl.namespaces/with-open",-1695932508,null),sH=new x(null,"update","update",-1608859373,null),tH=new x(null,"sets","sets",2041487109,null),uH=new z(null,"as-alias","as-alias",82482467),vH=new x("cljs.core","zero?","cljs.core/zero?",-341242858,null),wH=new x(null,"when-not","when-not",-1223136340,null),xH=new x(null,"p3","p3",-923395030,null),yH=new x(null,"lower-case","lower-case",1428172944,null),ro=new x(null,"ns","ns",2082130287,null),zH=new z(null, -"stack","stack",-793405930),Zm=new z(null,"pending","pending",-220036727),AH=new x(null,"track!","track!",-516308489,null),BH=new x(null,"p1","p1",703771573,null),CH=new x(null,"p2","p2",-1748935128,null),DH=new x(null,"inc","inc",324505433,null),EH=new x(null,"fields","fields",-291534703,null),FH=new x(null,"random-uuid","random-uuid",-1574409597,null),GH=new x(null,"macroexpand-all","macroexpand-all",966103926,null),HH=new z(null,"padchar","padchar",2018584530),IH=new x(null,"sequential?","sequential?", -1102351463,null),JH=new z(null,"strable","strable",1877668047),KH=new x(null,"force","force",-1872478483,null),LH=new z(null,"col","col",-1959363084),MH=new x("re-frame.alpha","assoc-effect","re-frame.alpha/assoc-effect",1368167222,null),NH=new x(null,"int","int",-100885395,null),OH=new x("re-frame.core","path","re-frame.core/path",-3666115,null),PH=new x(null,"nthnext","nthnext",1677356670,null),QH=new x(null,"get-coeffect","get-coeffect",1018510098,null),RH=new x("re-frame.alpha","trim-v","re-frame.alpha/trim-v", -1427788858,null),SH=new x(null,"or","or",1876275696,null),TH=new z(null,"vararg-idx","vararg-idx",-590991228),UH=new x(null,"assoc!","assoc!",-847603280,null),VH=new z(null,"opacity","opacity",397153780),WH=new x(null,"blank?","blank?",1891979743,null),XH=new x(null,"*print-dup*","*print-dup*",103854877,null),YH=new z(null,"offset","offset",296498311),ZH=new x(null,"extend-type","extend-type",1123355921,null),$H=new x(null,"set?","set?",1636014792,null),aI=new x("re-frame.core","register-sub","re-frame.core/register-sub", --772926397,null),bI=new x(null,"set1","set1",-1952562536,null),cI=new x(null,"set2","set2",1231516531,null),dI=new x(null,"meta__29920__auto__","meta__29920__auto__",-1377505366,null),eI=new x(null,"hash-unordered-coll","hash-unordered-coll",-240471618,null),fI=new z(null,"mincol","mincol",1230695445),gI=new x("js","Object","js/Object",61215323,null),hI=new x(null,"ps","ps",1932889573,null),iI=new x(null,"var__35532__auto__","var__35532__auto__",-1748153056,null),jI=new x("re-frame.alpha","unwrap", -"re-frame.alpha/unwrap",-837576658,null),kI=new x(null,"add-post-event-callback","add-post-event-callback",182608154,null),lI=new x(null,"pr","pr",1056937027,null),xo=new x(null,"set!","set!",250714521,null),mI=new x(null,"reductions","reductions",549963952,null),nI=new x(null,"size","size",-1555742762,null),oI=new x(null,"rsubseq","rsubseq",-710070471,null),pI=new x(null,"re-frame.db","re-frame.db",983930750,null),qI=new x(null,"chunk-next","chunk-next",-547810434,null),rI=new x(null,"*read-eval*", -"*read-eval*",1122065414,null),sI=new x(null,"subseq","subseq",-1558995241,null),tI=new x(null,"reg-event-error-handler","reg-event-error-handler",2097956445,null),uI=new z(null,"dispatch-n","dispatch-n",-504469236),vI=new x(null,"s1","s1",338671490,null),wI=new x(null,"double-array","double-array",257035726,null),xI=new x(null,"fs__33924__auto__","fs__33924__auto__",-1343826606,null),yI=new z(null,"not-delivered","not-delivered",1599158697),zI=new x(null,"s2","s2",614604262,null),AI=new x(null,"on-changes", -"on-changes",-1308523167,null),BI=new x(null,"select","select",-1506602266,null),CI=new z(null,"miser-width","miser-width",-1310049437),DI=new x(null,"root","root",1191874074,null),EI=new x(null,"vswap!","vswap!",-574070781,null),FI=new x(null,"args","args",-1338879193,null),GI=new x(null,"re","re",1869207729,null),HI=new x(null,"rf","rf",-651557526,null),II=new x(null,"every-pred","every-pred",-1346958247,null),JI=new x(null,"pr-str","pr-str",-2066912145,null),KI=new x(null,"requiring-resolve","requiring-resolve", --1888505231,null),LI=new x(null,".error",".error",1756007195,null),MI=new x(null,"ns-imports","ns-imports",1111168888,null),NI=new z(null,"error","error",-978969032),OI=new z(null,"live","live",-1610148039),PI=new x(null,"-create-record-type","-create-record-type",-1472918739,null),QI=new z(null,"white-space","white-space",-707351930),RI=new x(null,"sb","sb",-1249746442,null),SI=new x(null,"sc","sc",-1506412737,null),TI=new x(null,"with-local-vars","with-local-vars",837642072,null),UI=new x(null, -"iter__33928__auto__","iter__33928__auto__",-373649548,null),VI=new z(null,"focus?","focus?",-3018488),WI=new x(null,"handler","handler",1444934915,null),XI=new x(null,"unchecked-dec","unchecked-dec",2095823150,null),YI=new x(null,"partition","partition",-1479695018,null),ZI=new x("re-frame.core","clear-subscription-cache!","re-frame.core/clear-subscription-cache!",-8362855,null),$I=new z(null,"args","args",1315556576),aJ=new x(null,"cljs.core.ISwap","cljs.core.ISwap",2045511362,null),bJ=new x(null, -"list","list",-1889078086,null),cJ=new x("re-frame.alpha","reg-event-ctx","re-frame.alpha/reg-event-ctx",-1720579255,null),dJ=new x(null,"hash-combine","hash-combine",1136881997,null),eJ=new x(null,"ends-with?","ends-with?",-346570208,null),fJ=new x(null,"arg1","arg1",-1702536411,null),gJ=new z(null,"postprocess","postprocess",-1863762881),hJ=new x(null,"arg2","arg2",-924884852,null),iJ=new x(null,"arg3","arg3",153709031,null),jJ=new x(null,"eval","eval",536963622,null),kJ=new x(null,"nat-int?","nat-int?", --1879663400,null),lJ=new x("cljs.core","seq-to-map-for-destructuring","cljs.core/seq-to-map-for-destructuring",240595294,null),mJ=new x(null,"to","to",1832630534,null),nJ=new x("reagent.debug","-tracking?","reagent.debug/-tracking?",409956583,null),oJ=new x(null,"superset?","superset?",2074872204,null),pJ=new z(null,"sequential","sequential",-1082983960),qJ=new x(null,"meth__30090__auto__","meth__30090__auto__",-932914052,null),rJ=new x("cljs.tools.reader.edn","read-symbolic-value","cljs.tools.reader.edn/read-symbolic-value", -111468855,null),qo=new x(null,"new","new",-444906321,null),sJ=new x(null,"clojure.core","clojure.core",-189332625,null),tJ=new x("cljs.core","with-meta","cljs.core/with-meta",749126446,null),uJ=new x("re-frame.core","purge-event-queue","re-frame.core/purge-event-queue",1051371119,null),vJ=new x(null,"second","second",1195829517,null),wJ=new z(null,"function-components","function-components",1492814963),xJ=new x(null,"lift-ns","lift-ns",602311926,null),yJ=new x(null,"keyword-fn","keyword-fn",1575964852, -null),zJ=new x(null,"partition-by","partition-by",-1329938249,null),AJ=new z(null,"allows-separator","allows-separator",-818967742),BJ=new z(null,"list","list",765357683),CJ=new x("cljs.core","seq","cljs.core/seq",-1649497689,null),DJ=new z(null,"buffering","buffering",-876713613),EJ=new x(null,"clear-flow","clear-flow",-568034772,null),FJ=new z(null,"arg1","arg1",951899358),GJ=new z(null,"base-args","base-args",-1268706822),HJ=new z(null,"arg3","arg3",-1486822496),IJ=new z(null,"arg2","arg2",1729550917), -JJ=new z(null,"end-row","end-row",-545103581),KJ=new x(null,"interceptors","interceptors",93748576,null),LJ=new x(null,"sorted-map","sorted-map",-521216771,null),MJ=new x("reagent.ratom","reactive?","reagent.ratom/reactive?",-358553475,null),NJ=new x(null,"idxv","idxv",-1163260636,null),OJ=new x(null,"peek","peek",1349135202,null),PJ=new x(null,"refer","refer",676235974,null),QJ=new x("cljs.core","update","cljs.core/update",-908565906,null),RJ=new z(null,"event","event",301435442),SJ=new x(null,"vol", -"vol",1137570949,null),TJ=new x("cljs.core","not\x3d","cljs.core/not\x3d",1017572457,null),UJ=new z(null,"commainterval","commainterval",-1980061083),VJ=new x(null,"unchecked-multiply","unchecked-multiply",-1019161490,null),WJ=new x(null,"idxs","idxs",-2145941206,null),XJ=new x(null,"goog.string.StringBuffer","goog.string.StringBuffer",-1220229842,null),YJ=new z(null,"dispatch-later","dispatch-later",291951390),ZJ=new x(null,"simple-keyword?","simple-keyword?",-367134735,null),$J=new x(null,"clojure.string", -"clojure.string",-1415552165,null),aK=new x(null,"end","end",1372345569,null),bK=new x(null,"extend","extend",-817951763,null),cK=new x("cljs.core","constantly","cljs.core/constantly",119002258,null),dK=new x("re-frame.core","reg-sub","re-frame.core/reg-sub",-1693960551,null),eK=new x(null,"quoted-sym","quoted-sym",474507191,null),fK=new x("cljs.core","concat","cljs.core/concat",-1133584918,null),gK=new x("re-frame.alpha","register-handler","re-frame.alpha/register-handler",-948806686,null),hK=new x(null, -"delay","delay",1066306308,null),iK=new x(null,"halt-when","halt-when",-140999689,null),jK=new z("sci.impl.analyzer","method-name","sci.impl.analyzer/method-name",-842600667),kK=new x("cljs.core","bound-fn*","cljs.core/bound-fn*",-556238942,null),lK=new x(null,"macroexpand-1","macroexpand-1",659241329,null),mK=new x(null,"merge-with","merge-with",1025434534,null),nK=new z(null,"cleanup","cleanup",1045776959),oK=new z(null,"coeffects","coeffects",497912985),pK=new x(null,"eof","eof",1151468290,null), -qK=new x(null,"new-value","new-value",-1567397401,null),rK=new x(null,"reg-flow","reg-flow",274605349,null),sK=new x(null,"simple-ident?","simple-ident?",194189851,null),tK=new x(null,"chunk-rest","chunk-rest",-1853526420,null),uK=new x(null,"xs","xs",-2004992428,null),vK=new z(null,"source-form","source-form",-1814167760),wK=new x(null,"byte","byte",-1970660549,null),xK=new x(null,"complement","complement",-913606051,null),yK=new x(null,"hash","hash",1626749931,null),zK=new z(null,"inject-global-interceptors", -"inject-global-interceptors",-2144129737),AK=new x(null,"rsym","rsym",204230332,null),BK=new x(null,"idx2","idx2",195459820,null),CK=new z("re-frame.flow.alpha","cleared?","re-frame.flow.alpha/cleared?",1524733548),DK=new x(null,"keyword","keyword",-1843046022,null),EK=new z(null,"right-margin","right-margin",-810413306),FK=new z(null,"flow","flow",590489032),GK=new z(null,"eval-on-init?","eval-on-init?",-63148552),HK=new x(null,"trim-v","trim-v",365592887,null),IK=new x(null,"ys","ys",1606115702, -null),JK=new x(null,"identical?","identical?",-745864205,null),KK=new x(null,"array-map","array-map",1555038968,null),LK=new z("re-frame.flow.alpha","cleared","re-frame.flow.alpha/cleared",234911327),MK=new x(null,"with-meta","with-meta",73674707,null),NK=new x(null,"trampoline","trampoline",-71368916,null),OK=new z(null,"buffer-blob","buffer-blob",-1830112173),PK=new x(null,"bound-fn","bound-fn",125411266,null),QK=new x(null,"render","render",232498073,null),RK=new x(null,"enqueue","enqueue",1377000435, -null),SK=new x(null,"function","function",-486723946,null),TK=new z("edamame.impl.parser","fn-literal","edamame.impl.parser/fn-literal",-1835933155),UK=new x(null,"min","min",2085523049,null),VK=new x(null,"method-cache__29823__auto__","method-cache__29823__auto__",-1981375157,null),WK=new x(null,"unsigned-bit-shift-right","unsigned-bit-shift-right",-1953076601,null),XK=new x(null,"min-key","min-key",246826648,null),YK=new x(null,"postwalk-replace","postwalk-replace",77744733,null),ZK=new z("sci.impl", -"print-method","sci.impl/print-method",281191566),$K=new x(null,"find-ns","find-ns",-884829568,null),aL=new z(null,"features","features",-1146962336),bL=new x("cljs.core","with-redefs-fn","cljs.core/with-redefs-fn",-1271194088,null),cL=new x(null,"sigs","sigs",-12588095,null),dL=new x(null,"\x26form","\x26form",1482799337,null),eL=new x(null,"not-empty","not-empty",2029453590,null),fL=new x(null,"decls","decls",-1311111277,null),gL=new x("cljs.core","assert","cljs.core/assert",1075777968,null),hL= -new x(null,"sci.lang.Type","sci.lang.Type",-534180168,null),iL=new x(null,"find-var","find-var",-497901917,null),jL=new x(null,"with-open","with-open",172119667,null),kL=new x(null,"with-out-str","with-out-str",-140201577,null),lL=new x("cljs.tools.reader.impl.commons","number-literal?","cljs.tools.reader.impl.commons/number-literal?",-1450304800,null),mL=new x(null,"disj","disj",-1076545178,null),nL=new x(null,"as-element","as-element",-2139409597,null),oL=new x("re-frame.alpha","clear-sub","re-frame.alpha/clear-sub", --298138053,null),pL=new x("re-frame.core","subscribe","re-frame.core/subscribe",-774932115,null),qL=new z(null,"iden-\x3einvoke-idx","iden-\x3einvoke-idx",-1797627026),rL=new z(null,"result-format","result-format",-510072183),sL=new x(null,"class","class",-390430469,null),tL=new x(null,"distinct?","distinct?",-1684357959,null),uL=new x("re-frame.core","reg-sub-raw","re-frame.core/reg-sub-raw",-1992472244,null),vL=new z("sci.impl","fast-path","sci.impl/fast-path",1273254676),wL=new x(null,"make-restore-fn", -"make-restore-fn",-439197753,null),xL=new x(null,"unchecked-long","unchecked-long",1306610949,null),yL=new x("cljs.core","first","cljs.core/first",-752535972,null),zL=new z(null,"local","local",-1497766724),AL=new x("cljs.core","lift-ns","cljs.core/lift-ns",463499081,null),BL=new x("cljs.core","nth","cljs.core/nth",1961052085,null),CL=new x(null,"vals","vals",-1886377036,null),DL=new z(null,"rename","rename",1508157613),EL=new x(null,"intern","intern",1664352151,null),FL=new x("re-frame.alpha","path", -"re-frame.alpha/path",375488906,null),GL=new x(null,"make-track","make-track",-1388299455,null),HL=new x(null,"-mutate","-mutate",-795549165,null),IL=new x("cljs.core","unchecked-inc-int","cljs.core/unchecked-inc-int",-2007014592,null),JL=new z(null,"full","full",436801220),KL=new x(null,"qualified-ident?","qualified-ident?",-928894763,null),LL=new z(null,"lines","lines",-700165781),ML=new x(null,"farg__30088__auto__","farg__30088__auto__",620571369,null),NL=new z(null,"ex-idx","ex-idx",795118805), -OL=new z(null,"warn","warn",-436710552),PL=new x(null,"project","project",-1530041190,null),QL=new x(null,"console","console",-1426363712,null),RL=new z(null,"tag","tag",-1290361223),SL=new z(null,"indent-t","indent-t",528318969),TL=new x(null,"subscribe","subscribe",2056785283,null),UL=new x("cljs.core","chunk-buffer","cljs.core/chunk-buffer",14093626,null),VL=new x(null,"track-console","track-console",17070495,null),WL=new x(null,"loaded-libs","loaded-libs",484141875,null),XL=new z(null,"reagent-render", -"reagent-render",-985383853),YL=new z(null,"db-handler","db-handler",579530098),ZL=new x(null,"with-redefs-fn","with-redefs-fn",-595725379,null),$L=new x(null,"dedupe","dedupe",-461856254,null),aM=new z(null,"regex","regex",939488856),bM=new x(null,"record?","record?",-1305224237,null),cM=new z(null,"var-arg-name","var-arg-name",-1100024887),dM=new x("reagent.ratom","atom","reagent.ratom/atom",-391081187,null),eM=new x(null,"farg__30169__auto__","farg__30169__auto__",1485550226,null),fM=new x("sci.impl.records", -"-create-record-type","sci.impl.records/-create-record-type",558578550,null),mo=new x(null,"loop*","loop*",615029416,null),gM=new x(null,"defmulti","defmulti",1936112154,null),hM=new z(null,"contextTypes","contextTypes",-2023853910),iM=new z(null,"verbose","verbose",1694226060),jM=new z(null,"cleared","cleared",-1267667336),kM=new x(null,"then","then",2101129597,null),lM=new x(null,"cycle","cycle",-1944070485,null),mM=new x(null,"inner","inner",257360312,null),nM=new z("sci","type","sci/type",1175422389), -oM=new x(null,"*assert*","*assert*",1479636474,null),pM=new x(null,"iterys__33923__auto__","iterys__33923__auto__",-214988675,null),qM=new x(null,"some-\x3e\x3e","some-\x3e\x3e",-1499987794,null),rM=new z("sci.impl.analyzer","recur","sci.impl.analyzer/recur",2033369355),sM=new x("cljs.core","apply","cljs.core/apply",1757277831,null),tM=new x(null,"quoted","quoted",-537090817,null),uM=new x(null,"context","context",810340414,null),vM=new z(null,"right-params","right-params",-1790676237),wM=new x(null, -"var?","var?",230455531,null),xM=new z(null,"color","color",1011675173),yM=new z(null,"colon","colon",-965200945),zM=new x(null,"reg-global-interceptor","reg-global-interceptor",2060591173,null),AM=new x(null,"if-not","if-not",-265415609,null),BM=new z(null,"aliases","aliases",1346874714),CM=new x(null,"keys","keys",-1586012071,null),Cl=new z("cljs.core","not-found","cljs.core/not-found",-1572889185),DM=new z(null,"trigger","trigger",103466139),EM=new x(null,"pos-int?","pos-int?",-1205815015,null), -FM=new x("cljs.core","resolve","cljs.core/resolve",1796776582,null),GM=new x(null,"c1","c1",-1521904966,null),HM=new z(null,"success-promise","success-promise",1039972564),IM=new x(null,"simple-symbol?","simple-symbol?",1408454822,null),JM=new z(null,"fixed-arity","fixed-arity",1586445869),KM=new x(null,"c2","c2",78651156,null),LM=new x(null,"c3","c3",468715789,null),MM=new x("cljs.core","when-not","cljs.core/when-not",-556141047,null),NM=new z(null,"declared","declared",92336021),OM=new x(null,"-write", -"-write",1999625154,null),PM=new z(null,"method-params","method-params",-980792179),QM=new z(null,"vector","vector",1902966158),RM=new x(null,"tagged-literal?","tagged-literal?",1117865390,null),SM=new x(null,"new-loggers","new-loggers",-1268568509,null),TM=new z(null,"bindings","bindings",1271397192),UM=new x(null,"cljs.pprint","cljs.pprint",-966900911,null),VM=new x(null,"unwrap","unwrap",241356065,null),WM=new x(null,"vreset!","vreset!",1237177091,null),XM=new x(null,"realized?","realized?",207229341, -null),YM=new x(null,"symbol","symbol",601958831,null),ZM=new x("re-frame.core","-\x3einterceptor","re-frame.core/-\x3einterceptor",6499190,null),$M=new x(null,"cf","cf",-1173699459,null),aN=new x(null,"clj-\x3ejs","clj-\x3ejs",-1880244676,null),bN=new x(null,"trim-newline","trim-newline",656815794,null),cN=new x(null,"re-frame.alpha","re-frame.alpha",-730584042,null),dN=new x(null,"fnext","fnext",1424835295,null),eN=new x(null,"rseq","rseq",-1719353554,null),fN=new x(null,"create-compiler","create-compiler", -1059333141,null),gN=new z(null,"resume","resume",-118572261),hN=new x("reagent.debug","track-console","reagent.debug/track-console",-1553126476,null),lo=new x(null,"finally","finally",-1065347064,null),iN=new z(null,"func","func",-238706040),jN=new x(null,"parse-symbol","parse-symbol",1608073451,null),kN=new z(null,"yield","yield",177875009),lN=new x(null,"msg","msg",254428083,null),mN=new x(null,"vec","vec",982683596,null),nN=new x(null,"db","db",-1661185010,null),oN=new x(null,"prewalk","prewalk", -1337993264,null),pN=new z("edamame.core","eof","edamame.core/eof",1855384188),qN=new z(null,"dynamic","dynamic",704819571),rN=new x(null,"clojure.pprint","clojure.pprint",-547379114,null),sN=new x(null,"hash-set","hash-set",-1145168432,null),no=new x(null,"do","do",1686842252,null),tN=new x(null,"f1","f1",-939903380,null),uN=new x(null,"f2","f2",2036700123,null),aaa=new x(null,"f3","f3",-699606726,null),vN=new x(null,"if-some","if-some",1960677609,null),wN=new x(null,"take-while","take-while",2007268328, -null),baa=new z(null,"self-ref?","self-ref?",412808630),xN=new x(null,"push-thread-bindings","push-thread-bindings",1054019843,null),yN=new x(null,"persistent!","persistent!",1286555698,null),zN=new z(null,"invoc-size","invoc-size",2053298058),caa=new x(null,"seed","seed",1709144854,null),daa=new x("clojure.core","seq","clojure.core/seq",-1551838743,null),AN=new z(null,"comment","comment",532206069),BN=new x(null,"clojure.edn","clojure.edn",-302325352,null),CN=new x(null,"the-ns","the-ns",1016317907, -null),Ao=new x(null,"quote","quote",1377916282,null),eaa=new z(null,"last","last",1105735132),faa=new z(null,"preserve","preserve",1276846509),DN=new x(null,"qualified-keyword?","qualified-keyword?",375456001,null),EN=new x(null,"char?","char?",-1072221244,null),FN=new x(null,"*in*","*in*",1130010229,null),GN=new x(null,"idx","idx",-1600747296,null),HN=new x(null,"el","el",22330409,null),IN=new x(null,"intersection","intersection",-650544759,null),JN=new x(null,"ex","ex",226760186,null),gaa=new x("cljs.core", -"*ns*","cljs.core/*ns*",1155497085,null),KN=new x(null,"derive","derive",1727397303,null),haa=new z(null,"cljs","cljs",1492417629),LN=new x(null,"clojure.template","clojure.template",-1162325089,null),MN=new x(null,"cond-\x3e\x3e","cond-\x3e\x3e",348844960,null),NN=new z("re-frame.flow.alpha","new?","re-frame.flow.alpha/new?",1214332038),iaa=new x("re-frame.alpha","clear-cofx","re-frame.alpha/clear-cofx",-1974187287,null),ON=new x(null,"bit-flip","bit-flip",809639606,null),PN=new z(null,"deref","deref", --145586795),QN=new x(null,"fs","fs",-482394717,null),RN=new x(null,"fn","fn",465265323,null),SN=new x(null,"type","type",-1480165421,null),TN=new x(null,"dotimes","dotimes",-818708397,null),UN=new z(null,"max-iterations","max-iterations",2021275563),VN=new x(null,"subset?","subset?",1551079215,null),WN=new x(null,"map-indexed","map-indexed",-1391025435,null),jaa=new x("clojure.core","deftype","clojure.core/deftype",-1728257017,null),XN=new x(null,"conj","conj",-1127293942,null),YN=new z(null,"char", -"char",-641587586),kaa=new x("cljs.core","chunk-append","cljs.core/chunk-append",-243671470,null),ZN=new x(null,"newline","newline",-864364446,null),$N=new x(null,"cons","cons",755448454,null),laa=new x("re-frame.alpha","reg-fx","re-frame.alpha/reg-fx",-1164392872,null),maa=new z("re-frame.db","path","re-frame.db/path",-1845708459),aO=new x(null,"neg-int?","neg-int?",-1610409390,null),bO=new x(null,"underive","underive",-242982950,null),naa=new x("reagent.core","create-element","reagent.core/create-element", --1888667366,null),oaa=new x("clojure.repl","dir-fn","clojure.repl/dir-fn",901908317,null),paa=new x("cljs.core","ns-name","cljs.core/ns-name",171430027,null),cO=new x(null,"cond","cond",1606708055,null),dO=new x(null,"mod","mod",1510044207,null),eO=new x(null,"keyfn","keyfn",-1874375437,null),fO=new z(null,"proxy-fn","proxy-fn",1116677438),gO=new x(null,"clear-event","clear-event",-1884567988,null),hO=new z(null,"key","key",-1516042587),iO=new x(null,"chars","chars",545901210,null),jO=new x(null, -"comp","comp",-1462482139,null),kO=new x("clojure.core","deref","clojure.core/deref",188719157,null),Cm=new z(null,"alt-impl","alt-impl",670969595),qaa=new z(null,"unnamed","unnamed",-26044928),lO=new x(null,"a__34552__auto__","a__34552__auto__",557800820,null),mO=new x(null,"inst-ms","inst-ms",-653961375,null),nO=new x(null,"val","val",1769233139,null),oO=new x("cljs.core","not","cljs.core/not",100665144,null),zo=new x(null,"var","var",870848730,null),pO=new z(null,"minpad","minpad",323570901),qO= -new z(null,"global-interceptors","global-interceptors",-1995759472),rO=new x(null,"on-dispose","on-dispose",-549129409,null),raa=new x("re-frame.alpha","sub","re-frame.alpha/sub",-1533844183,null),sO=new z(null,"logical-block","logical-block",-581022564),tO=new x(null,"dispatch-val","dispatch-val",69061E3,null),uO=new x(null,"seq-exprs","seq-exprs",-637209651,null),vO=new x(null,"id","id",252129435,null),wO=new x(null,"reagent.ratom","reagent.ratom",-2036346616,null),xO=new z(null,"sub","sub",-2093760025), -saa=new x(null,"escape-char","escape-char",-2072670949,null),po=new x(null,"if","if",1181717262,null),yO=new x(null,"coll","coll",-1006698606,null),zO=new x(null,"create-root","create-root",686733849,null),taa=new x(null,"\x26env","\x26env",-919163083,null),uaa=new x(null,"get-flow","get-flow",2144295658,null),AO=new x(null,"drop","drop",2005013138,null),BO=new x(null,"stringify-keys","stringify-keys",1735215919,null),vaa=new x("cljs.core","some?","cljs.core/some?",-440439360,null),CO=new x(null, -"and__35498__auto__","and__35498__auto__",-204500165,null),waa=new x(null,"read-symbolic-value","read-symbolic-value",-100790078,null),DO=new x(null,"set-loggers!","set-loggers!",-1947820787,null),EO=new z("sci.impl","op","sci.impl/op",950953978),xaa=new z(null,".cm-content",".cm-content",1680070238),FO=new x(null,"assoc-effect","assoc-effect",300107315,null),GO=new x(null,"keep-indexed","keep-indexed",-2020916352,null),HO=new x(null,"source-fn","source-fn",-1114937984,null),IO=new x(null,"any?", -"any?",-318999933,null),JO=new z(null,"string","string",-1989541586),KO=new x(null,"assert","assert",677428501,null),LO=new x(null,"register-handler","register-handler",-2025780993,null),MO=new x("cljs.core","defn","cljs.core/defn",-1606493717,null),NO=new x(null,"uuid","uuid",-504564192,null),yaa=new z(null,"overflow-x","overflow-x",-26547754),OO=new z(null,"imports","imports",-1249933394),PO=new x(null,"cljs.tools.reader.edn","cljs.tools.reader.edn",-1275821532,null),pb=new z(null,"dup","dup",556298533), -QO=new z("cljs.analyzer","no-resolve","cljs.analyzer/no-resolve",-1872351017),RO=new x(null,"js-obj","js-obj",342383250,null),SO=new x(null,"unchecked-negate","unchecked-negate",-1669067451,null),TO=new x(null,"ex-message","ex-message",-1128293394,null),UO=new x(null,"colls","colls",-397642425,null),Xm=new z(null,"status","status",-1997798413),VO=new z(null,"style","style",-496642736),zaa=new x("re-frame.core","reg-global-interceptor","re-frame.core/reg-global-interceptor",-2081719141,null),Aaa=new x("cljs.core", -"ex-info","cljs.core/ex-info",-409744395,null),Baa=new x("js","Array","js/Array",-423508366,null),WO=new x(null,"map-entry?","map-entry?",1140615277,null),XO=new x(null,"iref","iref",-647796531,null),YO=new x(null,"demunge","demunge",-1865491845,null),ZO=new z(null,"reg-flow","reg-flow",-1365926178),$O=new x(null,"dir","dir",-919681108,null),aP=new x(null,"LazySeq","LazySeq",1579450882,null),bP=new z(null,"source-str","source-str",1560992904),cP=new z(null,"self-ref-idx","self-ref-idx",-1384537812), -dP=new x(null,"rename","rename",-1146278156,null),eP=new x(null,"or__35486__auto__","or__35486__auto__",937413542,null),fP=new x(null,"filter","filter",691993593,null),Caa=new x(null,"struct-map","struct-map",-1387540878,null),gP=new z(null,"end-block-t","end-block-t",1544648735),hP=new x(null,"starts-with?","starts-with?",1014173927,null),Daa=new z(null,"width","width",-384071477),iP=new x(null,"ex-info","ex-info",-539875240,null),jP=new z(null,"max-fixed-arity","max-fixed-arity",-690205543),Eaa= -new x(null,"-\x3erecord-impl","-\x3erecord-impl",1274709757,null),so=new x(null,"deftype*","deftype*",962659890,null),kP=new x(null,"unchecked-remainder-int","unchecked-remainder-int",1427188224,null),lP=new x(null,"interpose","interpose",-2078295140,null),mP=new x(null,"args__29874__auto__","args__29874__auto__",314729536,null),nP=new x(null,"bit-and","bit-and",-479352589,null),oP=new x(null,"aseq","aseq",-1865515628,null),Faa=new z(null,"component-will-unmount","component-will-unmount",-2058314698), -pP=new x(null,"aset","aset",900773178,null),qP=new z(null,"stream","stream",1534941648),rP=new z(null,"success","success",1890645906),Gaa=new x("re-frame.alpha","add-post-event-callback","re-frame.alpha/add-post-event-callback",1255387673,null),sP=new x(null,"false?","false?",-1522377573,null),Haa=new z(null,"tag-class","tag-class",714967874),Iaa=new x("cljs.core","ex-message","cljs.core/ex-message",-747602175,null),tP=new x(null,"shuffle","shuffle",-1393023609,null),uP=new z(null,"paused","paused", --1710376127),vP=new x(null,"string?","string?",-1129175764,null),wP=new x(null,"methods","methods",2094462393,null),Jaa=new z(null,"on-mouse-enter","on-mouse-enter",-1664921661),xP=new z(null,"source-key","source-key",-1325875542),yP=new x(null,"doto","doto",1252536074,null),zP=new x(null,"println","println",-733595439,null),Kaa=new z(null,"do-flow-fx","do-flow-fx",528807066),AP=new z(null,"use","use",-1846382424),Laa=new x(null,"fnspecs","fnspecs",-958581686,null),BP=new x(null,"trim","trim",-1880116002, -null),CP=new z("edamame.impl.parser","opened-delimiter","edamame.impl.parser/opened-delimiter",1199661648),DP=new x(null,"path","path",1452340359,null),Do=new x(null,"def","def",597100991,null),EP=new z(null,"map","map",1371690461),FP=new z(null,"params","params",710516235),GP=new x(null,"dec","dec",-766002333,null),HP=new z(null,"max","max",61366548),IP=new x(null,"reg-cofx","reg-cofx",91685178,null),JP=new z(null,"check-permissions","check-permissions",669054317),KP=new x(null,"chunk-cons","chunk-cons", -433801405,null),LP=new x(null,"chunked-seq?","chunked-seq?",1044846168,null),MP=new x(null,"-new-var","-new-var",1200468147,null),Maa=new x(null,"doc+methods","doc+methods",2036080922,null),NP=new x("reagent.ratom","with-let-values","reagent.ratom/with-let-values",-575838306,null),Naa=new z(null,"handled","handled",1889700151),OP=new x(null,"ns-unalias","ns-unalias",445102632,null),Oaa=new x("cljs.core","multi-fn-impl","cljs.core/multi-fn-impl",1399453884,null),PP=new z(null,"bindingx","bindingx", -679516896),Paa=new x(null,"default","default",-347290801,null),Y=new z(null,"doc","doc",1913296891),QP=new z(null,"readers","readers",-2118263030),RP=new z(null,"quote","quote",-262615245),Bo=new x(null,"catch","catch",-1616370245,null),SP=new x(null,"apply-template","apply-template",1809601838,null),TP=new x(null,"coll?","coll?",-1874821441,null),UP=new z(null,"path","path",-188191168),Qaa=new x("cljs.core","cond-\x3e","cljs.core/cond-\x3e",-113941356,null),VP=new x(null,"newval","newval",717803975, -null),WP=new x(null,"reify","reify",1885539699,null),XP=new x(null,"to-array-2d","to-array-2d",-1563270737,null),Raa=new x("clojure.core","apply","clojure.core/apply",1654646389,null),YP=new z(null,"live?","live?",-1539352230),ZP=new x("cljs.core","alter-meta!","cljs.core/alter-meta!",574694262,null),$P=new x(null,"includes?","includes?",-2049283381,null),bQ=new x("cljs.core","-\x3e","cljs.core/-\x3e",1488366311,null),cQ=new x(null,"s__34142__auto__","s__34142__auto__",468667063,null),Saa=new x("re-frame.alpha", -"get-effect","re-frame.alpha/get-effect",-959983575,null),dQ=new z(null,"arglists-meta","arglists-meta",1944829838),eQ=new x("sci.impl.records","-\x3erecord-impl","sci.impl.records/-\x3erecord-impl",-1005013370,null),fQ=new z(null,"separator","separator",-1628749125),gQ=new x(null,"start-test","start-test",687547962,null),hQ=new z(null,"some","some",-1951079573),iQ=new x(null,"map","map",-1282745308,null),jQ=new z(null,"!view","!view",1333828958),kQ=new x(null,"max","max",1701898075,null),lQ=new x(null, -"*default-data-reader-fn*","*default-data-reader-fn*",758795499,null),mQ=new x(null,"compare","compare",1109853757,null),Taa=new z(null,"with-let37043","with-let37043",1720567524),nQ=new x(null,"multi-fn?-impl","multi-fn?-impl",1372639302,null),Uaa=new x(null,".close",".close",-1017758745,null),oQ=new x(null,"query","query",352022017,null),pQ=new z("sci.impl","fn","sci.impl/fn",1695180073),qQ=new x("clojure.core","unquote","clojure.core/unquote",843087510,null),rQ=new x(null,"-ratom-context","-ratom-context", -1646839514,null),sQ=new x(null,"load-string","load-string",-403739145,null),Vaa=new z(null,"circle","circle",1903212362),tQ=new x(null,"range","range",-1014743483,null),uQ=new x(null,"use","use",-205850897,null),vQ=new z("api-docs","hide","api-docs/hide",100735421),wQ=new x("cljs.core","if-let","cljs.core/if-let",1346583165,null),xQ=new x(null,"index","index",108845612,null),yQ=new x(null,"test","test",-2076896892,null),Waa=new x(null,"-Inf","-Inf",-2123243689,null),Xaa=new z(null,"on-click","on-click", -1632826543),zQ=new x(null,"take","take",871646627,null),Yaa=new z(null,"enrich","enrich",-2108921925),AQ=new z(null,"start-pos","start-pos",668789086),BQ=new z("edamame","expected-delimiter","edamame/expected-delimiter",93379254),CQ=new z(null,"flags","flags",1775418075),DQ=new z(null,"cljsLegacyRender","cljsLegacyRender",-1527295613),EQ=new x(null,"dorun","dorun",560426022,null),FQ=new z("re-frame.interceptor","original-exception?","re-frame.interceptor/original-exception?",-527923945),GQ=new z(null, -"splicing?","splicing?",-428596366),HQ=new z(null,"variadic","variadic",882626057),IQ=new x(null,"reg-sub-raw","reg-sub-raw",784637666,null),Zaa=new x("re-frame.core","get-effect","re-frame.core/get-effect",-1346481552,null),JQ=new z(null,"test","test",577538877),KQ=new x(null,"reg-event-ctx","reg-event-ctx",1495496276,null),LQ=new z(null,"div","div",1057191632),$aa=new x("reagent.dom.client","render","reagent.dom.client/render",423508172,null),MQ=new z(null,"fill","fill",883462889),aba=new z(null, -"auto-resolve-ns","auto-resolve-ns",-417488467),bba=new x("re-frame.core","on-changes","re-frame.core/on-changes",1765357575,null),NQ=new x(null,"*print-newline*","*print-newline*",1478078956,null),OQ=new x(null,"props","props",2093813254,null),PQ=new z(null,"file","file",-1269645878),cba=new z(null,"buffer-block","buffer-block",-10937307),dba=new x("re-frame.alpha","purge-event-queue","re-frame.alpha/purge-event-queue",1444165830,null),QQ=new x("cljs.core","rest","cljs.core/rest",-285075455,null), -RQ=new x(null,"x__34149__auto__","x__34149__auto__",781839342,null),eba=new x(null,"number","number",-1084057331,null),fba=new x("sci.configs.reagent.reagent","-set-ratom-generation!","sci.configs.reagent.reagent/-set-ratom-generation!",-35374248,null),SQ=new z(null,"scheduled","scheduled",553898551),gba=new x("sci.impl.deftype","-\x3etype-impl","sci.impl.deftype/-\x3etype-impl",-2121297742,null),TQ=new x(null,"chunk-buffer","chunk-buffer",789680287,null),hba=new x("re-frame.core","dispatch","re-frame.core/dispatch", -1765071110,null),UQ=new x(null,"reversible?","reversible?",314107817,null),VQ=new z(null,"generator-fn","generator-fn",811851656),WQ=new x(null,"ns-publics","ns-publics",903350436,null),XQ=new z(null,"loading","loading",-737050189),YQ=new x(null,"clear-global-interceptor","clear-global-interceptor",-1607850608,null),iba=new x("re-frame.alpha","clear-global-interceptor","re-frame.alpha/clear-global-interceptor",1612519571,null),jba=new x(null,"body-expr","body-expr",-2125506601,null),ZQ=new x("clojure.core", -"defrecord","clojure.core/defrecord",581689476,null),$Q=new x(null,"xrel","xrel",-735800081,null),aR=new x(null,"bit-and-not","bit-and-not",-254338837,null),bR=new x("cljs.core","-\x3e\x3e","cljs.core/-\x3e\x3e",-1207871206,null),cR=new z(null,"resolve-sym","resolve-sym",-1193683260),kba=new x("sci.configs.reagent.reagent","with-let","sci.configs.reagent.reagent/with-let",65759084,null),dR=new x(null,"longs","longs",-1017696020,null),lba=new z(null,"on-focus","on-focus",-13737624),eR=new x(null,"cljs.tools.reader.impl.commons", -"cljs.tools.reader.impl.commons",1569241026,null),fR=new x(null,"init","init",-234949907,null),gR=new x(null,"split-lines","split-lines",777513935,null),hR=new x(null,"queue","queue",-1198599890,null),mba=new z(null,"eofthrow","eofthrow",-334166531),nba=new x(null,"keyseq","keyseq",-1822150828,null),iR=new x(null,"some","some",-310548046,null),jR=new x(null,"m__30089__auto__","m__30089__auto__",-1568399348,null),kR=new x(null,"doc","doc",-741138878,null),lR=new z(null,"on-set","on-set",-140953470), -oba=new x(null,"print-doc","print-doc",528043232,null),mR=new x(null,"declare","declare",654042991,null),nR=new z(null,"start-col","start-col",668080143),oR=new z(null,"level","level",1290497552),pR=new x("cljs.core","type","cljs.core/type",-821761154,null),qR=new z("sci.impl","idx","sci.impl/idx",700902278),pba=new x("cljs.core","cons","cljs.core/cons",96507417,null),rR=new x(null,"register-sub","register-sub",2032582885,null),sR=new x(null,"clojure.set","clojure.set",-630955632,null),ob=new z(null, -"meta","meta",1499536964),tR=new x("cljs.core","conj","cljs.core/conj",-460750931,null),qba=new x("edamame.core","read-eval","edamame.core/read-eval",1461005554,null),rba=new x("reagent.core","class-names","reagent.core/class-names",-1902681251,null),uR=new x(null,"floats","floats",513591110,null),vR=new x(null,"with-bindings*","with-bindings*",-93186207,null),sba=new x(null,"zs","zs",-257004521,null),wR=new x(null,"satisfies?","satisfies?",-433227199,null),xR=new z(null,"loaded?","loaded?",-1108015206), -yR=new x(null,"walk","walk",1673453164,null),tba=new x("clojure.core","hash-map","clojure.core/hash-map",338908405,null),zR=new x(null,"pop","pop",-94247249,null),AR=new z(null,"w","w",354169001),uba=new x(null,"token","token",429068312,null),BR=new x(null,"default__29924__auto__","default__29924__auto__",-144697554,null),vba=new z(null,"on-write","on-write",31519475),CR=new z("sci","record","sci/record",-778731026),DR=new z(null,"legacy-sub","legacy-sub",207431632),ER=new x(null,"dir-fn","dir-fn", -187684626,null),Bn=new z(null,"ancestors","ancestors",-776045424),FR=new z(null,"n","n",562130025),GR=new z(null,"finish-run","finish-run",753148477),HR=new x(null,"has-root-impl","has-root-impl",-288948659,null),IR=new x(null,"sci.impl.deftype","sci.impl.deftype",959784924,null),wba=new x("cljs.core","Delay","cljs.core/Delay",-21574999,null),JR=new x(null,"reg-sub","reg-sub",852548167,null),xba=new x("re-frame.core","enrich","re-frame.core/enrich",-1956662808,null),KR=new z(null,"def","def",-1043430536), -LR=new x(null,"class-names","class-names",-1397320704,null),MR=new x(null,"n__34257__auto__","n__34257__auto__",-217955926,null),yba=new x("re-frame.core","assoc-effect","re-frame.core/assoc-effect",-114683447,null),zba=new x(null,"more-sizes","more-sizes",-763736162,null),Aba=new x("re-frame.core","clear-sub","re-frame.core/clear-sub",395526338,null),NR=new x(null,"v__34820__auto__","v__34820__auto__",339669843,null),OR=new x(null,"seq-to-map-for-destructuring","seq-to-map-for-destructuring",647384515, -null),PR=new x(null,"keyvals","keyvals",-2067234787,null),QR=new x(null,"reactive?","reactive?",1213887990,null),io=new x(null,"defrecord*","defrecord*",-1936366207,null),RR=new x(null,"reduce","reduce",1358839360,null),SR=new x(null,"dissoc!","dissoc!",333592624,null),TR=new x(null,"postwalk","postwalk",967039904,null),UR=new x(null,"reify*","reify*",1646945123,null),VR=new z(null,"k","k",-2146297393),Bba=new x("cljs.tools.reader.edn","read-char*","cljs.tools.reader.edn/read-char*",-606185164,null), -WR=new z(null,"f","f",-1597136552),Cba=new z(null,"invocation-self-idx","invocation-self-idx",-1258983407),YR=new z(null,"e","e",1381269198),Dba=new x("cljs.core","var-get","cljs.core/var-get",-91823622,null),ZR=new z(null,"d","d",1972142424),$R=new x(null,"alter-meta!","alter-meta!",1510444945,null),aS=new x(null,"float?","float?",673884616,null),bS=new x(null,"difference","difference",-738334373,null),Eba=new x(null,"read-date","read-date",1874308181,null),cS=new x(null,"replace","replace",853943757, -null),dS=new z(null,"overflowchar","overflowchar",-1620088106),eS=new x(null,"mapcat","mapcat",-601348859,null),Fba=new x("re-frame.core","inject-cofx","re-frame.core/inject-cofx",506211767,null),fS=new x(null,"chunk-first","chunk-first",1379046752,null),gS=new z(null,"min-remaining","min-remaining",962687677),hS=new z(null,"getInitialState","getInitialState",1541760916),iS=new x("cljs.core","get","cljs.core/get",-296075407,null),jS=new z(null,"commachar","commachar",652859327),kS=new x(null,"prn", -"prn",1561684909,null),lS=new x(null,"match","match",-1434376219,null),Gba=new x(null,"reagent.dom","reagent.dom",-2138920962,null),to=new x(null,"let*","let*",1920721458,null),mS=new z(null,"reload-all","reload-all",761570200),nS=new x(null,"deftype","deftype",1980826088,null),oS=new x("cljs.core","hash-map","cljs.core/hash-map",303385767,null),pS=new x(null,"doall","doall",988520834,null),qS=new z(null,"running","running",1554969103),rS=new x(null,"objs","objs",-170194107,null),sS=new z(null,"format", -"format",-1306924766),tS=new z(null,"row-key","row-key",-1189010712),jo=new x(null,"try","try",-1273693247,null),uS=new x("clojure.core","unquote-splicing","clojure.core/unquote-splicing",-552003150,null),vS=new x(null,"special-symbol?","special-symbol?",-731144617,null),wS=new x(null,"v__35531__auto__","v__35531__auto__",2126927204,null),Hba=new x("re-frame.alpha","assoc-coeffect","re-frame.alpha/assoc-coeffect",1963386808,null),Iba=new x(null,"cljs.core.IDeref","cljs.core.IDeref",-783543206,null), -pn=new z(null,"keyword-fn","keyword-fn",-64566675),xS=new z(null,"recur-target","recur-target",-1909494536),yS=new z(null,"section","section",-300141526),zS=new x(null,"eduction","eduction",1445227968,null),Jba=new x("re-frame.core","clear-cofx","re-frame.core/clear-cofx",583971922,null),AS=new x(null,"make-hierarchy","make-hierarchy",-241558556,null),BS=new z(null,"private","private",-558947994),CS=new z(null,"refers","refers",158076809),DS=new x(null,"comparator","comparator",-509539107,null),ES= -new x(null,"clojure.repl","clojure.repl",570897595,null),Kba=new z("sci.impl","required-fn","sci.impl/required-fn",2082701278),FS=new x(null,"reverse","reverse",752076261,null),GS=new z(null,"require","require",-468001333),HS=new x(null,"some?","some?",234752293,null),IS=new x(null,"random-sample","random-sample",-914181101,null),JS=new z(null,"pretty","pretty",-1916372486),KS=new x(null,"pred","pred",-727012372,null),Lba=new x("reagent.core","track","reagent.core/track",1263921785,null),LS=new x(null, -"namespace","namespace",1263021155,null),Mba=new x(null,"type-\x3estr","type-\x3estr",360030041,null),Nba=new x(null,"cljs.core.IReset","cljs.core.IReset",348905844,null),MS=new z(null,"on-dispose","on-dispose",2105306360),NS=new x(null,"let","let",358118826,null),Oba=new x(null,"string","string",-349010059,null),OS=new z(null,"loc","loc",-584284901),PS=new x(null,"import","import",241030818,null),QS=new z(null,"log","log",-1595516004),RS=new x(null,"undefined?","undefined?",1356377224,null),SS=new x(null, -"reg-fx","reg-fx",-87443115,null),TS=new z(null,"refer","refer",-964295553),US=new x(null,"require","require",1172530194,null),VS=new x(null,"assoc","assoc",2071440380,null),WS=new x(null,"ns-unmap","ns-unmap",1255260993,null),XS=new x(null,"drop-last","drop-last",-1123611530,null),Pba=new z(null,"getDerivedStateFromError","getDerivedStateFromError",166658477),YS=new x(null,"clauses","clauses",-1199594528,null),ZS=new x(null,"enrich","enrich",-468390398,null),$S=new x(null,"split-at","split-at",-60953742, -null),aT=new x(null,"map-entry","map-entry",329617471,null),Fi=new z(null,"validator","validator",-1966190681),Qba=new x(null,"eof-error?","eof-error?",863128689,null),bT=new x(null,"method-table__29821__auto__","method-table__29821__auto__",1133845620,null),cT=new z(null,"parent","parent",-878878779),dT=new x(null,"-reified-methods","-reified-methods",1702712518,null),eT=new x(null,"subvec","subvec",364611032,null),fT=new x(null,"multi-fn-impl","multi-fn-impl",187651105,null),gT=new z(null,"syntax-quote", -"syntax-quote",-1233164847),hT=new x(null,"aclone","aclone",722978531,null),iT=new z("edamame.impl.parser","expected-delimiter","edamame.impl.parser/expected-delimiter",2057965803),jT=new z(null,"namespaces","namespaces",-1444157469),kT=new z(null,"clauses","clauses",1454841241),lT=new x(null,"toString","toString",-95766347,null),mT=new x(null,"split","split",1041096409,null),nT=new x(null,"defonce","defonce",-1681484013,null),Rba=new x("re-frame.core","register-handler","re-frame.core/register-handler", -772396373,null),oT=new x(null,"bit-shift-right","bit-shift-right",884046498,null),pT=new x("cljs.core","pr-str","cljs.core/pr-str",-552799478,null),qT=new x("cljs.core","str","cljs.core/str",-1971828991,null),rT=new x(null,"integer?","integer?",1303791671,null),sT=new x(null,"transient","transient",899115069,null),tT=new x(null,"out-path","out-path",-923103991,null),uT=new x(null,"m__31016__auto__","m__31016__auto__",-863640877,null),vT=new z(null,"base","base",185279322),wT=new z(null,"end-col-key", -"end-col-key",81813304),xT=new x(null,"identity","identity",-1007039734,null),yT=new x(null,"from-index","from-index",1882766240,null),zT=new x(null,"create-element","create-element",1833774591,null),Sba=new x("clojure.core","concat","clojure.core/concat",-1236478952,null),AT=new x(null,"compiler","compiler",1372604796,null),BT=new x(null,"last","last",-1548700637,null),Tba=new z(null,"no-test","no-test",-1679482642),CT=new x(null,"*ns*","*ns*",740153818,null),Uba=new z(null,"character","character", -380652989),DT=new x(null,"forms","forms",-608443419,null),ET=new z(null,"before","before",-1633692388),FT=new x(null,"PersistentQueue","PersistentQueue",-160870792,null),GT=new x("cljs.core","\x3c","cljs.core/\x3c",1677496129,null),Vba=new z(null,"\x3e\x3e","\x3e\x3e",-277509267),Wba=new x("reagent.ratom","-destroy!","reagent.ratom/-destroy!",-337873850,null),Xba=new x("re-frame.core","reg-event-ctx","re-frame.core/reg-event-ctx",15437106,null),HT=new x(null,"while","while",-1691317983,null),Yba= -new x("cljs.core","\x3d","cljs.core/\x3d",-1891498332,null),Zba=new x(null,"-pr-writer","-pr-writer",-445354136,null),IT=new x(null,"before","before",6839139,null),$ba=new x("re-frame.alpha","clear-fx","re-frame.alpha/clear-fx",856433802,null),JT=new z(null,"type-tag","type-tag",-1873863267),KT=new x(null,"bit-test","bit-test",543456753,null),LT=new z(null,"namespaced-map","namespaced-map",1235665380),aca=new x(null,"locking","locking",1542862874,null),MT=new z(null,"exception","exception",-335277064), -NT=new z(null,"pre","pre",2118456869),bca=new x(null,"proc","proc",-643106804,null),OT=new x(null,"method__29921__auto__","method__29921__auto__",1639717635,null),PT=new x(null,"prob","prob",1133230269,null),QT=new z(null,"\x3c-","\x3c-",760412998),RT=new z(null,"min-varargs","min-varargs",1999010596),ST=new x(null,"expand-dot*","expand-dot*",-1946890561,null),TT=new x(null,"*err*","*err*",2070937226,null),UT=new x(null,"char","char",998943941,null),cca=new x("clojure.core","vec","clojure.core/vec", -146271141,null),dca=new z(null,"max-width","max-width",-1939924051),VT=new z("sci.impl","var","sci.impl/var",-2041185552),WT=new x(null,"Object","Object",61210754,null),eca=new x("re-frame.alpha","dispatch-sync","re-frame.alpha/dispatch-sync",84793109,null),fca=new x("re-frame.core","reg-cofx","re-frame.core/reg-cofx",-1104161380,null),XT=new x(null,"farg__30093__auto__","farg__30093__auto__",683812211,null),gca=new z("sci.impl.namespaces","TODO","sci.impl.namespaces/TODO",-1842365958),YT=new z(null, -"lib","lib",191808726),ZT=new x(null,"group-by","group-by",1261391725,null),$T=new x(null,"unchecked-divide-int","unchecked-divide-int",1613116468,null),aU=new x(null,"flatten","flatten",-1441633353,null),hca=new x("cljs.core","var?","cljs.core/var?",1711182854,null),bU=new z(null,"pos","pos",-864607220),cU=new x(null,"unchecked-short","unchecked-short",27848057,null),dU=new z(null,"span","span",1394872991),ica=new z(null,"return-val","return-val",-512772489),eU=new x(null,"sequence","sequence",-1727628355, -null),fU=new x(null,"quot","quot",-1125214196,null),gU=new x("cljs.core","zipmap","cljs.core/zipmap",-1902130674,null),jca=new z(null,"suppress-namespaces","suppress-namespaces",2130686956),hU=new x(null,"tree-seq","tree-seq",-1800921632,null),iU=new x(null,"*print-namespace-maps*","*print-namespace-maps*",-1759108415,null),jU=new z(null,"end-line","end-line",1837326455),kca=new x("cljs.core","-reified-methods","cljs.core/-reified-methods",-1833109469,null),kU=new x(null,"some-fn","some-fn",-490044165, -null),lU=new x(null,"ns-name","ns-name",-436814796,null),mU=new x("cljs.core","get-method","cljs.core/get-method",-487793502,null),nU=new x(null,"munge","munge",-174396700,null),oU=new z(null,"cur","cur",1153190599),pU=new z(null,"while","while",963117786),qU=new z(null,"output","output",-1105869043),rU=new x(null,"ns__35533__auto__","ns__35533__auto__",639738632,null),sU=new x(null,"resolve","resolve",56086045,null),tU=new x(null,"repeatedly","repeatedly",1199964457,null),uU=new x(null,"in-ns","in-ns", --2089468466,null),vU=new z(null,"macro","macro",-867863404),lca=new x("re-frame.alpha","-\x3einterceptor","re-frame.alpha/-\x3einterceptor",-1463442289,null);var wU={},mca={},xU=[];function yU(a,b){var c=mca[a];if(void 0!==c)return c;try{xU.push(a);var d=wU[a],e=shadow$provide[a];if(void 0===d){if(void 0===e)throw"Module not provided: "+a;d={exports:{}};wU[a]=d}if(e){delete shadow$provide[a];try{e.call(d,aa,yU,d,d.exports)}catch(h){throw console.warn("shadow-cljs - failed to load",a),h;}if(b){var f=b.globals;if(f)for(a=0;ac)b=Mj(q.h(a).split(b));else a:for(var d=c,e=Se;;){if(1===d){b=Re.g(e,a);break a}var f=pm(b,a);if(null!=f){var h=a.indexOf(f);f=a.substring(h+Ce(f));--d;e=Re.g(e,a.substring(0,h));a=f}else{b=Re.g(e,a);break a}}if(0===c&&1a?null:a};IU.j=function(a,b,c){a=a.indexOf(b,c);return 0>a?null:a};IU.m=3; var JU=function JU(a){switch(arguments.length){case 2:return JU.g(arguments[0],arguments[1]);case 3:return JU.j(arguments[0],arguments[1],arguments[2]);default:throw Error(["Invalid arity: ",q.h(arguments.length)].join(""));}};JU.g=function(a,b){a=a.lastIndexOf(b);return 0>a?null:a};JU.j=function(a,b,c){a=a.lastIndexOf(b,c);return 0>a?null:a};JU.m=3;function KU(a,b){return-1!=a.indexOf(b)};function LU(a,b,c,d,e){this.Xb=a;this.form=b;this.F=c;this.v=d;this.D=e;this.B=2230716170;this.H=139264}m=LU.prototype;m.ea=function(a,b){return this.I(null,b,null)};m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "splicing?":return this.Xb;case "form":return this.form;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.tools.reader.impl.utils.ReaderConditional{",", ","}",c,O.g(new R(null,2,5,S,[new R(null,2,5,S,[GQ,this.Xb],null),new R(null,2,5,S,[iA,this.form],null)],null),this.v))};m.Ba=function(){return new hk(this,2,new R(null,2,5,S,[GQ,iA],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 2+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-209062840^je(this)}; -m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.Xb,b.Xb)&&A.g(this.form,b.form)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,2,[GQ,null,iA,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new LU(this.Xb,this.form,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "splicing?":case "form":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(GQ,b):nh.call(null,GQ,b))?new LU(c,this.form,this.F,this.v,null):p(nh.g?nh.g(iA,b):nh.call(null,iA,b))?new LU(this.Xb,c,this.F,this.v,null):new LU(this.Xb,this.form,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,2,5,S,[new Cf(GQ,this.Xb),new Cf(iA,this.form)],null),this.v))};m.S=function(a,b){return new LU(this.Xb,this.form,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.tools.reader.impl.utils.ReaderConditional{",", ","}",c,O.g(new R(null,2,5,S,[new R(null,2,5,S,[KQ,this.Xb],null),new R(null,2,5,S,[jA,this.form],null)],null),this.v))};m.Ba=function(){return new hk(this,2,new R(null,2,5,S,[KQ,jA],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 2+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-209062840^je(this)}; +m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.Xb,b.Xb)&&A.g(this.form,b.form)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,2,[KQ,null,jA,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new LU(this.Xb,this.form,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "splicing?":case "form":return!0;default:return Af(this.v,b)}}; +m.ca=function(a,b,c){return p(nh.g?nh.g(KQ,b):nh.call(null,KQ,b))?new LU(c,this.form,this.F,this.v,null):p(nh.g?nh.g(jA,b):nh.call(null,jA,b))?new LU(this.Xb,c,this.F,this.v,null):new LU(this.Xb,this.form,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,2,5,S,[new Cf(KQ,this.Xb),new Cf(jA,this.form)],null),this.v))};m.S=function(a,b){return new LU(this.Xb,this.form,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; function sca(a,b){return new LU(b,a,null,null,null)}m.da=$a;m.J=function(a,b,c){ad(b,["#?",p(this.Xb)?"@":null].join(""));return Am(this.form,b,c)};var tca=/[\s]/;function MU(a){return null==a?null:","===a?!0:tca.test(a)}function NU(a){return null==a?null:!/[^0-9]/.test(a)}function OU(a){return"\n"===a||"\n"===a||null==a}Ei.h(0); function PU(a,b){return function e(d){return new vh(null,function(){for(;;){var f=C(d);if(f){if(of(f)){var h=vd(f),k=Ce(h),l=zh(k);return function(){for(var t=0;;)if(tthis.Wc){var a=this.ba.charAt(this.Wc);this.Wc+=1;return a}return null};XU.prototype.xb=function(){return this.uf>this.Wc?this.ba.charAt(this.Wc):null};function YU(a){var b=Hh.h(1);this.Hb=a;this.xc=b;this.Jb=this.Sd=1}YU.prototype.V=function(){var a=this.Jba?'..."':'"',d=b.length;return['"',q.h(b.substring(0,ad?"...}":"}")});fV.la(null,sB,function(a,b){return eV(a,b,"#{","}")}); -fV.la(null,QM,function(a,b){return eV(a,b,"[","]")});fV.la(null,bq,function(a,b){return Im.l(F([Ab(b)]))});function gV(a,b,c){b=new n(null,2,[VF,Vo,gq,b],null);a=bV(a)?Ve.l(b,PQ,WU(a),F([oG,UU(a),LH,VU(a)])):b;var d=PQ.h(a);b=oG.h(a);var e=LH.h(a);d=p(d)?[q.h(d)," "].join(""):null;b=p(b)?["[line ",q.h(b),", col ",q.h(e),"]"].join(""):null;c=Kb.G(q,d,b,p(p(d)?d:b)?" ":null,c);throw ao.g(c,a);}function hV(a,b){return gV(a,lw,F([Kb.g(q,b)]))}function iV(a,b){return gV(a,Eu,F([Kb.g(q,b)]))}function jV(a,b){return gV(a,tr,F([Kb.g(q,b)]))} +function aV(a){var b=Ei.h(new n(null,2,[Vu,new Wa,ZH,K(0)],null));this.Hb=a;this.mb=this.line=1;this.Ob=!0;this.prev=null;this.qd=0;this.Gd=null;this.frames=b}m=aV.prototype;m.V=function(){var a=this.Hb.V(null);if(p(a)){a=ZU(this.Hb,a);this.prev=this.Ob;this.Ob=OU(a);p(this.Ob)&&(this.qd=this.mb,this.mb=0,this.line+=1);this.mb+=1;var b=w(this.frames);b=Vu.h(b);p(b)&&b.append(a);return a}return null};m.xb=function(){return this.Hb.xb(null)}; +m.Wb=function(a,b){p(this.Ob)?(--this.line,this.mb=this.qd):--this.mb;this.Ob=this.prev;p(b)&&(a=w(this.frames),a=Vu.h(a),p(a)&&a.set(fh.j(q.h(a),0,a.getLength()-1)));return this.Hb.Wb(null,b)};m.$e=$a;m.Ac=function(){return this.line|0};m.zc=function(){return this.mb|0};m.af=function(){return this.Gd};function bV(a){return null!=a?$a===a.$e?!0:!1:!1}function cV(a){return new YU(new XU(a,Ce(a)))}function dV(a){return new $U("string"===typeof a?cV(a):a)} +function uca(a,b){var c=Vu.h(w(a.frames));try{Hi.l(a.frames,pj,new R(null,1,5,S,[ZH],null),Re,F([c.getLength()]));var d=b.s?b.s():b.call(null);if(null!=d&&(d.B&131072||$a===d.ae)){var e=w(a.frames);var f=fh.g(q.h(Vu.h(e)),u(ZH.h(e)));var h=new n(null,1,[OA,f],null),k=bf(d);var l=af(d,zl.l(F([h,Ye.g(k,OA)])))}else l=d;return l}finally{Hi.u(a.frames,pj,new R(null,1,5,S,[ZH],null),ce)}};function eV(a,b,c,d){var e=Ce(b);a=p(a)?0:10a?'..."':'"',d=b.length;return['"',q.h(b.substring(0,ad?"...}":"}")});fV.la(null,sB,function(a,b){return eV(a,b,"#{","}")}); +fV.la(null,QM,function(a,b){return eV(a,b,"[","]")});fV.la(null,aq,function(a,b){return Im.l(F([Ab(b)]))});function gV(a,b,c){b=new n(null,2,[VF,Vo,fq,b],null);a=bV(a)?Ve.l(b,UQ,WU(a),F([oG,UU(a),LH,VU(a)])):b;var d=UQ.h(a);b=oG.h(a);var e=LH.h(a);d=p(d)?[q.h(d)," "].join(""):null;b=p(b)?["[line ",q.h(b),", col ",q.h(e),"]"].join(""):null;c=Kb.G(q,d,b,p(p(d)?d:b)?" ":null,c);throw ao.g(c,a);}function hV(a,b){return gV(a,jw,F([Kb.g(q,b)]))}function iV(a,b){return gV(a,Du,F([Kb.g(q,b)]))}function jV(a,b){return gV(a,rr,F([Kb.g(q,b)]))} function kV(a,b,c,d){hV(a,F(["The map literal starting with ",fV.g(!1,u(d)),p(b)?[" on line ",q.h(b)," column ",q.h(c)].join(""):null," contains ",Ce(d)," form(s). Map literals must contain an even number of forms."]))}function lV(a,b,c){return hV(a,F(["Invalid ",uh(b),": ",c,"."]))}function mV(a,b,c){return hV(a,F(["Invalid character: ",c," found while reading ",uh(b),"."]))} -function Aca(a,b){a:{var c=JO instanceof z?JO.X:null;switch(c){case "regex":c='#"';break a;case "string":c='"';break a;default:throw Error(["No matching clause: ",q.h(c)].join(""));}}return jV(a,F(["Unexpected EOF reading ",uh(JO)," starting ",Kb.j(q,c,b),"."]))}function nV(a,b){return iV(a,F(["Invalid digit ",b," in unicode character."]))}function oV(a){return hV(a,F(["Octal escape sequence must be in range [0, 377]."]))} +function Aca(a,b){a:{var c=KO instanceof z?KO.X:null;switch(c){case "regex":c='#"';break a;case "string":c='"';break a;default:throw Error(["No matching clause: ",q.h(c)].join(""));}}return jV(a,F(["Unexpected EOF reading ",uh(KO)," starting ",Kb.j(q,c,b),"."]))}function nV(a,b){return iV(a,F(["Invalid digit ",b," in unicode character."]))}function oV(a){return hV(a,F(["Octal escape sequence must be in range [0, 377]."]))} function Bca(a,b){b=function(c){return function f(e){return new vh(null,function(){for(var h=e;;)if(h=C(h)){if(of(h)){var k=vd(h),l=Ce(k),g=zh(l);a:for(var t=0;;)if(tc?(b=c.toString(16),a=hV(a,F(["Invalid character literal \\u",b,"."]))):a=b,a;if(p(0==b.lastIndexOf("o",0))){--c;if(3V.getLength())V=V.append("0");else{V=V.toString();break a}V=SV(V);return p(V)?V:0}();g=(A.g(g,"-")?-1:1)*(60*function(){var V=SV(t);return p(V)?V:0}()+function(){var V=SV(r);return p(V)?V:0}());return new R(null,8,5,S,[a,TV(1,b,12,"timestamp month field must be in range 1..12"),TV(1,c,Oca(b,0===Ag(a,4)&&(0!==Ag(a,100)||0===Ag(a,400))),"timestamp day field must be in range 1..last day in month"), TV(0,y,23,"timestamp hour field must be in range 0..23"),TV(0,B,59,"timestamp minute field must be in range 0..59"),TV(0,J,A.g(B,59)?60:59,"timestamp second field must be in range 0..60"),TV(0,P,999,"timestamp millisecond field must be in range 0..999"),g],null)} function UV(a){if("string"===typeof a){var b=Qca(a);if(p(b)){a=D.j(b,0,null);var c=D.j(b,1,null),d=D.j(b,2,null),e=D.j(b,3,null),f=D.j(b,4,null),h=D.j(b,5,null),k=D.j(b,6,null);b=D.j(b,7,null);b=new Date(Date.UTC(a,c-1,d,e,f,h,k)-6E4*b)}else throw Error(["Unrecognized date/time syntax: ",q.h(a)].join(""));return b}throw Error("Instance literal expects a string for its timestamp.");} -var VV=Ei.h(null),WV=Ei.h(zl.l(F([new n(null,4,[Pu,UV,NO,function(a){if("string"===typeof a)return new Zn(a.toLowerCase());throw Error("UUID literal expects a string as its representation.");},hR,function(a){if(nf(a))return jj.g(dk,a);throw Error("Queue literal expects a vector for its elements.");},wG,function(a){if(nf(a)){var b=[];a=C(a);for(var c=null,d=0,e=0;;)if(ea?hW(this,oU,gW(this,oU)+Ce(b)):(hW(this,oU,Ce(b)-a-1),hW(this,oG,gW(this,oG)+Ce(fj.g(function(c){return A.g(c,"\n")},b)))),ad(gW(this,vT),b);if(p(A.g?A.g(Number,a):A.call(null,Number,a)))return Sca(this,b);throw Error(["No matching clause: ",q.h(a)].join(""));}; +m.sc=function(a,b){a=Ab(b);if(p(A.g?A.g(String,a):A.call(null,String,a)))return a=b.lastIndexOf("\n"),0>a?hW(this,pU,gW(this,pU)+Ce(b)):(hW(this,pU,Ce(b)-a-1),hW(this,oG,gW(this,oG)+Ce(fj.g(function(c){return A.g(c,"\n")},b)))),ad(gW(this,xT),b);if(p(A.g?A.g(Number,a):A.call(null,Number,a)))return Sca(this,b);throw Error(["No matching clause: ",q.h(a)].join(""));}; function jW(a,b,c,d,e,f,h,k,l,g,t,r,y){this.parent=a;this.sb=b;this.lb=c;this.indent=d;this.nb=e;this.pb=f;this.prefix=h;this.rb=k;this.tb=l;this.qb=g;this.F=t;this.v=r;this.D=y;this.B=2230716170;this.H=139264}m=jW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "parent":return this.parent;case "section":return this.sb;case "start-col":return this.lb;case "indent":return this.indent;case "done-nl":return this.nb;case "intra-block-nl":return this.pb;case "prefix":return this.prefix;case "per-line-prefix":return this.rb;case "suffix":return this.tb;case "logical-block-callback":return this.qb;default:return Yd.j(this.v,b,c)}}; m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.logical-block{",", ","}",c,O.g(new R(null,10,5,S,[new R(null,2,5,S,[cT,this.parent],null),new R(null,2,5,S,[yS,this.sb],null),new R(null,2,5,S,[nR,this.lb],null),new R(null,2,5,S,[hv,this.indent],null),new R(null,2,5,S,[HA,this.nb],null),new R(null,2,5,S,[hp,this.pb],null),new R(null,2,5,S,[Fx,this.prefix],null),new R(null,2,5,S,[dr,this.rb],null),new R(null,2,5,S,[kz,this.tb],null),new R(null,2,5,S,[Ou,this.qb], -null)],null),this.v))};m.Ba=function(){return new hk(this,10,new R(null,10,5,S,[cT,yS,nR,hv,HA,hp,Fx,dr,kz,Ou],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 10+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=1977012399^je(this)}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.logical-block{",", ","}",c,O.g(new R(null,10,5,S,[new R(null,2,5,S,[fT,this.parent],null),new R(null,2,5,S,[yS,this.sb],null),new R(null,2,5,S,[qR,this.lb],null),new R(null,2,5,S,[gv,this.indent],null),new R(null,2,5,S,[HA,this.nb],null),new R(null,2,5,S,[hp,this.pb],null),new R(null,2,5,S,[rx,this.prefix],null),new R(null,2,5,S,[br,this.rb],null),new R(null,2,5,S,[kz,this.tb],null),new R(null,2,5,S,[Nu,this.qb], +null)],null),this.v))};m.Ba=function(){return new hk(this,10,new R(null,10,5,S,[fT,yS,qR,gv,HA,hp,rx,br,kz,Nu],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 10+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=1977012399^je(this)}; m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.parent,b.parent)&&A.g(this.sb,b.sb)&&A.g(this.lb,b.lb)&&A.g(this.indent,b.indent)&&A.g(this.nb,b.nb)&&A.g(this.pb,b.pb)&&A.g(this.prefix,b.prefix)&&A.g(this.rb,b.rb)&&A.g(this.tb,b.tb)&&A.g(this.qb,b.qb)&&A.g(this.v,b.v)}; -m.kb=function(a,b){return Af(new El(null,new n(null,10,[kz,null,hv,null,cT,null,yS,null,HA,null,nR,null,Fx,null,dr,null,Ou,null,hp,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,Zh(Ye.g(this.v,b)),null)}; +m.kb=function(a,b){return Af(new El(null,new n(null,10,[kz,null,gv,null,fT,null,yS,null,HA,null,qR,null,rx,null,br,null,Nu,null,hp,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,Zh(Ye.g(this.v,b)),null)}; m.ab=function(a,b){switch(b instanceof z?b.X:null){case "parent":case "section":case "start-col":case "indent":case "done-nl":case "intra-block-nl":case "prefix":case "per-line-prefix":case "suffix":case "logical-block-callback":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(cT,b):nh.call(null,cT,b))?new jW(c,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(yS,b):nh.call(null,yS,b))?new jW(this.parent,c,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(nR,b):nh.call(null,nR,b))?new jW(this.parent,this.sb,c,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(hv,b):nh.call(null, -hv,b))?new jW(this.parent,this.sb,this.lb,c,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(HA,b):nh.call(null,HA,b))?new jW(this.parent,this.sb,this.lb,this.indent,c,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(hp,b):nh.call(null,hp,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,c,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(Fx,b):nh.call(null,Fx,b))?new jW(this.parent,this.sb,this.lb,this.indent, -this.nb,this.pb,c,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(dr,b):nh.call(null,dr,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,c,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(kz,b):nh.call(null,kz,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,c,this.qb,this.F,this.v,null):p(nh.g?nh.g(Ou,b):nh.call(null,Ou,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,c,this.F, -this.v,null):new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,10,5,S,[new Cf(cT,this.parent),new Cf(yS,this.sb),new Cf(nR,this.lb),new Cf(hv,this.indent),new Cf(HA,this.nb),new Cf(hp,this.pb),new Cf(Fx,this.prefix),new Cf(dr,this.rb),new Cf(kz,this.tb),new Cf(Ou,this.qb)],null),this.v))}; -m.S=function(a,b){return new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function kW(a,b){for(b=cT.h(b);;){if(null==b)return!1;if(a===b)return!0;b=cT.h(b)}}function lW(a,b,c,d,e,f,h,k){this.O=a;this.data=b;this.Ib=c;this.N=d;this.M=e;this.F=f;this.v=h;this.D=k;this.B=2230716170;this.H=139264}m=lW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; +m.ca=function(a,b,c){return p(nh.g?nh.g(fT,b):nh.call(null,fT,b))?new jW(c,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(yS,b):nh.call(null,yS,b))?new jW(this.parent,c,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(qR,b):nh.call(null,qR,b))?new jW(this.parent,this.sb,c,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(gv,b):nh.call(null, +gv,b))?new jW(this.parent,this.sb,this.lb,c,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(HA,b):nh.call(null,HA,b))?new jW(this.parent,this.sb,this.lb,this.indent,c,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(hp,b):nh.call(null,hp,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,c,this.prefix,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(rx,b):nh.call(null,rx,b))?new jW(this.parent,this.sb,this.lb,this.indent, +this.nb,this.pb,c,this.rb,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(br,b):nh.call(null,br,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,c,this.tb,this.qb,this.F,this.v,null):p(nh.g?nh.g(kz,b):nh.call(null,kz,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,c,this.qb,this.F,this.v,null):p(nh.g?nh.g(Nu,b):nh.call(null,Nu,b))?new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,c,this.F, +this.v,null):new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,10,5,S,[new Cf(fT,this.parent),new Cf(yS,this.sb),new Cf(qR,this.lb),new Cf(gv,this.indent),new Cf(HA,this.nb),new Cf(hp,this.pb),new Cf(rx,this.prefix),new Cf(br,this.rb),new Cf(kz,this.tb),new Cf(Nu,this.qb)],null),this.v))}; +m.S=function(a,b){return new jW(this.parent,this.sb,this.lb,this.indent,this.nb,this.pb,this.prefix,this.rb,this.tb,this.qb,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function kW(a,b){for(b=fT.h(b);;){if(null==b)return!1;if(a===b)return!0;b=fT.h(b)}}function lW(a,b,c,d,e,f,h,k){this.O=a;this.data=b;this.Ib=c;this.N=d;this.M=e;this.F=f;this.v=h;this.D=k;this.B=2230716170;this.H=139264}m=lW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "type-tag":return this.O;case "data":return this.data;case "trailing-white-space":return this.Ib;case "start-pos":return this.N;case "end-pos":return this.M;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.buffer-blob{",", ","}",c,O.g(new R(null,5,5,S,[new R(null,2,5,S,[JT,this.O],null),new R(null,2,5,S,[gH,this.data],null),new R(null,2,5,S,[Xo,this.Ib],null),new R(null,2,5,S,[AQ,this.N],null),new R(null,2,5,S,[Pq,this.M],null)],null),this.v))};m.Ba=function(){return new hk(this,5,new R(null,5,5,S,[JT,gH,Xo,AQ,Pq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 5+Ce(this.v)}; -m.U=function(){var a=this.D;return null!=a?a:this.D=a=1809113693^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.data,b.data)&&A.g(this.Ib,b.Ib)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,5,[Pq,null,Xo,null,JT,null,AQ,null,gH,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new lW(this.O,this.data,this.Ib,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.buffer-blob{",", ","}",c,O.g(new R(null,5,5,S,[new R(null,2,5,S,[LT,this.O],null),new R(null,2,5,S,[fH,this.data],null),new R(null,2,5,S,[Xo,this.Ib],null),new R(null,2,5,S,[EQ,this.N],null),new R(null,2,5,S,[Nq,this.M],null)],null),this.v))};m.Ba=function(){return new hk(this,5,new R(null,5,5,S,[LT,fH,Xo,EQ,Nq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 5+Ce(this.v)}; +m.U=function(){var a=this.D;return null!=a?a:this.D=a=1809113693^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.data,b.data)&&A.g(this.Ib,b.Ib)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,5,[Nq,null,Xo,null,LT,null,EQ,null,fH,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new lW(this.O,this.data,this.Ib,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)}; m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "data":case "trailing-white-space":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(JT,b):nh.call(null,JT,b))?new lW(c,this.data,this.Ib,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(gH,b):nh.call(null,gH,b))?new lW(this.O,c,this.Ib,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(Xo,b):nh.call(null,Xo,b))?new lW(this.O,this.data,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(AQ,b):nh.call(null,AQ,b))?new lW(this.O,this.data,this.Ib,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Pq,b):nh.call(null,Pq,b))?new lW(this.O,this.data,this.Ib,this.N,c,this.F, -this.v,null):new lW(this.O,this.data,this.Ib,this.N,this.M,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,5,5,S,[new Cf(JT,this.O),new Cf(gH,this.data),new Cf(Xo,this.Ib),new Cf(AQ,this.N),new Cf(Pq,this.M)],null),this.v))};m.S=function(a,b){return new lW(this.O,this.data,this.Ib,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; +m.ca=function(a,b,c){return p(nh.g?nh.g(LT,b):nh.call(null,LT,b))?new lW(c,this.data,this.Ib,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(fH,b):nh.call(null,fH,b))?new lW(this.O,c,this.Ib,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(Xo,b):nh.call(null,Xo,b))?new lW(this.O,this.data,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(EQ,b):nh.call(null,EQ,b))?new lW(this.O,this.data,this.Ib,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Nq,b):nh.call(null,Nq,b))?new lW(this.O,this.data,this.Ib,this.N,c,this.F, +this.v,null):new lW(this.O,this.data,this.Ib,this.N,this.M,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,5,5,S,[new Cf(LT,this.O),new Cf(fH,this.data),new Cf(Xo,this.Ib),new Cf(EQ,this.N),new Cf(Nq,this.M)],null),this.v))};m.S=function(a,b){return new lW(this.O,this.data,this.Ib,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; function mW(a,b,c,d,e,f,h,k){this.O=a;this.type=b;this.Y=c;this.N=d;this.M=e;this.F=f;this.v=h;this.D=k;this.B=2230716170;this.H=139264}m=mW.prototype;m.ea=function(a,b){return this.I(null,b,null)};m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "type-tag":return this.O;case "type":return this.type;case "logical-block":return this.Y;case "start-pos":return this.N;case "end-pos":return this.M;default:return Yd.j(this.v,b,c)}}; -m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)};m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.nl-t{",", ","}",c,O.g(new R(null,5,5,S,[new R(null,2,5,S,[JT,this.O],null),new R(null,2,5,S,[VF,this.type],null),new R(null,2,5,S,[sO,this.Y],null),new R(null,2,5,S,[AQ,this.N],null),new R(null,2,5,S,[Pq,this.M],null)],null),this.v))}; -m.Ba=function(){return new hk(this,5,new R(null,5,5,S,[JT,VF,sO,AQ,Pq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 5+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-1640656800^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.type,b.type)&&A.g(this.Y,b.Y)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)}; -m.kb=function(a,b){return Af(new El(null,new n(null,5,[Pq,null,VF,null,sO,null,JT,null,AQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new mW(this.O,this.type,this.Y,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "type":case "logical-block":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(JT,b):nh.call(null,JT,b))?new mW(c,this.type,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(VF,b):nh.call(null,VF,b))?new mW(this.O,c,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(sO,b):nh.call(null,sO,b))?new mW(this.O,this.type,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(AQ,b):nh.call(null,AQ,b))?new mW(this.O,this.type,this.Y,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Pq,b):nh.call(null,Pq,b))?new mW(this.O,this.type,this.Y,this.N,c,this.F, -this.v,null):new mW(this.O,this.type,this.Y,this.N,this.M,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,5,5,S,[new Cf(JT,this.O),new Cf(VF,this.type),new Cf(sO,this.Y),new Cf(AQ,this.N),new Cf(Pq,this.M)],null),this.v))};m.S=function(a,b){return new mW(this.O,this.type,this.Y,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; +m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)};m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.nl-t{",", ","}",c,O.g(new R(null,5,5,S,[new R(null,2,5,S,[LT,this.O],null),new R(null,2,5,S,[VF,this.type],null),new R(null,2,5,S,[rO,this.Y],null),new R(null,2,5,S,[EQ,this.N],null),new R(null,2,5,S,[Nq,this.M],null)],null),this.v))}; +m.Ba=function(){return new hk(this,5,new R(null,5,5,S,[LT,VF,rO,EQ,Nq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 5+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-1640656800^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.type,b.type)&&A.g(this.Y,b.Y)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)}; +m.kb=function(a,b){return Af(new El(null,new n(null,5,[Nq,null,VF,null,rO,null,LT,null,EQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new mW(this.O,this.type,this.Y,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "type":case "logical-block":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; +m.ca=function(a,b,c){return p(nh.g?nh.g(LT,b):nh.call(null,LT,b))?new mW(c,this.type,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(VF,b):nh.call(null,VF,b))?new mW(this.O,c,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(rO,b):nh.call(null,rO,b))?new mW(this.O,this.type,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(EQ,b):nh.call(null,EQ,b))?new mW(this.O,this.type,this.Y,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Nq,b):nh.call(null,Nq,b))?new mW(this.O,this.type,this.Y,this.N,c,this.F, +this.v,null):new mW(this.O,this.type,this.Y,this.N,this.M,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,5,5,S,[new Cf(LT,this.O),new Cf(VF,this.type),new Cf(rO,this.Y),new Cf(EQ,this.N),new Cf(Nq,this.M)],null),this.v))};m.S=function(a,b){return new mW(this.O,this.type,this.Y,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; function nW(a,b,c,d,e,f,h){this.O=a;this.Y=b;this.N=c;this.M=d;this.F=e;this.v=f;this.D=h;this.B=2230716170;this.H=139264}m=nW.prototype;m.ea=function(a,b){return this.I(null,b,null)};m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "type-tag":return this.O;case "logical-block":return this.Y;case "start-pos":return this.N;case "end-pos":return this.M;default:return Yd.j(this.v,b,c)}}; -m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)};m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.start-block-t{",", ","}",c,O.g(new R(null,4,5,S,[new R(null,2,5,S,[JT,this.O],null),new R(null,2,5,S,[sO,this.Y],null),new R(null,2,5,S,[AQ,this.N],null),new R(null,2,5,S,[Pq,this.M],null)],null),this.v))}; -m.Ba=function(){return new hk(this,4,new R(null,4,5,S,[JT,sO,AQ,Pq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 4+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-414877272^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.Y,b.Y)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)}; -m.kb=function(a,b){return Af(new El(null,new n(null,4,[Pq,null,sO,null,JT,null,AQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new nW(this.O,this.Y,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "logical-block":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(JT,b):nh.call(null,JT,b))?new nW(c,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(sO,b):nh.call(null,sO,b))?new nW(this.O,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(AQ,b):nh.call(null,AQ,b))?new nW(this.O,this.Y,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Pq,b):nh.call(null,Pq,b))?new nW(this.O,this.Y,this.N,c,this.F,this.v,null):new nW(this.O,this.Y,this.N,this.M,this.F,Ve.j(this.v,b,c),null)}; -m.W=function(){return C(O.g(new R(null,4,5,S,[new Cf(JT,this.O),new Cf(sO,this.Y),new Cf(AQ,this.N),new Cf(Pq,this.M)],null),this.v))};m.S=function(a,b){return new nW(this.O,this.Y,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function oW(a,b,c,d,e,f,h){this.O=a;this.Y=b;this.N=c;this.M=d;this.F=e;this.v=f;this.D=h;this.B=2230716170;this.H=139264}m=oW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; +m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)};m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.start-block-t{",", ","}",c,O.g(new R(null,4,5,S,[new R(null,2,5,S,[LT,this.O],null),new R(null,2,5,S,[rO,this.Y],null),new R(null,2,5,S,[EQ,this.N],null),new R(null,2,5,S,[Nq,this.M],null)],null),this.v))}; +m.Ba=function(){return new hk(this,4,new R(null,4,5,S,[LT,rO,EQ,Nq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 4+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-414877272^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.Y,b.Y)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)}; +m.kb=function(a,b){return Af(new El(null,new n(null,4,[Nq,null,rO,null,LT,null,EQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new nW(this.O,this.Y,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "logical-block":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; +m.ca=function(a,b,c){return p(nh.g?nh.g(LT,b):nh.call(null,LT,b))?new nW(c,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(rO,b):nh.call(null,rO,b))?new nW(this.O,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(EQ,b):nh.call(null,EQ,b))?new nW(this.O,this.Y,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Nq,b):nh.call(null,Nq,b))?new nW(this.O,this.Y,this.N,c,this.F,this.v,null):new nW(this.O,this.Y,this.N,this.M,this.F,Ve.j(this.v,b,c),null)}; +m.W=function(){return C(O.g(new R(null,4,5,S,[new Cf(LT,this.O),new Cf(rO,this.Y),new Cf(EQ,this.N),new Cf(Nq,this.M)],null),this.v))};m.S=function(a,b){return new nW(this.O,this.Y,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function oW(a,b,c,d,e,f,h){this.O=a;this.Y=b;this.N=c;this.M=d;this.F=e;this.v=f;this.D=h;this.B=2230716170;this.H=139264}m=oW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "type-tag":return this.O;case "logical-block":return this.Y;case "start-pos":return this.N;case "end-pos":return this.M;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.end-block-t{",", ","}",c,O.g(new R(null,4,5,S,[new R(null,2,5,S,[JT,this.O],null),new R(null,2,5,S,[sO,this.Y],null),new R(null,2,5,S,[AQ,this.N],null),new R(null,2,5,S,[Pq,this.M],null)],null),this.v))};m.Ba=function(){return new hk(this,4,new R(null,4,5,S,[JT,sO,AQ,Pq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 4+Ce(this.v)}; -m.U=function(){var a=this.D;return null!=a?a:this.D=a=1365867980^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.Y,b.Y)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,4,[Pq,null,sO,null,JT,null,AQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new oW(this.O,this.Y,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.end-block-t{",", ","}",c,O.g(new R(null,4,5,S,[new R(null,2,5,S,[LT,this.O],null),new R(null,2,5,S,[rO,this.Y],null),new R(null,2,5,S,[EQ,this.N],null),new R(null,2,5,S,[Nq,this.M],null)],null),this.v))};m.Ba=function(){return new hk(this,4,new R(null,4,5,S,[LT,rO,EQ,Nq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 4+Ce(this.v)}; +m.U=function(){var a=this.D;return null!=a?a:this.D=a=1365867980^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.Y,b.Y)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,4,[Nq,null,rO,null,LT,null,EQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new oW(this.O,this.Y,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)}; m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "logical-block":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(JT,b):nh.call(null,JT,b))?new oW(c,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(sO,b):nh.call(null,sO,b))?new oW(this.O,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(AQ,b):nh.call(null,AQ,b))?new oW(this.O,this.Y,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Pq,b):nh.call(null,Pq,b))?new oW(this.O,this.Y,this.N,c,this.F,this.v,null):new oW(this.O,this.Y,this.N,this.M,this.F,Ve.j(this.v,b,c),null)}; -m.W=function(){return C(O.g(new R(null,4,5,S,[new Cf(JT,this.O),new Cf(sO,this.Y),new Cf(AQ,this.N),new Cf(Pq,this.M)],null),this.v))};m.S=function(a,b){return new oW(this.O,this.Y,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function pW(a,b,c,d,e,f,h,k,l){this.O=a;this.Y=b;this.Cb=c;this.offset=d;this.N=e;this.M=f;this.F=h;this.v=k;this.D=l;this.B=2230716170;this.H=139264}m=pW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; +m.ca=function(a,b,c){return p(nh.g?nh.g(LT,b):nh.call(null,LT,b))?new oW(c,this.Y,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(rO,b):nh.call(null,rO,b))?new oW(this.O,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(EQ,b):nh.call(null,EQ,b))?new oW(this.O,this.Y,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Nq,b):nh.call(null,Nq,b))?new oW(this.O,this.Y,this.N,c,this.F,this.v,null):new oW(this.O,this.Y,this.N,this.M,this.F,Ve.j(this.v,b,c),null)}; +m.W=function(){return C(O.g(new R(null,4,5,S,[new Cf(LT,this.O),new Cf(rO,this.Y),new Cf(EQ,this.N),new Cf(Nq,this.M)],null),this.v))};m.S=function(a,b){return new oW(this.O,this.Y,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function pW(a,b,c,d,e,f,h,k,l){this.O=a;this.Y=b;this.Cb=c;this.offset=d;this.N=e;this.M=f;this.F=h;this.v=k;this.D=l;this.B=2230716170;this.H=139264}m=pW.prototype;m.ea=function(a,b){return this.I(null,b,null)}; m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "type-tag":return this.O;case "logical-block":return this.Y;case "relative-to":return this.Cb;case "offset":return this.offset;case "start-pos":return this.N;case "end-pos":return this.M;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.indent-t{",", ","}",c,O.g(new R(null,6,5,S,[new R(null,2,5,S,[JT,this.O],null),new R(null,2,5,S,[sO,this.Y],null),new R(null,2,5,S,[ep,this.Cb],null),new R(null,2,5,S,[YH,this.offset],null),new R(null,2,5,S,[AQ,this.N],null),new R(null,2,5,S,[Pq,this.M],null)],null),this.v))};m.Ba=function(){return new hk(this,6,new R(null,6,5,S,[JT,sO,ep,YH,AQ,Pq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.indent-t{",", ","}",c,O.g(new R(null,6,5,S,[new R(null,2,5,S,[LT,this.O],null),new R(null,2,5,S,[rO,this.Y],null),new R(null,2,5,S,[ep,this.Cb],null),new R(null,2,5,S,[ZH,this.offset],null),new R(null,2,5,S,[EQ,this.N],null),new R(null,2,5,S,[Nq,this.M],null)],null),this.v))};m.Ba=function(){return new hk(this,6,new R(null,6,5,S,[LT,rO,ep,ZH,EQ,Nq],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F}; m.Z=function(){return 6+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-1602780238^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.O,b.O)&&A.g(this.Y,b.Y)&&A.g(this.Cb,b.Cb)&&A.g(this.offset,b.offset)&&A.g(this.N,b.N)&&A.g(this.M,b.M)&&A.g(this.v,b.v)}; -m.kb=function(a,b){return Af(new El(null,new n(null,6,[YH,null,Pq,null,ep,null,sO,null,JT,null,AQ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new pW(this.O,this.Y,this.Cb,this.offset,this.N,this.M,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "type-tag":case "logical-block":case "relative-to":case "offset":case "start-pos":case "end-pos":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(JT,b):nh.call(null,JT,b))?new pW(c,this.Y,this.Cb,this.offset,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(sO,b):nh.call(null,sO,b))?new pW(this.O,c,this.Cb,this.offset,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(ep,b):nh.call(null,ep,b))?new pW(this.O,this.Y,c,this.offset,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(YH,b):nh.call(null,YH,b))?new pW(this.O,this.Y,this.Cb,c,this.N,this.M,this.F,this.v,null):p(nh.g?nh.g(AQ,b):nh.call(null,AQ,b))?new pW(this.O, -this.Y,this.Cb,this.offset,c,this.M,this.F,this.v,null):p(nh.g?nh.g(Pq,b):nh.call(null,Pq,b))?new pW(this.O,this.Y,this.Cb,this.offset,this.N,c,this.F,this.v,null):new pW(this.O,this.Y,this.Cb,this.offset,this.N,this.M,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,6,5,S,[new Cf(JT,this.O),new Cf(sO,this.Y),new Cf(ep,this.Cb),new Cf(YH,this.offset),new Cf(AQ,this.N),new Cf(Pq,this.M)],null),this.v))}; -m.S=function(a,b){return new pW(this.O,this.Y,this.Cb,this.offset,this.N,this.M,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};var qW=function(){var a=Ei.h(Wh),b=Ei.h(Wh),c=Ei.h(Wh),d=Ei.h(Wh),e=Yd.j(Wh,bD,Dn.s?Dn.s():Dn.call(null));return new Xn(Zd.g("cljs.pprint","write-token"),function(f,h){return JT.h(h)},bq,e,a,b,c,d)}(); -qW.la(null,ft,function(a,b){var c=Ou.h(w(w(a)));p(c)&&(c.h?c.h(fE):c.call(null,fE));b=sO.h(b);c=Fx.h(b);p(c)&&ad(vT.h(w(w(a))),c);a=gW(vT.h(w(w(a))),oU);Gi(nR.h(b),a);return Gi(hv.h(b),a)});qW.la(null,gP,function(a,b){var c=Ou.h(w(w(a)));p(c)&&(c.h?c.h(Fr):c.call(null,Fr));b=kz.h(sO.h(b));return p(b)?ad(vT.h(w(w(a))),b):null}); -qW.la(null,SL,function(a,b){var c=sO.h(b),d=hv.h(c),e=YH.h(b);b=ep.h(b);if(p(A.g?A.g(rF,b):A.call(null,rF,b)))a=w(nR.h(c));else if(p(A.g?A.g(Ip,b):A.call(null,Ip,b)))a=gW(vT.h(w(w(a))),oU);else throw Error(["No matching clause: ",q.h(b)].join(""));return Gi(d,e+a)});qW.la(null,OK,function(a,b){return ad(vT.h(w(w(a))),gH.h(b))}); -qW.la(null,tz,function(a,b){var c=A.g(VF.h(b),tA);c||(c=(c=!A.g(VF.h(b),MQ))?w(HA.h(sO.h(b))):c);p(c)?rW.g?rW.g(a,b):rW.call(null,a,b):(b=Xo.h(w(w(a))),p(b)&&ad(vT.h(w(w(a))),b));return Hi.u(w(a),Ve,Xo,null)}); -function sW(a,b,c){b=C(b);for(var d=null,e=0,f=0;;)if(f=e-d)?uW(a,b,c):d:e:d} -var wW=function(){var a=Ei.h(Wh),b=Ei.h(Wh),c=Ei.h(Wh),d=Ei.h(Wh),e=Yd.j(Wh,bD,Dn.s?Dn.s():Dn.call(null));return new Xn(Zd.g("cljs.pprint","emit-nl?"),function(f){return VF.h(f)},bq,e,a,b,c,d)}();wW.la(null,QG,function(a,b,c){a=sO.h(a);return uW(b,a,c)});wW.la(null,Cp,function(a,b,c){a=sO.h(a);return vW(b,a,c)});wW.la(null,MQ,function(a,b,c,d){a=sO.h(a);var e=w(hp.h(a));return p(e)?e:(d=!tW(b,d))?d:vW(b,a,c)});wW.la(null,tA,function(){return!0}); -function Tca(a){var b=u(a),c=sO.h(b);b=C(Vl.g(function(d){return!(A.g(JT.h(d),tz)&&kW(sO.h(d),c))},v(a)));return new R(null,2,5,S,[b,C(Oi.g(Ce(b)+1,a))],null)}function Uca(a){var b=u(a),c=sO.h(b);return C(Vl.g(function(d){var e=sO.h(d);return!(A.g(JT.h(d),tz)&&(A.g(e,c)||kW(e,c)))},v(a)))} -function rW(a,b){ad(vT.h(w(w(a))),"\n");Hi.u(w(a),Ve,Xo,null);b=sO.h(b);var c=dr.h(b);p(c)&&ad(vT.h(w(w(a))),c);c=Kb.g(q,Wi.g(w(hv.h(b))-Ce(c)," "));ad(vT.h(w(w(a))),c);a:for(Gi(hp.h(b),!0),Gi(HA.h(b),!0),a=cT.h(b);;)if(p(a))Gi(HA.h(a),!0),Gi(hp.h(a),!0),a=cT.h(a);else break a;return null}function Vca(a){var b=C(Vl.g(function(c){return!A.g(JT.h(c),tz)},a));return new R(null,2,5,S,[b,C(Oi.g(Ce(b),a))],null)} -var xW=function xW(a,b){var d=Vca(b);b=D.j(d,0,null);var e=D.j(d,1,null);p(b)&&sW(a,b,!1);if(p(e)){d=Tca(e);b=D.j(d,0,null);d=D.j(d,1,null);var f=u(e),h=wW.u(f,a,b,Uca(e));p(h)&&(rW(a,f),e=v(e));tW(a,e)?a=e:(e=xW.g?xW.g(a,b):xW.call(null,a,b),A.g(e,b)?(sW(a,b,!1),a=d):a=jj.g(Se,O.g(e,d)));return a}return null};function yW(a){for(var b=Wu.h(w(w(a)));;){Hi.u(w(a),Ve,Wu,jj.g(Se,b));if(tW(a,b))return null;var c=xW(a,b);if(b!==c)b=c;else return null}} -function zW(a,b){Hi.u(w(a),Ve,Wu,Re.g(Wu.h(w(w(a))),b));return tW(a,Wu.h(w(w(a))))?null:yW(a)}function AW(a){var b=Xo.h(w(w(a)));return p(b)?(ad(vT.h(w(w(a))),b),Hi.u(w(a),Ve,Xo,null)):null} -function BW(a,b){var c=HU.j(b,"\n",-1);if(A.g(Ce(c),1))return b;b=dr.h(u(gs.h(w(w(a)))));var d=u(c);if(A.g(DJ,ku.h(w(w(a))))){var e=bU.h(w(w(a))),f=e+Ce(d);Hi.u(w(a),Ve,bU,f);zW(a,new lW(OK,d,null,e,f,null,null,null));yW(a);d=Wu.h(w(w(a)));p(d)&&(sW(a,d,!0),Hi.u(w(a),Ve,Wu,Se))}else AW(a),ad(vT.h(w(w(a))),d);ad(vT.h(w(w(a))),"\n");d=C(v(Pl(c)));e=null;for(var h=f=0;;)if(h=e-d)?uW(a,b,c):d:e:d} +var wW=function(){var a=Ei.h(Wh),b=Ei.h(Wh),c=Ei.h(Wh),d=Ei.h(Wh),e=Yd.j(Wh,bD,Dn.s?Dn.s():Dn.call(null));return new Xn(Zd.g("cljs.pprint","emit-nl?"),function(f){return VF.h(f)},aq,e,a,b,c,d)}();wW.la(null,QG,function(a,b,c){a=rO.h(a);return uW(b,a,c)});wW.la(null,Cp,function(a,b,c){a=rO.h(a);return vW(b,a,c)});wW.la(null,RQ,function(a,b,c,d){a=rO.h(a);var e=w(hp.h(a));return p(e)?e:(d=!tW(b,d))?d:vW(b,a,c)});wW.la(null,tA,function(){return!0}); +function Tca(a){var b=u(a),c=rO.h(b);b=C(Vl.g(function(d){return!(A.g(LT.h(d),tz)&&kW(rO.h(d),c))},v(a)));return new R(null,2,5,S,[b,C(Oi.g(Ce(b)+1,a))],null)}function Uca(a){var b=u(a),c=rO.h(b);return C(Vl.g(function(d){var e=rO.h(d);return!(A.g(LT.h(d),tz)&&(A.g(e,c)||kW(e,c)))},v(a)))} +function rW(a,b){ad(xT.h(w(w(a))),"\n");Hi.u(w(a),Ve,Xo,null);b=rO.h(b);var c=br.h(b);p(c)&&ad(xT.h(w(w(a))),c);c=Kb.g(q,Wi.g(w(gv.h(b))-Ce(c)," "));ad(xT.h(w(w(a))),c);a:for(Gi(hp.h(b),!0),Gi(HA.h(b),!0),a=fT.h(b);;)if(p(a))Gi(HA.h(a),!0),Gi(hp.h(a),!0),a=fT.h(a);else break a;return null}function Vca(a){var b=C(Vl.g(function(c){return!A.g(LT.h(c),tz)},a));return new R(null,2,5,S,[b,C(Oi.g(Ce(b),a))],null)} +var xW=function xW(a,b){var d=Vca(b);b=D.j(d,0,null);var e=D.j(d,1,null);p(b)&&sW(a,b,!1);if(p(e)){d=Tca(e);b=D.j(d,0,null);d=D.j(d,1,null);var f=u(e),h=wW.u(f,a,b,Uca(e));p(h)&&(rW(a,f),e=v(e));tW(a,e)?a=e:(e=xW.g?xW.g(a,b):xW.call(null,a,b),A.g(e,b)?(sW(a,b,!1),a=d):a=jj.g(Se,O.g(e,d)));return a}return null};function yW(a){for(var b=Vu.h(w(w(a)));;){Hi.u(w(a),Ve,Vu,jj.g(Se,b));if(tW(a,b))return null;var c=xW(a,b);if(b!==c)b=c;else return null}} +function zW(a,b){Hi.u(w(a),Ve,Vu,Re.g(Vu.h(w(w(a))),b));return tW(a,Vu.h(w(w(a))))?null:yW(a)}function AW(a){var b=Xo.h(w(w(a)));return p(b)?(ad(xT.h(w(w(a))),b),Hi.u(w(a),Ve,Xo,null)):null} +function BW(a,b){var c=HU.j(b,"\n",-1);if(A.g(Ce(c),1))return b;b=br.h(u(es.h(w(w(a)))));var d=u(c);if(A.g(CJ,iu.h(w(w(a))))){var e=cU.h(w(w(a))),f=e+Ce(d);Hi.u(w(a),Ve,cU,f);zW(a,new lW(QK,d,null,e,f,null,null,null));yW(a);d=Vu.h(w(w(a)));p(d)&&(sW(a,d,!0),Hi.u(w(a),Ve,Vu,Se))}else AW(a),ad(xT.h(w(w(a))),d);ad(xT.h(w(w(a))),"\n");d=C(v(Pl(c)));e=null;for(var h=f=0;;)if(h=ib:b);vb(IW)?$V.call(null,a):p(b)?ad(ab,"..."):(p(QW)&&(QW+=1),JW.call(null,a));return b}var TW=function TW(a){for(var c=[],d=arguments.length,e=0;;)if(e=jb:a}function WW(a){UW(a,new El(null,new n(null,4,[tA,null,Cp,null,MQ,null,QG,null],null),null));var b=ab;Hi.u(w(b),Ve,ku,DJ);var c=bU.h(w(w(b))),d=gs.h(w(w(b)));zW(b,new mW(tz,a,d,c,c,null,null,null))} -function XW(a,b){UW(a,new El(null,new n(null,2,[rF,null,Ip,null],null),null));var c=ab,d=gs.h(w(w(c)));if(A.g(ku.h(w(w(c))),Ku)){AW(c);var e=hv.h(d);if(p(A.g?A.g(rF,a):A.call(null,rF,a)))a=w(nR.h(d));else if(p(A.g?A.g(Ip,a):A.call(null,Ip,a)))a=gW(vT.h(w(w(c))),oU);else throw Error(["No matching clause: ",q.h(a)].join(""));Gi(e,b+a)}else e=bU.h(w(w(c))),zW(c,new pW(SL,d,a,b,e,e,null,null,null))} +TW.l=function(a,b){var c=zl.l(F([new n(null,1,[qP,!0],null),Kb.g(tl,b)]));b=OW;var d=LW,e=ib,f=jb,h=KW,k=FW,l=JW,g=IW,t=NW,r=eb,y=EW,B=MW,J=xT.g(c,OW),P=Vaa.g(c,LW),V=Pw.g(c,ib),ba=rR.g(c,jb),da=ML.g(c,KW),ha=BI.g(c,FW),na=Px.g(c,JW),oa=JS.g(c,IW),ma=fD.g(c,NW),M=nb.g(c,eb),E=FK.g(c,EW),N=jca.g(c,MW);OW=J;LW=P;ib=V;jb=ba;KW=da;FW=ha;JW=na;IW=oa;NW=ma;eb=M;EW=E;MW=N;try{var G=new Wa,I=Af(c,qP)?qP.h(c):!0,ea=!0===I||null==I?new Jd(G):I;if(p(IW)){var fa=vb(RW(ea));c=ab;ab=fa?DW(ea):ea;try{SW(a),fW()}finally{ab= +c}}else{fa=ab;ab=ea;try{$V.call(null,a)}finally{ab=fa}}!0===I&&vm(q.h(G));return null==I?q.h(G):null}finally{MW=B,EW=y,eb=r,NW=t,IW=g,JW=l,FW=k,KW=h,jb=f,ib=e,LW=d,OW=b}};TW.m=1;TW.o=function(a){var b=u(a);a=v(a);return this.l(b,a)};function Wca(a){var b=new Wa,c=ab;ab=new Jd(b);try{var d=ab,e=vb(RW(d)),f=ab;ab=e?DW(d):d;try{d=IW;IW=!0;try{SW(a)}finally{IW=d}A.g(0,gW(ab,pU))||ad(ab,"\n");fW()}finally{ab=f}vm(q.h(b))}finally{ab=c}} +function UW(a,b){if(vb(b.h?b.h(a):b.call(null,a)))throw Error(["Bad argument: ",q.h(a),". It must be one of ",q.h(b)].join(""));}function VW(){var a=jb;return p(a)?PW>=jb:a}function WW(a){UW(a,new El(null,new n(null,4,[tA,null,Cp,null,RQ,null,QG,null],null),null));var b=ab;Hi.u(w(b),Ve,iu,CJ);var c=cU.h(w(w(b))),d=es.h(w(w(b)));zW(b,new mW(tz,a,d,c,c,null,null,null))} +function XW(a,b){UW(a,new El(null,new n(null,2,[nF,null,Ip,null],null),null));var c=ab,d=es.h(w(w(c)));if(A.g(iu.h(w(w(c))),Ju)){AW(c);var e=gv.h(d);if(p(A.g?A.g(nF,a):A.call(null,nF,a)))a=w(qR.h(d));else if(p(A.g?A.g(Ip,a):A.call(null,Ip,a)))a=gW(xT.h(w(w(c))),pU);else throw Error(["No matching clause: ",q.h(a)].join(""));Gi(e,b+a)}else e=cU.h(w(w(c))),zW(c,new pW(SL,d,a,b,e,e,null,null,null))} function YW(a,b,c){b="string"===typeof b?ZW(b):b;c=$W(c);a:{var d=new Wa,e=vb(a)||!0===a?new Jd(d):a,f=aX(b)&&vb(RW(e))?p(RW(e))?e:DW(e):e,h=ab;ab=f;try{try{bX(b,c)}finally{e!==f&&bd(f)}var k=vb(a)?q.h(d):!0===a?vm(q.h(d)):null;break a}finally{ab=h}k=void 0}return k}var cX=null;function dX(a,b){a=[q.h(a),"\n",q.h(cX),"\n",q.h(Kb.g(q,Wi.g(b," "))),"^\n"].join("");throw Error(a);}function eX(a,b,c,d,e,f){this.seq=a;this.rest=b;this.pos=c;this.F=d;this.v=e;this.D=f;this.B=2230716170;this.H=139264} m=eX.prototype;m.ea=function(a,b){return this.I(null,b,null)};m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "seq":return this.seq;case "rest":return this.rest;case "pos":return this.pos;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.arg-navigator{",", ","}",c,O.g(new R(null,3,5,S,[new R(null,2,5,S,[oB,this.seq],null),new R(null,2,5,S,[Rx,this.rest],null),new R(null,2,5,S,[bU,this.pos],null)],null),this.v))};m.Ba=function(){return new hk(this,3,new R(null,3,5,S,[oB,Rx,bU],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 3+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-402038447^je(this)}; -m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.seq,b.seq)&&A.g(this.rest,b.rest)&&A.g(this.pos,b.pos)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,3,[bU,null,oB,null,Rx,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new eX(this.seq,this.rest,this.pos,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "seq":case "rest":case "pos":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(oB,b):nh.call(null,oB,b))?new eX(c,this.rest,this.pos,this.F,this.v,null):p(nh.g?nh.g(Rx,b):nh.call(null,Rx,b))?new eX(this.seq,c,this.pos,this.F,this.v,null):p(nh.g?nh.g(bU,b):nh.call(null,bU,b))?new eX(this.seq,this.rest,c,this.F,this.v,null):new eX(this.seq,this.rest,this.pos,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,3,5,S,[new Cf(oB,this.seq),new Cf(Rx,this.rest),new Cf(bU,this.pos)],null),this.v))}; -m.S=function(a,b){return new eX(this.seq,this.rest,this.pos,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function $W(a){a=C(a);return new eX(a,a,0,null,null,null)}function fX(a){var b=Rx.h(a);if(p(b))return new R(null,2,5,S,[u(b),new eX(oB.h(a),v(b),bU.h(a)+1,null,null,null)],null);throw Error("Not enough arguments for format definition");} -function gX(a){var b=fX(a);a=D.j(b,0,null);b=D.j(b,1,null);a="string"===typeof a?ZW(a):a;return new R(null,2,5,S,[a,b],null)}function hX(a,b){return b>=bU.h(a)?(b=bU.h(a)-b,iX.g?iX.g(a,b):iX.call(null,a,b)):new eX(oB.h(a),Oi.g(b,oB.h(a)),b,null,null,null)}function iX(a,b){var c=bU.h(a)+b;return 0>b?hX(a,c):new eX(oB.h(a),Oi.g(b,Rx.h(a)),c,null,null,null)}function jX(a,b,c,d,e,f,h){this.Lb=a;this.def=b;this.Za=c;this.offset=d;this.F=e;this.v=f;this.D=h;this.B=2230716170;this.H=139264}m=jX.prototype; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.arg-navigator{",", ","}",c,O.g(new R(null,3,5,S,[new R(null,2,5,S,[oB,this.seq],null),new R(null,2,5,S,[Qx,this.rest],null),new R(null,2,5,S,[cU,this.pos],null)],null),this.v))};m.Ba=function(){return new hk(this,3,new R(null,3,5,S,[oB,Qx,cU],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 3+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-402038447^je(this)}; +m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.seq,b.seq)&&A.g(this.rest,b.rest)&&A.g(this.pos,b.pos)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,3,[cU,null,oB,null,Qx,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new eX(this.seq,this.rest,this.pos,this.F,Zh(Ye.g(this.v,b)),null)};m.ab=function(a,b){switch(b instanceof z?b.X:null){case "seq":case "rest":case "pos":return!0;default:return Af(this.v,b)}}; +m.ca=function(a,b,c){return p(nh.g?nh.g(oB,b):nh.call(null,oB,b))?new eX(c,this.rest,this.pos,this.F,this.v,null):p(nh.g?nh.g(Qx,b):nh.call(null,Qx,b))?new eX(this.seq,c,this.pos,this.F,this.v,null):p(nh.g?nh.g(cU,b):nh.call(null,cU,b))?new eX(this.seq,this.rest,c,this.F,this.v,null):new eX(this.seq,this.rest,this.pos,this.F,Ve.j(this.v,b,c),null)};m.W=function(){return C(O.g(new R(null,3,5,S,[new Cf(oB,this.seq),new Cf(Qx,this.rest),new Cf(cU,this.pos)],null),this.v))}; +m.S=function(a,b){return new eX(this.seq,this.rest,this.pos,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)};function $W(a){a=C(a);return new eX(a,a,0,null,null,null)}function fX(a){var b=Qx.h(a);if(p(b))return new R(null,2,5,S,[u(b),new eX(oB.h(a),v(b),cU.h(a)+1,null,null,null)],null);throw Error("Not enough arguments for format definition");} +function gX(a){var b=fX(a);a=D.j(b,0,null);b=D.j(b,1,null);a="string"===typeof a?ZW(a):a;return new R(null,2,5,S,[a,b],null)}function hX(a,b){return b>=cU.h(a)?(b=cU.h(a)-b,iX.g?iX.g(a,b):iX.call(null,a,b)):new eX(oB.h(a),Oi.g(b,oB.h(a)),b,null,null,null)}function iX(a,b){var c=cU.h(a)+b;return 0>b?hX(a,c):new eX(oB.h(a),Oi.g(b,Qx.h(a)),c,null,null,null)}function jX(a,b,c,d,e,f,h){this.Lb=a;this.def=b;this.Za=c;this.offset=d;this.F=e;this.v=f;this.D=h;this.B=2230716170;this.H=139264}m=jX.prototype; m.ea=function(a,b){return this.I(null,b,null)};m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "func":return this.Lb;case "def":return this.def;case "params":return this.Za;case "offset":return this.offset;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.compiled-directive{",", ","}",c,O.g(new R(null,4,5,S,[new R(null,2,5,S,[iN,this.Lb],null),new R(null,2,5,S,[KR,this.def],null),new R(null,2,5,S,[FP,this.Za],null),new R(null,2,5,S,[YH,this.offset],null)],null),this.v))};m.Ba=function(){return new hk(this,4,new R(null,4,5,S,[iN,KR,FP,YH],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 4+Ce(this.v)}; -m.U=function(){var a=this.D;return null!=a?a:this.D=a=-829256337^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.Lb,b.Lb)&&A.g(this.def,b.def)&&A.g(this.Za,b.Za)&&A.g(this.offset,b.offset)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,4,[YH,null,iN,null,FP,null,KR,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new jX(this.Lb,this.def,this.Za,this.offset,this.F,Zh(Ye.g(this.v,b)),null)}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#cljs.pprint.compiled-directive{",", ","}",c,O.g(new R(null,4,5,S,[new R(null,2,5,S,[iN,this.Lb],null),new R(null,2,5,S,[MR,this.def],null),new R(null,2,5,S,[HP,this.Za],null),new R(null,2,5,S,[ZH,this.offset],null)],null),this.v))};m.Ba=function(){return new hk(this,4,new R(null,4,5,S,[iN,MR,HP,ZH],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 4+Ce(this.v)}; +m.U=function(){var a=this.D;return null!=a?a:this.D=a=-829256337^je(this)};m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.Lb,b.Lb)&&A.g(this.def,b.def)&&A.g(this.Za,b.Za)&&A.g(this.offset,b.offset)&&A.g(this.v,b.v)};m.kb=function(a,b){return Af(new El(null,new n(null,4,[ZH,null,iN,null,HP,null,MR,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new jX(this.Lb,this.def,this.Za,this.offset,this.F,Zh(Ye.g(this.v,b)),null)}; m.ab=function(a,b){switch(b instanceof z?b.X:null){case "func":case "def":case "params":case "offset":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(iN,b):nh.call(null,iN,b))?new jX(c,this.def,this.Za,this.offset,this.F,this.v,null):p(nh.g?nh.g(KR,b):nh.call(null,KR,b))?new jX(this.Lb,c,this.Za,this.offset,this.F,this.v,null):p(nh.g?nh.g(FP,b):nh.call(null,FP,b))?new jX(this.Lb,this.def,c,this.offset,this.F,this.v,null):p(nh.g?nh.g(YH,b):nh.call(null,YH,b))?new jX(this.Lb,this.def,this.Za,c,this.F,this.v,null):new jX(this.Lb,this.def,this.Za,this.offset,this.F,Ve.j(this.v,b,c),null)}; -m.W=function(){return C(O.g(new R(null,4,5,S,[new Cf(iN,this.Lb),new Cf(KR,this.def),new Cf(FP,this.Za),new Cf(YH,this.offset)],null),this.v))};m.S=function(a,b){return new jX(this.Lb,this.def,this.Za,this.offset,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; -function Xca(a,b){var c=D.j(a,0,null);a=D.j(a,1,null);var d=D.j(a,0,null);a=D.j(a,1,null);d=Af(new El(null,new n(null,2,[yM,null,qz,null],null),null),c)?new R(null,2,5,S,[d,b],null):A.g(d,Mu)?fX(b):A.g(d,fs)?new R(null,2,5,S,[Ce(Rx.h(b)),b],null):new R(null,2,5,S,[d,b],null);b=D.j(d,0,null);d=D.j(d,1,null);return new R(null,2,5,S,[new R(null,2,5,S,[c,new R(null,2,5,S,[b,a],null)],null),d],null)} +m.ca=function(a,b,c){return p(nh.g?nh.g(iN,b):nh.call(null,iN,b))?new jX(c,this.def,this.Za,this.offset,this.F,this.v,null):p(nh.g?nh.g(MR,b):nh.call(null,MR,b))?new jX(this.Lb,c,this.Za,this.offset,this.F,this.v,null):p(nh.g?nh.g(HP,b):nh.call(null,HP,b))?new jX(this.Lb,this.def,c,this.offset,this.F,this.v,null):p(nh.g?nh.g(ZH,b):nh.call(null,ZH,b))?new jX(this.Lb,this.def,this.Za,c,this.F,this.v,null):new jX(this.Lb,this.def,this.Za,this.offset,this.F,Ve.j(this.v,b,c),null)}; +m.W=function(){return C(O.g(new R(null,4,5,S,[new Cf(iN,this.Lb),new Cf(MR,this.def),new Cf(HP,this.Za),new Cf(ZH,this.offset)],null),this.v))};m.S=function(a,b){return new jX(this.Lb,this.def,this.Za,this.offset,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; +function Xca(a,b){var c=D.j(a,0,null);a=D.j(a,1,null);var d=D.j(a,0,null);a=D.j(a,1,null);d=Af(new El(null,new n(null,2,[wM,null,qz,null],null),null),c)?new R(null,2,5,S,[d,b],null):A.g(d,Lu)?fX(b):A.g(d,ds)?new R(null,2,5,S,[Ce(Qx.h(b)),b],null):new R(null,2,5,S,[d,b],null);b=D.j(d,0,null);d=D.j(d,1,null);return new R(null,2,5,S,[new R(null,2,5,S,[c,new R(null,2,5,S,[b,a],null)],null),d],null)} function kX(a,b){b=cW(Xca,b,a);a=D.j(b,0,null);b=D.j(b,1,null);return new R(null,2,5,S,[jj.g(Wh,a),b],null)}var Yca=new n(null,3,[2,"#b",8,"#o",16,"#x"],null); -function lX(a,b,c){c=fX(c);var d=D.j(c,0,null);c=D.j(c,1,null);if(yf(d))if(A.g(OW,10))var e=[q.h(d),p(NW)?".":null].join("");else{e=q;var f=e.h;if(p(NW)){var h=Yd.g(Yca,OW);h=p(h)?h:["#",q.h(OW),"r"].join("")}else h=null;e=[f.call(e,h),q.h(mX(OW,d))].join("")}else e=null;a=p(e)?e:a.h?a.h(d):a.call(null,d);d=a.length;e=d+pO.h(b);e=e>=fI.h(b)?e:e+(Rg(fI.h(b)-e-1,LB.h(b))+1)*LB.h(b);d=Kb.g(q,Wi.g(e-d,HH.h(b)));p(qz.h(b))?ZV.l(F([[q.h(d),q.h(a)].join("")])):ZV.l(F([[q.h(a),q.h(d)].join("")]));return c} +function lX(a,b,c){c=fX(c);var d=D.j(c,0,null);c=D.j(c,1,null);if(yf(d))if(A.g(OW,10))var e=[q.h(d),p(NW)?".":null].join("");else{e=q;var f=e.h;if(p(NW)){var h=Yd.g(Yca,OW);h=p(h)?h:["#",q.h(OW),"r"].join("")}else h=null;e=[f.call(e,h),q.h(mX(OW,d))].join("")}else e=null;a=p(e)?e:a.h?a.h(d):a.call(null,d);d=a.length;e=d+oO.h(b);e=e>=gI.h(b)?e:e+(Rg(gI.h(b)-e-1,MB.h(b))+1)*MB.h(b);d=Kb.g(q,Wi.g(e-d,HH.h(b)));p(qz.h(b))?ZV.l(F([[q.h(d),q.h(a)].join("")])):ZV.l(F([[q.h(a),q.h(d)].join("")]));return c} function nX(a,b){return jh(u(dW(function(c){return 0c?fg(bW("0")+c):fg(bW("a")+(c-10))},nX(a,b)))}function Zca(a,b){return jh(u(dW(function(c){return new R(null,2,5,S,[C(jh(Ni.g(a,c))),C(Oi.g(a,c))],null)},jh(b))))} -function oX(a,b,c){c=fX(c);var d=D.j(c,0,null);c=D.j(c,1,null);if(yf(d)||"number"===typeof d&&!isNaN(d)&&Infinity!==d&&parseFloat(d)!==parseInt(d,10)&&A.g(d,Math.floor(d))){var e=0>d,f=mX(a,e?-d:d);a=p(yM.h(b))?function(){var h=ri.g(function(l){return Kb.g(q,l)},Zca(UJ.h(b),f)),k=Wi.g(Ce(h),jS.h(b));return Kb.g(q,v(bj.g(k,h)))}():f;a=e?["-",q.h(a)].join(""):p(qz.h(b))?["+",q.h(a)].join(""):a;a=a.lengthd,f=mX(a,e?-d:d);a=p(wM.h(b))?function(){var h=ri.g(function(l){return Kb.g(q,l)},Zca(TJ.h(b),f)),k=Wi.g(Ce(h),jS.h(b));return Kb.g(q,v(bj.g(k,h)))}():f;a=e?["-",q.h(a)].join(""):p(qz.h(b))?["+",q.h(a)].join(""):a;a=a.lengtha)var f=D.g(pX,a);else{f=Rg(a,10);var h=Sg(a,10);f=[q.h(0c){var d=nX(10,c);c=Se;for(var e=Ce(d)-1;;)if(ff(d)){ZV.l(F([Kb.g(q,c)]));break}else{var f=u(d);c=A.g(0,f)?c:Re.g(c,D.g(D.g(a,e),f-1));--e;d=v(d)}}else oX(10,new n(null,5,[fI,0,HH," ",jS,",",UJ,3,yM,!0],null),$W(new R(null,1,5,S,[c],null)));return b}var cda=new n(null,5,[8,"Backspace",9,"Tab",10,"Newline",13,"Return",32,"Space"],null); +3,5,S,["M","MM","MMM"],null)],null);function vX(a,b){b=fX(b);var c=D.j(b,0,null);b=D.j(b,1,null);if("number"===typeof c&&0c){var d=nX(10,c);c=Se;for(var e=Ce(d)-1;;)if(ff(d)){ZV.l(F([Kb.g(q,c)]));break}else{var f=u(d);c=A.g(0,f)?c:Re.g(c,D.g(D.g(a,e),f-1));--e;d=v(d)}}else oX(10,new n(null,5,[gI,0,HH," ",jS,",",TJ,3,wM,!0],null),$W(new R(null,1,5,S,[c],null)));return b}var cda=new n(null,5,[8,"Backspace",9,"Tab",10,"Newline",13,"Return",32,"Space"],null); function dda(a,b){a=fX(b);b=D.j(a,0,null);a=D.j(a,1,null);var c=bW(b);b=c&127;c&=128;var d=Yd.g(cda,b);0b?["Control-",q.h(fg(b+64))].join(""):A.g(b,127)?"Control-?":fg(b)]));return a} -function eda(a,b){var c=fX(b);b=D.j(c,0,null);c=D.j(c,1,null);a=Ww.h(a);if(p(A.g?A.g("o",a):A.call(null,"o",a)))YW(!0,"\\o~3,'0o",F([bW(b)]));else if(p(A.g?A.g("u",a):A.call(null,"u",a)))YW(!0,"\\u~4,'0x",F([bW(b)]));else if(p(A.g?A.g(null,a):A.call(null,null,a)))ad(ab,p(A.g?A.g("\b",b):A.call(null,"\b",b))?"\\backspace":p(A.g?A.g(" ",b):A.call(null," ",b))?"\\space":p(A.g?A.g("\t",b):A.call(null,"\t",b))?"\\tab":p(A.g?A.g("\n",b):A.call(null,"\n",b))?"\\newline":p(A.g?A.g("\f",b):A.call(null,"\f", -b))?"\\formfeed":p(A.g?A.g("\r",b):A.call(null,"\r",b))?"\\return":p(A.g?A.g('"',b):A.call(null,'"',b))?'\\"':p(A.g?A.g("\\",b):A.call(null,"\\",b))?"\\\\":["\\",q.h(b)].join(""));else throw Error(["No matching clause: ",q.h(a)].join(""));return c}function fda(a,b){b=fX(b);a=D.j(b,0,null);b=D.j(b,1,null);ZV.l(F([a]));return b}function wX(a){a=u(a);return A.g(VB,a)||A.g(ay,a)} -function xX(a,b,c){return Le(cW(function(d,e){if(wX(e))return new R(null,2,5,S,[null,e],null);e=kX(FP.h(d),e);var f=D.j(e,0,null);e=D.j(e,1,null);var h=eW(f);f=D.j(h,0,null);h=D.j(h,1,null);f=Ve.j(f,GJ,c);return new R(null,2,5,S,[null,Kb.g(iN.h(d),new R(null,3,5,S,[f,e,h],null))],null)},b,a))} +function eda(a,b){var c=fX(b);b=D.j(c,0,null);c=D.j(c,1,null);a=Tw.h(a);if(p(A.g?A.g("o",a):A.call(null,"o",a)))YW(!0,"\\o~3,'0o",F([bW(b)]));else if(p(A.g?A.g("u",a):A.call(null,"u",a)))YW(!0,"\\u~4,'0x",F([bW(b)]));else if(p(A.g?A.g(null,a):A.call(null,null,a)))ad(ab,p(A.g?A.g("\b",b):A.call(null,"\b",b))?"\\backspace":p(A.g?A.g(" ",b):A.call(null," ",b))?"\\space":p(A.g?A.g("\t",b):A.call(null,"\t",b))?"\\tab":p(A.g?A.g("\n",b):A.call(null,"\n",b))?"\\newline":p(A.g?A.g("\f",b):A.call(null,"\f", +b))?"\\formfeed":p(A.g?A.g("\r",b):A.call(null,"\r",b))?"\\return":p(A.g?A.g('"',b):A.call(null,'"',b))?'\\"':p(A.g?A.g("\\",b):A.call(null,"\\",b))?"\\\\":["\\",q.h(b)].join(""));else throw Error(["No matching clause: ",q.h(a)].join(""));return c}function fda(a,b){b=fX(b);a=D.j(b,0,null);b=D.j(b,1,null);ZV.l(F([a]));return b}function wX(a){a=u(a);return A.g(WB,a)||A.g($x,a)} +function xX(a,b,c){return Le(cW(function(d,e){if(wX(e))return new R(null,2,5,S,[null,e],null);e=kX(HP.h(d),e);var f=D.j(e,0,null);e=D.j(e,1,null);var h=eW(f);f=D.j(h,0,null);h=D.j(h,1,null);f=Ve.j(f,FJ,c);return new R(null,2,5,S,[null,Kb.g(iN.h(d),new R(null,3,5,S,[f,e,h],null))],null)},b,a))} function yX(a){a=GU(q.h(a));var b=a.indexOf("e"),c=a.indexOf(".");a=0>b?0>c?new R(null,2,5,S,[a,q.h(a.length-1)],null):new R(null,2,5,S,[[fh.j(a,0,c),fh.g(a,c+1)].join(""),q.h(c-1)],null):0>c?new R(null,2,5,S,[fh.j(a,0,b),fh.g(a,b+1)],null):new R(null,2,5,S,[[fh.j(a,0,1),fh.j(a,2,b)].join(""),fh.g(a,b+1)],null);b=D.j(a,0,null);a=D.j(a,1,null);a:if(c=Ce(b),0c){b="";break a}if(A.g(D.g(b,c),"0"))--c;else{b=fh.j(b,0,c+1);break a}}a:{c=b;var d=Ce(c);if(0d?2:d:0;p(c)?c=b+c+1:0<=b?(c=b+1,--d,c=c>d?c:d):c=d+b;var f=A.g(c,0)?new R(null,4,5,S,[["0",q.h(a)].join(""),b+1,1,e+1],null):new R(null,4,5,S,[a,b,c,e],null);c=D.j(f,0,null);e=D.j(f,1,null);d=D.j(f,2,null);f=D.j(f,3,null);if(p(d)){if(0>d)return new R(null,3,5,S,["0",0,!1],null);if(f>d){b=D.g(c,d);a=fh.j(c,0,d);if(bW(b)>=bW("5")){a:for(b=Ce(a)-1,c=b|0;;){if(0>c){b=Kb.j(q,"1",Wi.g(b+1,"0"));break a}if(A.g("9",a.charAt(c)))--c;else{b=Kb.u(q, fh.j(a,0,c),fg(bW(a.charAt(c))+1),Wi.g(b-c,"0"));break a}}a=Ce(b)>a.length;return new R(null,3,5,S,[a?fh.j(b,0,Ce(b)-1):b,e,a],null)}return new R(null,3,5,S,[a,e,!1],null)}}}return new R(null,3,5,S,[a,b,!1],null)} function AX(a,b,c){var d=0>b?new R(null,2,5,S,[[q.h(Kb.g(q,Wi.g(-b-1,"0"))),q.h(a)].join(""),-1],null):new R(null,2,5,S,[a,b],null);a=D.j(d,0,null);var e=D.j(d,1,null);d=Ce(a);c=p(c)?e+c+1:e+1;c=db?b=[".",q.h(c)].join(""):(b+=1,b=[fh.j(c,0,b),".",fh.g(c,b)].join(""));return b}function gda(a,b){return 0>b?[".",q.h(a)].join(""):[fh.j(a,0,b),".",fh.g(a,b)].join("")} -function BX(a,b){var c=AR.h(a),d=ZR.h(a);b=fX(b);var e=D.j(b,0,null);b=D.j(b,1,null);var f=0>e?new R(null,2,5,S,["-",-e],null):new R(null,2,5,S,["+",e],null),h=D.j(f,0,null);f=D.j(f,1,null);f=yX(f);var k=D.j(f,0,null),l=D.j(f,1,null)+VR.h(a);f=function(){var y=qz.h(a);return p(y)?y:0>e}();var g=vb(d)&&Ce(k)-1<=l,t=zX(k,l,d,p(c)?c-(p(f)?1:0):null);k=D.j(t,0,null);l=D.j(t,1,null);t=D.j(t,2,null);k=AX(k,p(t)?l+1:l,d);d=p(p(c)?p(d)?1<=d&&A.g(k.charAt(0),"0")&&A.g(k.charAt(1),".")&&k.length>c-(p(f)?1: +function BX(a,b){var c=DR.h(a),d=ZR.h(a);b=fX(b);var e=D.j(b,0,null);b=D.j(b,1,null);var f=0>e?new R(null,2,5,S,["-",-e],null):new R(null,2,5,S,["+",e],null),h=D.j(f,0,null);f=D.j(f,1,null);f=yX(f);var k=D.j(f,0,null),l=D.j(f,1,null)+VR.h(a);f=function(){var y=qz.h(a);return p(y)?y:0>e}();var g=vb(d)&&Ce(k)-1<=l,t=zX(k,l,d,p(c)?c-(p(f)?1:0):null);k=D.j(t,0,null);l=D.j(t,1,null);t=D.j(t,2,null);k=AX(k,p(t)?l+1:l,d);d=p(p(c)?p(d)?1<=d&&A.g(k.charAt(0),"0")&&A.g(k.charAt(1),".")&&k.length>c-(p(f)?1: 0):d:c)?fh.g(k,1):k;l=A.g(u(d),".");if(p(c)){k=d.length;k=p(f)?k+1:k;l=l&&!(k>=c);g=g&&!(k>=c);var r=l||g?k+1:k;p(function(){var y=r>c;return y?dS.h(a):y}())?ZV.l(F([Kb.g(q,Wi.g(c,dS.h(a)))])):ZV.l(F([[q.h(Kb.g(q,Wi.g(c-r,HH.h(a)))),q.h(p(f)?h:null),l?"0":null,d,g?"0":null].join("")]))}else ZV.l(F([[q.h(p(f)?h:null),l?"0":null,d,g?"0":null].join("")]));return b} -function CX(a,b){b=fX(b);var c=D.j(b,0,null);b=D.j(b,1,null);var d=yX(0>c?-c:c);D.j(d,0,null);for(D.j(d,1,null);;){var e=D.j(d,0,null),f=D.j(d,1,null),h=AR.h(a),k=ZR.h(a),l=YR.h(a),g=VR.h(a),t=function(){var V=ip.h(a);return p(V)?V:"E"}();d=function(){var V=qz.h(a);return p(V)?V:0>c}();var r=0>=g,y=f-(g-1),B=q.h(Math.abs(y));t=[q.h(t),0>y?"-":"+",q.h(p(l)?Kb.g(q,Wi.g(l-B.length,"0")):null),B].join("");var J=t.length;y=Ce(e);e=[q.h(Kb.g(q,Wi.g(-g,"0"))),q.h(e),q.h(p(k)?Kb.g(q,Wi.g(k-(y-1)-(0>g?-g: +function CX(a,b){b=fX(b);var c=D.j(b,0,null);b=D.j(b,1,null);var d=yX(0>c?-c:c);D.j(d,0,null);for(D.j(d,1,null);;){var e=D.j(d,0,null),f=D.j(d,1,null),h=DR.h(a),k=ZR.h(a),l=YR.h(a),g=VR.h(a),t=function(){var V=ip.h(a);return p(V)?V:"E"}();d=function(){var V=qz.h(a);return p(V)?V:0>c}();var r=0>=g,y=f-(g-1),B=q.h(Math.abs(y));t=[q.h(t),0>y?"-":"+",q.h(p(l)?Kb.g(q,Wi.g(l-B.length,"0")):null),B].join("");var J=t.length;y=Ce(e);e=[q.h(Kb.g(q,Wi.g(-g,"0"))),q.h(e),q.h(p(k)?Kb.g(q,Wi.g(k-(y-1)-(0>g?-g: 0),"0")):null)].join("");y=p(h)?h-J:null;e=zX(e,0,A.g(g,0)?k-1:0g?k-1:null,p(y)?y-(p(d)?1:0):null);y=D.j(e,0,null);D.j(e,1,null);B=D.j(e,2,null);e=gda(y,g);k=A.g(g,Ce(y))&&null==k;if(vb(B)){if(p(h)){f=e.length+J;f=p(d)?f+1:f;var P=(r=r&&!A.g(f,h))?f+1:f;f=k&&Ph;V||(V=l,V=p(V)?J-2>l:V);return p(V)?dS.h(a):V}())?ZV.l(F([Kb.g(q,Wi.g(h,dS.h(a)))])):ZV.l(F([[q.h(Kb.g(q,Wi.g(h-P-(f?1:0),HH.h(a)))),p(d)?0>c?"-":"+":null,r?"0":null,e,f?"0":null,t].join("")]))}else ZV.l(F([[p(d)? -0>c?"-":"+":null,r?"0":null,e,k?"0":null,t].join("")]));break}else d=new R(null,2,5,S,[y,f+1],null)}return b}function hda(a,b,c){var d=fX(b),e=D.j(d,0,null);D.j(d,1,null);d=yX(0>e?-e:e);var f=D.j(d,0,null);d=D.j(d,1,null);var h=AR.h(a),k=ZR.h(a),l=YR.h(a);d=A.g(e,0)?0:d+1;e=p(l)?l+2:4;h=p(h)?h-e:null;p(k)?f=k:(f=Ce(f),k=7>d?d:7,f=f>k?f:k);d=f-d;return 0<=d&&d<=f?(a=BX(new n(null,6,[AR,h,ZR,d,VR,0,dS,dS.h(a),HH,HH.h(a),qz,qz.h(a)],null),b,c),ZV.l(F([Kb.g(q,Wi.g(e," "))])),a):CX(a,b,c)} -function ida(a,b){b=fX(b);var c=D.j(b,0,null);b=D.j(b,1,null);var d=yX(Math.abs(c)),e=D.j(d,0,null),f=D.j(d,1,null),h=ZR.h(a),k=FR.h(a);d=AR.h(a);var l=function(){var t=qz.h(a);return p(t)?t:0>c}(),g=zX(e,f,h,null);e=D.j(g,0,null);f=D.j(g,1,null);g=D.j(g,2,null);h=AX(e,p(g)?f+1:f,h);k=[q.h(Kb.g(q,Wi.g(k-h.indexOf("."),"0"))),h].join("");h=k.length+(p(l)?1:0);ZV.l(F([[p(function(){var t=yM.h(a);return p(t)?l:t}())?0>c?"-":"+":null,q.h(Kb.g(q,Wi.g(d-h,HH.h(a)))),p(function(){var t=vb(yM.h(a));return t? -l:t}())?0>c?"-":"+":null,k].join("")]));return b}function jda(a,b){var c=Qu.h(a);c=p(c)?new R(null,2,5,S,[c,b],null):fX(b);b=D.j(c,0,null);c=D.j(c,1,null);var d=kT.h(a);b=0>b||b>=Ce(d)?u(nB.h(a)):D.g(d,b);return p(b)?xX(b,c,GJ.h(a)):c}function kda(a,b){var c=fX(b);b=D.j(c,0,null);c=D.j(c,1,null);var d=kT.h(a);b=p(b)?Le(d):u(d);return p(b)?xX(b,c,GJ.h(a)):c}function lda(a,b){var c=fX(b),d=D.j(c,0,null);c=D.j(c,1,null);var e=kT.h(a);e=p(d)?u(e):null;return p(d)?p(e)?xX(e,b,GJ.h(a)):b:c} -function mda(a,b){var c=UN.h(a),d=u(kT.h(a));d=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(d,0,null);d=D.j(d,1,null);d=fX(d);var e=D.j(d,0,null);d=D.j(d,1,null);var f=0;e=$W(e);for(var h=-1;;){if(vb(c)&&A.g(bU.h(e),h)&&1=c:c))return d;h=xX(b,e,GJ.h(a));if(A.g(VB,u(h)))return d;f+=1;var k=bU.h(e);e=h;h=k}} -function nda(a,b){var c=UN.h(a),d=u(kT.h(a));d=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(d,0,null);d=D.j(d,1,null);d=fX(d);var e=D.j(d,0,null);d=D.j(d,1,null);for(var f=0;;){var h=ff(e)&&(vb(yM.h(vM.h(a)))||0=c:c))return d;h=xX(b,$W(u(e)),$W(v(e)));if(A.g(ay,u(h)))return d;f+=1;e=v(e)}} -function oda(a,b){var c=UN.h(a),d=u(kT.h(a)),e=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(e,0,null);d=0;e=D.j(e,1,null);for(var f=-1;;){if(vb(c)&&A.g(bU.h(e),f)&&1=c:c))return e;f=xX(b,e,GJ.h(a));if(A.g(VB,u(f)))return Le(f);d+=1;var h=bU.h(e);e=f;f=h}} -function pda(a,b){var c=UN.h(a),d=u(kT.h(a)),e=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(e,0,null);d=0;for(e=D.j(e,1,null);;){var f=ff(Rx.h(e))&&(vb(yM.h(vM.h(a)))||0=c:c))return e;f=Rx.h(e);f=p(f)?new R(null,2,5,S,[u(f),new eX(oB.h(e),v(f),bU.h(e)+1,null,null,null)],null):new R(null,2,5,S,[null,e],null);e=D.j(f,0,null);f=D.j(f,1,null);e=xX(b,$W(e),f);if(A.g(ay,u(e)))return f;e=f;d+=1}} -function qda(a,b){if(p(yM.h(vM.h(a)))){var c=kT.h(a),d=Ce(c),e=1da?1:da}();l=Rb.g(Uf,ri.g(Ce,g));var r=fI.h(a),y=pO.h(a),B=LB.h(a),J=l+t*y;r=J<=r?r:r+B*(1+Rg(J-r-1,B));var P=r-l;l=function(){var da=Rg(P,t);return y>da?y:da}();B=P-l*t;l=Kb.g(q,Wi.g(l,HH.h(a)));p(p(d)?gW(vT.h(w(w(ab))),oU)+c+r>k:d)&&ZV.l(F([d]));c=B;for(var V=g,ba=function(){var da=yM.h(a);return p(da)?da:A.g(Ce(V),1)&&vb(qz.h(a))}();;)if(C(V))ZV.l(F([[q.h(vb(ba)?u(V):null),q.h(p(function(){var da=ba;return p(da)?da:(da=v(V))?da:qz.h(a)}())?l:null),q.h(0c?"-":"+":null,r?"0":null,e,k?"0":null,t].join("")]));break}else d=new R(null,2,5,S,[y,f+1],null)}return b}function hda(a,b,c){var d=fX(b),e=D.j(d,0,null);D.j(d,1,null);d=yX(0>e?-e:e);var f=D.j(d,0,null);d=D.j(d,1,null);var h=DR.h(a),k=ZR.h(a),l=YR.h(a);d=A.g(e,0)?0:d+1;e=p(l)?l+2:4;h=p(h)?h-e:null;p(k)?f=k:(f=Ce(f),k=7>d?d:7,f=f>k?f:k);d=f-d;return 0<=d&&d<=f?(a=BX(new n(null,6,[DR,h,ZR,d,VR,0,dS,dS.h(a),HH,HH.h(a),qz,qz.h(a)],null),b,c),ZV.l(F([Kb.g(q,Wi.g(e," "))])),a):CX(a,b,c)} +function ida(a,b){b=fX(b);var c=D.j(b,0,null);b=D.j(b,1,null);var d=yX(Math.abs(c)),e=D.j(d,0,null),f=D.j(d,1,null),h=ZR.h(a),k=HR.h(a);d=DR.h(a);var l=function(){var t=qz.h(a);return p(t)?t:0>c}(),g=zX(e,f,h,null);e=D.j(g,0,null);f=D.j(g,1,null);g=D.j(g,2,null);h=AX(e,p(g)?f+1:f,h);k=[q.h(Kb.g(q,Wi.g(k-h.indexOf("."),"0"))),h].join("");h=k.length+(p(l)?1:0);ZV.l(F([[p(function(){var t=wM.h(a);return p(t)?l:t}())?0>c?"-":"+":null,q.h(Kb.g(q,Wi.g(d-h,HH.h(a)))),p(function(){var t=vb(wM.h(a));return t? +l:t}())?0>c?"-":"+":null,k].join("")]));return b}function jda(a,b){var c=Pu.h(a);c=p(c)?new R(null,2,5,S,[c,b],null):fX(b);b=D.j(c,0,null);c=D.j(c,1,null);var d=nT.h(a);b=0>b||b>=Ce(d)?u(nB.h(a)):D.g(d,b);return p(b)?xX(b,c,FJ.h(a)):c}function kda(a,b){var c=fX(b);b=D.j(c,0,null);c=D.j(c,1,null);var d=nT.h(a);b=p(b)?Le(d):u(d);return p(b)?xX(b,c,FJ.h(a)):c}function lda(a,b){var c=fX(b),d=D.j(c,0,null);c=D.j(c,1,null);var e=nT.h(a);e=p(d)?u(e):null;return p(d)?p(e)?xX(e,b,FJ.h(a)):b:c} +function mda(a,b){var c=UN.h(a),d=u(nT.h(a));d=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(d,0,null);d=D.j(d,1,null);d=fX(d);var e=D.j(d,0,null);d=D.j(d,1,null);var f=0;e=$W(e);for(var h=-1;;){if(vb(c)&&A.g(cU.h(e),h)&&1=c:c))return d;h=xX(b,e,FJ.h(a));if(A.g(WB,u(h)))return d;f+=1;var k=cU.h(e);e=h;h=k}} +function nda(a,b){var c=UN.h(a),d=u(nT.h(a));d=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(d,0,null);d=D.j(d,1,null);d=fX(d);var e=D.j(d,0,null);d=D.j(d,1,null);for(var f=0;;){var h=ff(e)&&(vb(wM.h(tM.h(a)))||0=c:c))return d;h=xX(b,$W(u(e)),$W(v(e)));if(A.g($x,u(h)))return d;f+=1;e=v(e)}} +function oda(a,b){var c=UN.h(a),d=u(nT.h(a)),e=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(e,0,null);d=0;e=D.j(e,1,null);for(var f=-1;;){if(vb(c)&&A.g(cU.h(e),f)&&1=c:c))return e;f=xX(b,e,FJ.h(a));if(A.g(WB,u(f)))return Le(f);d+=1;var h=cU.h(e);e=f;f=h}} +function pda(a,b){var c=UN.h(a),d=u(nT.h(a)),e=ff(d)?gX(b):new R(null,2,5,S,[d,b],null);b=D.j(e,0,null);d=0;for(e=D.j(e,1,null);;){var f=ff(Qx.h(e))&&(vb(wM.h(tM.h(a)))||0=c:c))return e;f=Qx.h(e);f=p(f)?new R(null,2,5,S,[u(f),new eX(oB.h(e),v(f),cU.h(e)+1,null,null,null)],null):new R(null,2,5,S,[null,e],null);e=D.j(f,0,null);f=D.j(f,1,null);e=xX(b,$W(e),f);if(A.g($x,u(e)))return f;e=f;d+=1}} +function qda(a,b){if(p(wM.h(tM.h(a)))){var c=nT.h(a),d=Ce(c),e=1da?1:da}();l=Rb.g(Uf,ri.g(Ce,g));var r=gI.h(a),y=oO.h(a),B=MB.h(a),J=l+t*y;r=J<=r?r:r+B*(1+Rg(J-r-1,B));var P=r-l;l=function(){var da=Rg(P,t);return y>da?y:da}();B=P-l*t;l=Kb.g(q,Wi.g(l,HH.h(a)));p(p(d)?gW(xT.h(w(w(ab))),pU)+c+r>k:d)&&ZV.l(F([d]));c=B;for(var V=g,ba=function(){var da=wM.h(a);return p(da)?da:A.g(Ce(V),1)&&vb(qz.h(a))}();;)if(C(V))ZV.l(F([[q.h(vb(ba)?u(V):null),q.h(p(function(){var da=ba;return p(da)?da:(da=v(V))?da:qz.h(a)}())?l:null),q.h(0c?-c:c);if(Ce(d)<=Ce(sX)){var e=ri.g(tX,Pi.h(d));e=uX(e,1);var f=Qe(d);d=Rg(f,100);f=Sg(f,100);var h=0f)var g=D.g(qX,f);else{g=Rg(f,10);var t=Sg(f,10);g=0c?"minus ":null,ff(e)||ff(d)?ff(e)?d:[e,"th"].join(""):[e,", ",d].join("")].join("")]))}else oX(10,new n(null,5,[fI,0,HH," ",jS,",",UJ,3,yM,!0],null),$W(new R(null,1,5,S,[c],null))),e=Sg(c,100),c=11e,e=Sg(e,10),ZV.l(F([1===e&&c?"st":2===e&&c?"nd":3===e&&c?"rd":"th"]))}return b}:function(b,c){c=fX(c);b=D.j(c,0,null);c=D.j(c,1,null);if(A.g(0,b))ZV.l(F(["zero"]));else{var d=nX(1E3,0>b?-b:b);Ce(d)<=Ce(sX)?(d=ri.g(tX,d),d=uX(d,0),ZV.l(F([[0>b?"minus ":null,d].join("")]))): -oX(10,new n(null,5,[fI,0,HH," ",jS,",",UJ,3,yM,!0],null),$W(new R(null,1,5,S,[b],null)))}return c}}],null),new n(null,5,[Sz,"P",FP,Wh,CQ,new El(null,new n(null,3,[yM,null,qz,null,vw,null],null),null),eu,Wh,VQ,function(){return function(a,b){b=p(yM.h(a))?iX(b,-1):b;a=p(qz.h(a))?new R(null,2,5,S,["y","ies"],null):new R(null,2,5,S,["","s"],null);var c=fX(b);b=D.j(c,0,null);c=D.j(c,1,null);ZV.l(F([A.g(b,1)?u(a):Le(a)]));return c}}],null),new n(null,5,[Sz,"C",FP,new n(null,1,[Ww,new R(null,2,5,S,[null, -String],null)],null),CQ,new El(null,new n(null,3,[yM,null,qz,null,vw,null],null),null),eu,Wh,VQ,function(a){return p(yM.h(a))?dda:p(qz.h(a))?eda:fda}],null),new n(null,5,[Sz,"F",FP,new n(null,5,[AR,new R(null,2,5,S,[null,Number],null),ZR,new R(null,2,5,S,[null,Number],null),VR,new R(null,2,5,S,[0,Number],null),dS,new R(null,2,5,S,[null,String],null),HH,new R(null,2,5,S,[" ",String],null)],null),CQ,new El(null,new n(null,1,[qz,null],null),null),eu,Wh,VQ,function(){return BX}],null),new n(null,5,[Sz, -"E",FP,new n(null,7,[AR,new R(null,2,5,S,[null,Number],null),ZR,new R(null,2,5,S,[null,Number],null),YR,new R(null,2,5,S,[null,Number],null),VR,new R(null,2,5,S,[1,Number],null),dS,new R(null,2,5,S,[null,String],null),HH,new R(null,2,5,S,[" ",String],null),ip,new R(null,2,5,S,[null,String],null)],null),CQ,new El(null,new n(null,1,[qz,null],null),null),eu,Wh,VQ,function(){return CX}],null),new n(null,5,[Sz,"G",FP,new n(null,7,[AR,new R(null,2,5,S,[null,Number],null),ZR,new R(null,2,5,S,[null,Number], -null),YR,new R(null,2,5,S,[null,Number],null),VR,new R(null,2,5,S,[1,Number],null),dS,new R(null,2,5,S,[null,String],null),HH,new R(null,2,5,S,[" ",String],null),ip,new R(null,2,5,S,[null,String],null)],null),CQ,new El(null,new n(null,1,[qz,null],null),null),eu,Wh,VQ,function(){return hda}],null),new n(null,5,[Sz,"$",FP,new n(null,4,[ZR,new R(null,2,5,S,[2,Number],null),FR,new R(null,2,5,S,[1,Number],null),AR,new R(null,2,5,S,[0,Number],null),HH,new R(null,2,5,S,[" ",String],null)],null),CQ,new El(null, -new n(null,3,[yM,null,qz,null,vw,null],null),null),eu,Wh,VQ,function(){return ida}],null),new n(null,5,[Sz,"%",FP,new n(null,1,[IG,new R(null,2,5,S,[1,Number],null)],null),CQ,Gl,eu,Wh,VQ,function(){return function(a,b){a=IG.h(a);for(var c=0;;)if(cc?-c:c);if(Ce(d)<=Ce(sX)){var e=ri.g(tX,Pi.h(d));e=uX(e,1);var f=Qe(d);d=Rg(f,100);f=Sg(f,100);var h=0f)var g=D.g(qX,f);else{g=Rg(f,10);var t=Sg(f,10);g=0c?"minus ":null,ff(e)||ff(d)?ff(e)?d:[e,"th"].join(""):[e,", ",d].join("")].join("")]))}else oX(10,new n(null,5,[gI,0,HH," ",jS,",",TJ,3,wM,!0],null),$W(new R(null,1,5,S,[c],null))),e=Sg(c,100),c=11e,e=Sg(e,10),ZV.l(F([1===e&&c?"st":2===e&&c?"nd":3===e&&c?"rd":"th"]))}return b}:function(b,c){c=fX(c);b=D.j(c,0,null);c=D.j(c,1,null);if(A.g(0,b))ZV.l(F(["zero"]));else{var d=nX(1E3,0>b?-b:b);Ce(d)<=Ce(sX)?(d=ri.g(tX,d),d=uX(d,0),ZV.l(F([[0>b?"minus ":null,d].join("")]))): +oX(10,new n(null,5,[gI,0,HH," ",jS,",",TJ,3,wM,!0],null),$W(new R(null,1,5,S,[b],null)))}return c}}],null),new n(null,5,[Tz,"P",HP,Wh,GQ,new El(null,new n(null,3,[wM,null,qz,null,tw,null],null),null),cu,Wh,ZQ,function(){return function(a,b){b=p(wM.h(a))?iX(b,-1):b;a=p(qz.h(a))?new R(null,2,5,S,["y","ies"],null):new R(null,2,5,S,["","s"],null);var c=fX(b);b=D.j(c,0,null);c=D.j(c,1,null);ZV.l(F([A.g(b,1)?u(a):Le(a)]));return c}}],null),new n(null,5,[Tz,"C",HP,new n(null,1,[Tw,new R(null,2,5,S,[null, +String],null)],null),GQ,new El(null,new n(null,3,[wM,null,qz,null,tw,null],null),null),cu,Wh,ZQ,function(a){return p(wM.h(a))?dda:p(qz.h(a))?eda:fda}],null),new n(null,5,[Tz,"F",HP,new n(null,5,[DR,new R(null,2,5,S,[null,Number],null),ZR,new R(null,2,5,S,[null,Number],null),VR,new R(null,2,5,S,[0,Number],null),dS,new R(null,2,5,S,[null,String],null),HH,new R(null,2,5,S,[" ",String],null)],null),GQ,new El(null,new n(null,1,[qz,null],null),null),cu,Wh,ZQ,function(){return BX}],null),new n(null,5,[Tz, +"E",HP,new n(null,7,[DR,new R(null,2,5,S,[null,Number],null),ZR,new R(null,2,5,S,[null,Number],null),YR,new R(null,2,5,S,[null,Number],null),VR,new R(null,2,5,S,[1,Number],null),dS,new R(null,2,5,S,[null,String],null),HH,new R(null,2,5,S,[" ",String],null),ip,new R(null,2,5,S,[null,String],null)],null),GQ,new El(null,new n(null,1,[qz,null],null),null),cu,Wh,ZQ,function(){return CX}],null),new n(null,5,[Tz,"G",HP,new n(null,7,[DR,new R(null,2,5,S,[null,Number],null),ZR,new R(null,2,5,S,[null,Number], +null),YR,new R(null,2,5,S,[null,Number],null),VR,new R(null,2,5,S,[1,Number],null),dS,new R(null,2,5,S,[null,String],null),HH,new R(null,2,5,S,[" ",String],null),ip,new R(null,2,5,S,[null,String],null)],null),GQ,new El(null,new n(null,1,[qz,null],null),null),cu,Wh,ZQ,function(){return hda}],null),new n(null,5,[Tz,"$",HP,new n(null,4,[ZR,new R(null,2,5,S,[2,Number],null),HR,new R(null,2,5,S,[1,Number],null),DR,new R(null,2,5,S,[0,Number],null),HH,new R(null,2,5,S,[" ",String],null)],null),GQ,new El(null, +new n(null,3,[wM,null,qz,null,tw,null],null),null),cu,Wh,ZQ,function(){return ida}],null),new n(null,5,[Tz,"%",HP,new n(null,1,[IG,new R(null,2,5,S,[1,Number],null)],null),GQ,Gl,cu,Wh,ZQ,function(){return function(a,b){a=IG.h(a);for(var c=0;;)if(cCe(FP.h(a))&&dX(YW(null,'Too many parameters for directive "~C": ~D~:* ~[were~;was~:;were~] specified but only ~D~:* ~[are~;is~:;are~] allowed',F([Sz.h(a),Ce(b),Ce(FP.h(a))])),Le(u(b)));lm.h(ri.j(function(e,f){var h=u(e);return null==h||Af(Bda,h)||A.g(Le(Le(f)),Ab(h))?null:dX(["Parameter ",uh(u(f)),' has bad type in directive "',q.h(Sz.h(a)),'": ',q.h(Ab(h))].join(""),Le(e))},b,FP.h(a)));return zl.l(F([jj.g(Wh,jh(function(){return function h(f){return new vh(null, -function(){for(;;){var k=C(f);if(k){if(of(k)){var l=vd(k),g=Ce(l),t=zh(g);a:for(var r=0;;)if(rCe(HP.h(a))&&dX(YW(null,'Too many parameters for directive "~C": ~D~:* ~[were~;was~:;were~] specified but only ~D~:* ~[are~;is~:;are~] allowed',F([Tz.h(a),Ce(b),Ce(HP.h(a))])),Le(u(b)));lm.h(ri.j(function(e,f){var h=u(e);return null==h||Af(Bda,h)||A.g(Le(Le(f)),Ab(h))?null:dX(["Parameter ",uh(u(f)),' has bad type in directive "',q.h(Tz.h(a)),'": ',q.h(Ab(h))].join(""),Le(e))},b,HP.h(a)));return zl.l(F([jj.g(Wh,jh(function(){return function h(f){return new vh(null, +function(){for(;;){var k=C(f);if(k){if(of(k)){var l=vd(k),g=Ce(l),t=zh(g);a:for(var r=0;;)if(re?new R(null,2,5,S,[IX(d,c),new R(null,2,5,S,["",c+d.length],null)],null):0===e?Ida(fh.g(d,1),c+1):new R(null,2,5,S,[IX(fh.j(d,0,e),c),new R(null,2,5,S,[fh.g(d,e),e+c],null)],null)},new R(null,2,5,S,[a,0],null))))}finally{cX=b}} -var aX=function aX(a){for(;;){if(ff(a))return!1;var c=JS.h(CQ.h(KR.h(u(a))));p(c)||(c=ti(aX,u(kT.h(FP.h(u(a))))),c=p(c)?c:ti(aX,u(nB.h(FP.h(u(a))))));if(p(c))return!0;a=v(a)}};function bX(a,b){cW(function(c,d){if(wX(d))return new R(null,2,5,S,[null,d],null);d=kX(FP.h(c),d);var e=D.j(d,0,null);d=D.j(d,1,null);var f=eW(e);e=D.j(f,0,null);f=D.j(f,1,null);e=Ve.j(e,GJ,d);return new R(null,2,5,S,[null,Kb.g(iN.h(c),new R(null,3,5,S,[e,d,f],null))],null)},b,a);return null} -var KX=un(ZW),LX=new n(null,6,[Ao,"'",zo,"#'",kO,"@",qQ,"~",oF,"@",$E,"~"],null);function MX(a){var b=u(a);b=LX.h?LX.h(b):LX.call(null,b);return p(p(b)?A.g(2,Ce(a)):b)?(ad(ab,b),SW(Le(a)),!0):null}function NX(a){if(p(VW()))ad(ab,"#");else{var b=PW,c=QW;PW+=1;QW=0;try{GW("[","]");for(var d=0,e=C(a);;){if(vb(ib)||dCe(a)?FU(a):[FU(fh.j(a,0,1)),fh.g(a,1)].join("")}function oY(a){if("string"===typeof a)return a;a=uh(a);var b=HU.g(a,/-/),c=C(b);b=u(c);c=v(c);return p(mY.h?mY.h(b):mY.call(null,b))?a:Kb.j(q,b,ri.g(nY,c))} +++e;e=new Ib(f,0,null)}return c.call(this,e)}function c(d){return Hi.l(kY,pj,new R(null,1,5,S,[OI],null),Re,F([Kb.g(q,d)]))}b.m=0;b.o=function(d){d=C(d);return c(d)};b.l=c;return b}();return a}();var bea="undefined"!==typeof window&&null!=window.document,mY=new El(null,new n(null,2,["aria",null,"data",null],null),null);function nY(a){return 2>Ce(a)?FU(a):[FU(fh.j(a,0,1)),fh.g(a,1)].join("")}function oY(a){if("string"===typeof a)return a;a=uh(a);var b=HU.g(a,/-/),c=C(b);b=u(c);c=v(c);return p(mY.h?mY.h(b):mY.call(null,b))?a:Kb.j(q,b,ri.g(nY,c))} function pY(a){var b=function(){var c=function(){var d=Ze(a);if(d){d=a.displayName;if(p(d))return d;d=a.name;return"string"===typeof d&&C(d)?d:null}return d}();if(p(c))return c;c=function(){var d=null!=a?a.H&4096||$a===a.be?!0:!1:!1;return d?uh(a):d}();if(p(c))return c;c=bf(a);return lf(c)?U.h(c):null}();return p(b)?CU(q.h(b),"$","."):null}function qY(a){return a instanceof z||a instanceof x} var rY=function rY(a){switch(arguments.length){case 0:return rY.s();case 1:return rY.h(arguments[0]);case 2:return rY.g(arguments[0],arguments[1]);default:for(var c=[],d=arguments.length,e=0;;)if(e=e&&f.push(GY(a,k));return f},[c,d],b))}}function EZ(a,b,c,d){this.tag=a;this.id=b;this.className=c;this.Vf=d}function FZ(a,b,c){a=xZ(a,c);c={};c.argv=b;b=uY(b);null!=b&&(c.key=b);return fY.createElement(a,c)} function GZ(a,b,c,d){var e={};e.vc=a;e.argv=Vj.g(b,c);b=uY(b);null!=b&&(e.key=b);return fY.createElement(pea(d,a),e)}function Aea(a,b,c){return sZ(a)?FZ(a,b,c):GZ(a,b,1,c)}var HZ={};function Bea(a,b){a=BZ(HZ,b);if(null==a){var c=v(mm(vea,uh(b)));a=D.j(c,0,null);var d=D.j(c,1,null);c=D.j(c,2,null);c=null==c?null:CU(c,/\./," ");var e=Yh.g(-1,a.indexOf("-"));a=new EZ(a,d,c,e);return HZ[b]=a}return a} -function IZ(a,b,c,d){var e=a.tag,f=D.j(b,c,null),h=null==f||lf(f),k=function(){var t=h?f:null;var r=Sp.h(t);r=p(r)?Ve.j(t,Sp,rY.h(r)):t;var y=a.id;t=a.className;y=null!=y&&null==lB.h(r)?Ve.j(r,lB,y):r;if(p(t)){var B=Ve.j,J=rY.g,P=Sp.h(r);r=p(P)?P:Pt.h(r);t=B.call(Ve,y,Sp,J.call(rY,t,r))}else t=y;t=p(a.Vf)?yea(t):CZ(t);return p(t)?t:{}}();c+=h?1:0;a:switch(e){case "input":case "textarea":var l=!0;break a;default:l=!1}if(l){l=tY(f);var g=function(){var t=d.og;if(p(t))return t;t=vZ(uea,d);return d.og= +function IZ(a,b,c,d){var e=a.tag,f=D.j(b,c,null),h=null==f||lf(f),k=function(){var t=h?f:null;var r=Sp.h(t);r=p(r)?Ve.j(t,Sp,rY.h(r)):t;var y=a.id;t=a.className;y=null!=y&&null==lB.h(r)?Ve.j(r,lB,y):r;if(p(t)){var B=Ve.j,J=rY.g,P=Sp.h(r);r=p(P)?P:Nt.h(r);t=B.call(Ve,y,Sp,J.call(rY,t,r))}else t=y;t=p(a.Vf)?yea(t):CZ(t);return p(t)?t:{}}();c+=h?1:0;a:switch(e){case "input":case "textarea":var l=!0;break a;default:l=!1}if(l){l=tY(f);var g=function(){var t=d.og;if(p(t))return t;t=vZ(uea,d);return d.og= t}();return GY(d,af(new R(null,6,5,S,[g,b,e,k,c,d],null),zl.l(F([p(l)?new n(null,1,[hO,l],null):null,bf(b)]))))}l=tY(bf(b));null!=l&&(k.key=l);return HY(d,b,e,k,c)}function Cea(a,b){return Pb.h(ri.g(function(c){return GY(b,c)},a))} function Dea(a,b,c){null==b&&console.error("vec-to-elem",Im.l(F([a])));var d=D.j(a,0,null);switch(d instanceof z?d.X:null){case "\x3e":return c=D.j(a,1,null),IZ(new EZ(c,null,null,null),a,2,b);case "r\x3e":c=D.j(a,1,null);d=D.j(a,2,null);d=p(d)?d:{};var e=tY(bf(a));null!=e&&(d.key=e);return HY(b,a,c,d,3);case "f\x3e":return GZ(D.j(a,1,null),a,2,b);case "\x3c\x3e":return d=D.j(a,1,null),c=null==d||lf(d),d=CZ(c?d:null),d=p(d)?d:{},c=1+(c?1:0),e=uY(a),null!=e&&(d.key=e),HY(b,a,fY.Fragment,d,c);default:if(qY(d)|| "string"===typeof d)a:for(;;)switch(c=D.j(a,0,null),d=uh(c),e=d.indexOf("\x3e"),e){case -1:b=IZ(FY(b,d,c),a,1,b);break a;case 0:b=null;break a;default:a=af(new R(null,2,5,S,[fh.j(d,0,e),Ve.j(af(a,null),0,fh.g(d,e+1))],null),bf(a))}else b=c.j?c.j(d,a,b):c.call(null,d,a,b);return b}}function JZ(a,b,c,d,e){this.kg=a;this.id=b;this.df=c;this.Id=d;this.gg=e;this.B=393216;this.H=0}m=JZ.prototype;m.S=function(a,b){return new JZ(this.kg,this.id,this.df,this.Id,b)};m.P=function(){return this.gg};m.ng=function(){return this.id}; -m.qf=function(a,b,c){return this.Id.j?this.Id.j(this,b,c):this.Id.call(null,this,b,c)};m.nf=function(a,b){return"object"!==ca(b)?b:nf(b)?Dea(b,this,this.df):uf(b)?Cea(b,this):qY(b)?uh(b):(null!=b?b.B&2147483648||$a===b.da||(b.B?0:zb(cd,b)):zb(cd,b))?Im.l(F([b])):b};m.pf=function(a,b,c,d,e){return zea(this,b,c,d,e)};function KZ(a){var b=Vm.h("reagent-compiler"),c=p(wJ.h(a))?Aea:FZ,d=Yd.j(a,jy,Bea);return new JZ(a,b,c,d,Wh)}var LZ=KZ(Wh);var MZ=function MZ(a){switch(arguments.length){case 1:return MZ.h(arguments[0]);case 2:return MZ.g(arguments[0],arguments[1]);case 3:return MZ.j(arguments[0],arguments[1],arguments[2]);default:for(var c=[],d=arguments.length,e=0;;)if(e>>0);function o_(a){if("function"===typeof a)return a;a[s_]||(a[s_]=function(b){return a.handleEvent(b)});return a[s_]};var t_=jj.g(dk,Se);function u_(a){return null!=a?a.B&32768||$a===a.Lc?!0:a.B?!1:zb(Dc,a):zb(Dc,a)}function v_(a,b){jZ(a,b)}function Oea(a,b){return setTimeout(a,b)}function w_(a){return null!=a&&$a===a.Jd?[p(Ud.g?Ud.g(ZY,a):Ud.call(null,ZY,a))?"ra":p(Ud.g?Ud.g(gZ,a):Ud.call(null,gZ,a))?"rc":p(Ud.g?Ud.g(lZ,a):Ud.call(null,lZ,a))?"rx":p(Ud.g?Ud.g(cZ,a):Ud.call(null,cZ,a))?"tr":"other",q.h(Sd(a))].join(""):null};var x_=RZ.h(Wh);var y_=Ei.h(new n(null,6,[QS,console.log.bind(console),OL,console.warn.bind(console),NI,console.error.bind(console),iB,console.debug.bind(console),jA,p(console.group)?console.group.bind(console):console.log.bind(console),PG,p(console.groupEnd)?console.groupEnd.bind(console):function(){return de}],null)),z_=function z_(a){for(var c=[],d=arguments.length,e=0;;)if(e>>0);function o_(a){if("function"===typeof a)return a;a[s_]||(a[s_]=function(b){return a.handleEvent(b)});return a[s_]};var t_=jj.g(dk,Se);function u_(a){return null!=a?a.B&32768||$a===a.Lc?!0:a.B?!1:zb(Dc,a):zb(Dc,a)}function v_(a,b){jZ(a,b)}function Oea(a,b){return setTimeout(a,b)}function w_(a){return null!=a&&$a===a.Jd?[p(Ud.g?Ud.g(ZY,a):Ud.call(null,ZY,a))?"ra":p(Ud.g?Ud.g(gZ,a):Ud.call(null,gZ,a))?"rc":p(Ud.g?Ud.g(lZ,a):Ud.call(null,lZ,a))?"rx":p(Ud.g?Ud.g(cZ,a):Ud.call(null,cZ,a))?"tr":"other",q.h(Sd(a))].join(""):null};var x_=RZ.h(Wh);var y_=Ei.h(new n(null,6,[TS,console.log.bind(console),OL,console.warn.bind(console),OI,console.error.bind(console),iB,console.debug.bind(console),kA,p(console.group)?console.group.bind(console):console.log.bind(console),PG,p(console.groupEnd)?console.groupEnd.bind(console):function(){return de}],null)),z_=function z_(a){for(var c=[],d=arguments.length,e=0;;)if(eb?a:b))))}function Yea(a,b){return new R(null,3,5,S,[Zh(LY.g(a,b)),Zh(LY.g(b,a)),Zh(KY.g(a,b))],null)} -function z0(a){if(null!=a&&null!=a.Uf)a=a.Uf(a);else{var b=z0[ca(null==a?null:a)];if(null!=b)a=b.h?b.h(a):b.call(null,a);else if(b=z0._,null!=b)a=b.h?b.h(a):b.call(null,a);else throw Bb("EqualityPartition.equality-partition",a);}return a}function A0(a,b){if(null!=a&&null!=a.Tf)a=a.Tf(a,b);else{var c=A0[ca(null==a?null:a)];if(null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else if(c=A0._,null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else throw Bb("Diff.diff-similar",a);}return a}z0["null"]=function(){return ws}; -z0.string=function(){return ws};z0.number=function(){return ws};z0.array=function(){return pJ};z0["function"]=function(){return ws};z0["boolean"]=function(){return ws};z0._=function(a){return(null!=a?a.B&1024||$a===a.Kf||(a.B?0:zb(tc,a)):zb(tc,a))?EP:(null!=a?a.B&4096||$a===a.Nf||(a.B?0:zb(xc,a)):zb(xc,a))?sB:(null!=a?a.B&16777216||$a===a.ce||(a.B?0:zb(Rc,a)):zb(Rc,a))?pJ:ws};A0["null"]=function(a,b){return v0(a,b)};A0.string=function(a,b){return v0(a,b)};A0.number=function(a,b){return v0(a,b)}; +function z0(a){if(null!=a&&null!=a.Uf)a=a.Uf(a);else{var b=z0[ca(null==a?null:a)];if(null!=b)a=b.h?b.h(a):b.call(null,a);else if(b=z0._,null!=b)a=b.h?b.h(a):b.call(null,a);else throw Bb("EqualityPartition.equality-partition",a);}return a}function A0(a,b){if(null!=a&&null!=a.Tf)a=a.Tf(a,b);else{var c=A0[ca(null==a?null:a)];if(null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else if(c=A0._,null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else throw Bb("Diff.diff-similar",a);}return a}z0["null"]=function(){return us}; +z0.string=function(){return us};z0.number=function(){return us};z0.array=function(){return pJ};z0["function"]=function(){return us};z0["boolean"]=function(){return us};z0._=function(a){return(null!=a?a.B&1024||$a===a.Kf||(a.B?0:zb(tc,a)):zb(tc,a))?GP:(null!=a?a.B&4096||$a===a.Nf||(a.B?0:zb(xc,a)):zb(xc,a))?sB:(null!=a?a.B&16777216||$a===a.ce||(a.B?0:zb(Rc,a)):zb(Rc,a))?pJ:us};A0["null"]=function(a,b){return v0(a,b)};A0.string=function(a,b){return v0(a,b)};A0.number=function(a,b){return v0(a,b)}; A0.array=function(a,b){return y0(a,b)};A0["function"]=function(a,b){return v0(a,b)};A0["boolean"]=function(a,b){return v0(a,b)};A0._=function(a,b){var c=function(){var d=z0(a);d=d instanceof z?d.X:null;switch(d){case "atom":return v0;case "set":return Yea;case "sequential":return y0;case "map":return x0;default:throw Error(["No matching clause: ",q.h(d)].join(""));}}();return c.g?c.g(a,b):c.call(null,a,b)}; -function w0(a,b){return A.g(a,b)?new R(null,3,5,S,[null,null,a],null):A.g(z0(a),z0(b))?A0(a,b):v0(a,b)};var B0=C_.l(F([lB,iB,ET,function(a){z_.l(QS,F(["Handling re-frame event:",O_(a,RJ)]));return a},Iz,function(a){var b=O_(a,RJ),c=O_(a,Oy),d=M_(a,Oy,ys);A.g(d,ys)?z_.l(QS,F(["No app-db changes in:",b])):(d=w0(c,d),c=D.j(d,0,null),d=D.j(d,1,null),null!=c||null!=d?(z_.l(jA,F(["db clojure.data/diff for:",b])),z_.l(QS,F(["only before:",c])),z_.l(QS,F(["only after :",d])),z_(PG)):z_.l(QS,F(["No app-db changes resulted from:",b])));return a}])),C0=C_.l(F([lB,Ry,ET,function(a){var b=O_(a,RJ);D.j(b,0,null); -var c=D.j(b,1,null);if(A.g(2,Ce(b))&&lf(c))return P_(a,RJ,c);throw ao.g('re-frame: "unwrap" interceptor must be a vector of two elements "[event-id payload-map]"',b);},Iz,function(a){return P_(a,RJ,O_(a,cz))}])),D0=C_.l(F([lB,nx,ET,function(a){if(nf(O_(a,RJ)))return Kb.G(pj,a,new R(null,2,5,S,[oK,RJ],null),Vj,F([1]));z_.l(OL,F(['re-frame: "trim-v" interceptor expected event to be a vector. Got a ',Ab(O_(a,RJ))]));return a},Iz,function(a){return P_(a,RJ,O_(a,cz))}])); -function E0(a){return C_.l(F([lB,YL,ET,function(b){var c=oK.h(b),d=Vh(c);c=Yd.g(d,Oy);d=Yd.g(d,RJ);return N_(b,Oy,a.g?a.g(c,d):a.call(null,c,d))}]))}function F0(a){return C_.l(F([lB,as,ET,function(b){var c=oK.h(b);c=Vh(c);var d=Yd.g(c,RJ);return Ve.j(b,jF,a.g?a.g(c,d):a.call(null,c,d))}]))}function G0(a){return C_.l(F([lB,Rz,ET,function(b){return a.h?a.h(b):a.call(null,b)}]))} -var H0=function H0(a){for(var c=[],d=arguments.length,e=0;;)if(e=e?Kb.g(ul,d):Kb.g(tl,d)} +function xfa(a,b){for(var c=bL.h(a);;){var d=J4?J4(a,b):K4.call(null,a,b);if(r4===d)return H4;if(H4===H4&&(Af(c,d)||nh(d,aq))){c=J4?J4(a,b):K4.call(null,a,b);for(a=Ve.j(a,gr,!0);;){d=J4?J4(a,b):K4.call(null,a,b);if(r4!==d)if(q4===d){d=lT.h(a);var e=EP.h(a),f=Vh(e);e=Yd.g(f,jp);var h=Yd.g(f,LH);f=Yd.g(f,YN);t4(a,b,["EOF while reading, expected ",q.h(d)," to match ",q.h(f)," at [",q.h(e),",",q.h(h),"]"].join(""),new n(null,2,[FQ,q.h(d),hq,q.h(f)],null))}else continue;break}return c}d=Ve.j(a,gr,!0); +e=b;J4?J4(d,e):K4.call(null,d,e)}}function yfa(a,b){G4(b);var c=xz.h(a),d=A.g("@",b.xb(null));d&&b.V(null);G4(b);if(nh(faa,c))return sca(J4?J4(a,b):K4.call(null,a,b),d);if(Ze(c))return b=Xh.u(J4?J4(a,b):K4.call(null,a,b),Ve,gy,d),c.h?c.h(b):c.call(null,b);var e=bV(b);c=e?b.Ac(null):null;e=e?b.zc(null):null;var f=b.V(null);a=Ve.j(Ve.j(a,lT,")"),EP,new n(null,3,[YN,f,jp,c,LH,e],null));a=xfa(a,b);return a===H4?b:d?Xh.g(a,function(h){return Ve.j(h,$D,!0)}):a} +function M4(a,b,c,d){var e=function(){var f=Ru.h(a),h=function(){var k=null==a?null:QA.h(a);return null==k?null:w(k)}();return p(h)?function(k){var l=h.h?h.h(k):h.call(null,k);return p(l)?l:f.h?f.h(k):f.call(null,k)}:f}();return p(e)?e:t4(a,b,p(d)?d:"Use `:auto-resolve` to resolve aliases.",new n(null,1,[$s,[":",q.h(c)].join("")],null))} +function N4(a,b,c,d,e,f){b=b.h?b.h(c):b.call(null,c);return p(b)?b:t4(a,d,p(f)?f:["Alias `",q.h(Zd.h(c)),"` not found in `:auto-resolve`"].join(""),new n(null,1,[$s,[":",q.h(e)].join("")],null))} +function O4(a,b,c){c=w4(b,c);if(p(c))switch(c){case "nil":return null;case "true":return!0;case "false":return!1;case "/":return $B;default:var d=x4.h?x4.h(c):x4.call(null,c);d=p(d)?Zd.g(d.h?d.h(0):d.call(null,0),d.h?d.h(1):d.call(null,1)):null;return p(d)?d:t4(a,b,["Invalid symbol: ",c].join(""),qj.u(E4(b),LH,Vf,c.length))}else return null} +function zfa(a,b){var c=b.xb(null),d=v4(c);":"===c?(b.V(null),c=!0):c=null;var e=c,f=nh(kQ,G4(b)),h=p(e)?function(){var g=b.xb(null);return" "===g||"{"===g}():null;p(function(){var g=vb(h);return g?p(d)?d:f:g}())&&s4(a,b,"Namespaced map must specify a namespace");var k=p(e)?p(h)?null:O4(a,b,b.V(null)):O4(a,b,b.V(null));c=J4?J4(a,b):K4.call(null,a,b);if(p(e)){e=p(h)?Ip:Zd.h(uh(k));var l=M4(a,b,e,null);a=N4(a,l,e,b,k,null);return Ql(PU(q.h(a),nk(c)),ok(c))}a=uh(k);return Ql(PU(a,nk(c)),ok(c))} +function Afa(a,b){var c=b.xb(null);if(A.g(null,c))return s4(a,b,"Unexpected EOF.");if(A.g("!",c))return F4(b),b;if(A.g('"',c)){c=aM.h(a);if(p(c)){var d=ufa(a,b);return!0===c?rm(d):c.h?c.h(d):c.call(null,d)}return s4(a,b,"Regex not allowed. Use the `:regex` option")}if(A.g("#",c))return b.V(null),B4.j?B4.j(b,null,null):B4.call(null,b,null,null);if(A.g("'",c))return c=tv.h(a),p(c)?(b.V(null),d=J4?J4(a,b):K4.call(null,a,b),q4===d&&s4(a,b,"EOF while reading"),!0===c?new H(null,zo,new H(null,d,null,1, +null),2,null):c.h?c.h(d):c.call(null,d)):s4(a,b,"Var literal not allowed. Use the `:var` option");if(A.g("(",c)){c=xy.h(a);if(p(c)){if(p(VK.h(a)))return s4(a,b,"Nested fn literals not allowed.");d=function(){var h=Ve.j(a,VK,!0);return J4?J4(h,b):K4.call(null,h,b)}();return!0===c?nfa(d):c.h?c.h(d):c.call(null,d)}return s4(a,b,"Function literal not allowed. Use the `:fn` option")}if(A.g(":",c))return b.V(null),zfa(a,b);if(A.g("{",c))return wfa(a,b);if(A.g("\x3d",c))return c=dF.h(a),p(c)?(b.V(null), +d=J4?J4(a,b):K4.call(null,a,b),!0===c?new H(null,qba,new H(null,d,null,1,null),2,null):c.h?c.h(d):c.call(null,d)):s4(a,b,"Read-eval not allowed. Use the `:read-eval` option");if(A.g("?",c))return p(xz.h(a))||s4(a,b,"Conditional read not allowed."),b.V(null),yfa(a,b);if(A.g("_",c)){b.V(null);c=Zx.h(a);d=J4?J4(a,b):K4.call(null,a,b);if(p(c)){var e=J4?J4(a,b):K4.call(null,a,b);if(q4===e)return q4;d=new n(null,2,[Zx,d,uv,e],null);return c.h?c.h(d):c.call(null,d)}return b}a:switch(c){case "^":case "'":case "(":case "{":case '"':case "!":case "_":case "?":case ":":case "#":c= +!0;break a;default:c=!1}if(p(c))return b.Wb(null,"#"),C4(a,b);c=gr.h(a);if(p(c))return J4?J4(a,b):K4.call(null,a,b),J4?J4(a,b):K4.call(null,a,b);var f=J4?J4(a,b):K4.call(null,a,b);c=J4?J4(a,b):K4.call(null,a,b);d=function(){var h=TP.h(a);h=p(h)?h.h?h.h(f):h.call(null,f):null;return p(h)?h:lfa.call(null,f)}();if(p(d))return d.h?d.h(c):d.call(null,c);throw Error(["No reader function for tag ",q.h(f)].join(""));} +function Bfa(a,b){var c=bV(b)?E4(b):null,d=I4(a,b,"}"),e=Ce(d);if(0=e?Kb.g(ul,d):Kb.g(tl,d)} function Cfa(a,b){b.V(null);var c=b.V(null);p(v4(c))&&s4(a,b,"Invalid token: :");c=w4(b,c);var d=":"===c.charAt(0);if(d){var e=d?fh.g(c,1):c;d=x4.h?x4.h(e):x4.call(null,e);c=D.j(d,0,null);d=D.j(d,1,null);if(p(c)){var f=M4(a,b,e,null);e=Zd.h(c);a=N4(a,f,e,b,c,null)}else f=M4(a,b,e,"Use `:auto-resolve` + `:current` to resolve current namespace."),a=N4(a,f,Ip,b,e,"Use `:auto-resolve` + `:current` to resolve current namespace.");return th.g(q.h(a),d)}return th.h(c)} function Dfa(a){return a instanceof z?Xe([a,!0]):a instanceof x?new n(null,1,[RL,a],null):"string"===typeof a?new n(null,1,[RL,a],null):a}function Efa(a,b){return a instanceof z?Xe([b.h?b.h(a):b.call(null,a),b.h?b.h(!0):b.call(null,!0)]):a instanceof x?Xe([b.h?b.h(RL):b.call(null,RL),b.h?b.h(a):b.call(null,a)]):"string"===typeof a?Xe([b.h?b.h(RL):b.call(null,RL),b.h?b.h(a):b.call(null,a)]):a} -function P4(a,b,c){var d=bV(b);if(A.g("#",c))return b.V(null),Afa(a,b);if(A.g(null,c))return q4;if(A.g("@",c))return c=PN.h(a),p(c)?(d=c,b.V(null),c=J4?J4(a,b):K4.call(null,a,b),!0===d?new H(null,kO,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)):s4(a,b,"Deref not allowed. Use the `:deref` option");if(A.g("`",c))return c=gT.h(a),p(c)?(d=c,b.V(null),c=J4?J4(a,b):K4.call(null,a,b),!0===d||lf(d)?(d=Ei.h(Wh),d=Ve.j(a,Yx,d),m4(d,b,c)):d.h?d.h(c):d.call(null,c)):s4(a,b,"Syntax quote not allowed. Use the `:syntax-quote` option"); -if(A.g('"',c))return tfa(a,b);if(A.g("'",c))return c=RP.h(a),p(c)?(d=c,b.V(null),c=J4?J4(a,b):K4.call(null,a,b),q4===c&&s4(a,b,"EOF while reading"),!0===d?new H(null,Ao,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)):C4(a,b);if(A.g("(",c))return Kb.g(K,I4(a,b,")"));if(A.g(")",c)){var e=iT.h(a);if(Yh.g(e,c))return d=d?E4(b):null,b.V(null),u4(a,b,["Unmatched delimiter: ",q.h(c),p(e)?[", expected: ",q.h(e),function(){var f=CP.h(a);if(p(f)){var h=Vh(f);f=Yd.g(h,jp);var k=Yd.g(h,LH);h=Yd.g(h, -YN);return[" to match ",q.h(h)," at ",q.h(new R(null,2,5,S,[f,k],null))].join("")}return null}()].join(""):null].join(""),function(){var f=CP.h(a),h=Vh(f);f=Yd.g(h,YN);var k=Yd.g(h,jp);h=Yd.g(h,LH);return new n(null,3,[iq,q.h(f),Hu,new n(null,2,[jp,k,LH,h],null),BQ,q.h(e)],null)}(),d);b.V(null);return r4}if(A.g(":",c))return Cfa(a,b);if(A.g(";",c))return F4(b);if(A.g("[",c))return I4(a,b,"]");if(A.g("{",c))return Bfa(a,b);if(A.g("\\",c))return c=b.V(null),A4.j?A4.j(b,c,null):A4.call(null,b,c,null); -if(A.g("]",c)){e=iT.h(a);if(Yh.g(e,c))return d=d?E4(b):null,b.V(null),u4(a,b,["Unmatched delimiter: ",q.h(c),p(e)?[", expected: ",q.h(e),function(){var f=CP.h(a);if(p(f)){var h=Vh(f);f=Yd.g(h,jp);var k=Yd.g(h,LH);h=Yd.g(h,YN);return[" to match ",q.h(h)," at ",q.h(new R(null,2,5,S,[f,k],null))].join("")}return null}()].join(""):null].join(""),function(){var f=CP.h(a),h=Vh(f);f=Yd.g(h,YN);var k=Yd.g(h,jp);h=Yd.g(h,LH);return new n(null,3,[iq,q.h(f),Hu,new n(null,2,[jp,k,LH,h],null),BQ,q.h(e)],null)}(), -d);b.V(null);return r4}if(A.g("}",c)){e=iT.h(a);if(Yh.g(e,c))return d=d?E4(b):null,b.V(null),u4(a,b,["Unmatched delimiter: ",q.h(c),p(e)?[", expected: ",q.h(e),function(){var f=CP.h(a);if(p(f)){var h=Vh(f);f=Yd.g(h,jp);var k=Yd.g(h,LH);h=Yd.g(h,YN);return[" to match ",q.h(h)," at ",q.h(new R(null,2,5,S,[f,k],null))].join("")}return null}()].join(""):null].join(""),function(){var f=CP.h(a),h=Vh(f);f=Yd.g(h,YN);var k=Yd.g(h,jp);h=Yd.g(h,LH);return new n(null,3,[iq,q.h(f),Hu,new n(null,2,[jp,k,LH,h], -null),BQ,q.h(e)],null)}(),d);b.V(null);return r4}if(A.g("^",c))return b.V(null),c=Q4?Q4(a,b,!0):K4.call(null,a,b,!0),Xh.j(J4?J4(a,b):K4.call(null,a,b),zl,c);if(A.g("~",c)){c=function(){var f=gT.h(a);return p(f)?(f=Vv.h(a),p(f)?f:!0):f}();if(p(c)){d=c;b.V(null);if("@"===b.xb(null))return d=function(){var f=gT.h(a);return p(f)?(f=Ws.h(a),p(f)?f:!0):f}(),p(d)?(b.V(null),c=J4?J4(a,b):K4.call(null,a,b),!0===d?new H(null,uS,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)):s4(a,b,"Syntax unquote splice not allowed. Use the `:syntax-quote` option"); -c=J4?J4(a,b):K4.call(null,a,b);return!0===d?new H(null,qQ,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)}return s4(a,b,"Syntax unquote not allowed. Use the `:syntax-unquote` option")}c=b.V(null);return p(y4.g?y4.g(b,c):y4.call(null,b,c))?sfa(a,b,c):O4(a,b,c)}var Ffa=Error; +function P4(a,b,c){var d=bV(b);if(A.g("#",c))return b.V(null),Afa(a,b);if(A.g(null,c))return q4;if(A.g("@",c))return c=PN.h(a),p(c)?(d=c,b.V(null),c=J4?J4(a,b):K4.call(null,a,b),!0===d?new H(null,kO,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)):s4(a,b,"Deref not allowed. Use the `:deref` option");if(A.g("`",c))return c=jT.h(a),p(c)?(d=c,b.V(null),c=J4?J4(a,b):K4.call(null,a,b),!0===d||lf(d)?(d=Ei.h(Wh),d=Ve.j(a,Xx,d),m4(d,b,c)):d.h?d.h(c):d.call(null,c)):s4(a,b,"Syntax quote not allowed. Use the `:syntax-quote` option"); +if(A.g('"',c))return tfa(a,b);if(A.g("'",c))return c=UP.h(a),p(c)?(d=c,b.V(null),c=J4?J4(a,b):K4.call(null,a,b),q4===c&&s4(a,b,"EOF while reading"),!0===d?new H(null,Ao,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)):C4(a,b);if(A.g("(",c))return Kb.g(K,I4(a,b,")"));if(A.g(")",c)){var e=lT.h(a);if(Yh.g(e,c))return d=d?E4(b):null,b.V(null),u4(a,b,["Unmatched delimiter: ",q.h(c),p(e)?[", expected: ",q.h(e),function(){var f=EP.h(a);if(p(f)){var h=Vh(f);f=Yd.g(h,jp);var k=Yd.g(h,LH);h=Yd.g(h, +YN);return[" to match ",q.h(h)," at ",q.h(new R(null,2,5,S,[f,k],null))].join("")}return null}()].join(""):null].join(""),function(){var f=EP.h(a),h=Vh(f);f=Yd.g(h,YN);var k=Yd.g(h,jp);h=Yd.g(h,LH);return new n(null,3,[hq,q.h(f),Gu,new n(null,2,[jp,k,LH,h],null),FQ,q.h(e)],null)}(),d);b.V(null);return r4}if(A.g(":",c))return Cfa(a,b);if(A.g(";",c))return F4(b);if(A.g("[",c))return I4(a,b,"]");if(A.g("{",c))return Bfa(a,b);if(A.g("\\",c))return c=b.V(null),A4.j?A4.j(b,c,null):A4.call(null,b,c,null); +if(A.g("]",c)){e=lT.h(a);if(Yh.g(e,c))return d=d?E4(b):null,b.V(null),u4(a,b,["Unmatched delimiter: ",q.h(c),p(e)?[", expected: ",q.h(e),function(){var f=EP.h(a);if(p(f)){var h=Vh(f);f=Yd.g(h,jp);var k=Yd.g(h,LH);h=Yd.g(h,YN);return[" to match ",q.h(h)," at ",q.h(new R(null,2,5,S,[f,k],null))].join("")}return null}()].join(""):null].join(""),function(){var f=EP.h(a),h=Vh(f);f=Yd.g(h,YN);var k=Yd.g(h,jp);h=Yd.g(h,LH);return new n(null,3,[hq,q.h(f),Gu,new n(null,2,[jp,k,LH,h],null),FQ,q.h(e)],null)}(), +d);b.V(null);return r4}if(A.g("}",c)){e=lT.h(a);if(Yh.g(e,c))return d=d?E4(b):null,b.V(null),u4(a,b,["Unmatched delimiter: ",q.h(c),p(e)?[", expected: ",q.h(e),function(){var f=EP.h(a);if(p(f)){var h=Vh(f);f=Yd.g(h,jp);var k=Yd.g(h,LH);h=Yd.g(h,YN);return[" to match ",q.h(h)," at ",q.h(new R(null,2,5,S,[f,k],null))].join("")}return null}()].join(""):null].join(""),function(){var f=EP.h(a),h=Vh(f);f=Yd.g(h,YN);var k=Yd.g(h,jp);h=Yd.g(h,LH);return new n(null,3,[hq,q.h(f),Gu,new n(null,2,[jp,k,LH,h], +null),FQ,q.h(e)],null)}(),d);b.V(null);return r4}if(A.g("^",c))return b.V(null),c=Q4?Q4(a,b,!0):K4.call(null,a,b,!0),Xh.j(J4?J4(a,b):K4.call(null,a,b),zl,c);if(A.g("~",c)){c=function(){var f=jT.h(a);return p(f)?(f=Tv.h(a),p(f)?f:!0):f}();if(p(c)){d=c;b.V(null);if("@"===b.xb(null))return d=function(){var f=jT.h(a);return p(f)?(f=Us.h(a),p(f)?f:!0):f}(),p(d)?(b.V(null),c=J4?J4(a,b):K4.call(null,a,b),!0===d?new H(null,vS,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)):s4(a,b,"Syntax unquote splice not allowed. Use the `:syntax-quote` option"); +c=J4?J4(a,b):K4.call(null,a,b);return!0===d?new H(null,uQ,new H(null,c,null,1,null),2,null):d.h?d.h(c):d.call(null,c)}return s4(a,b,"Syntax unquote not allowed. Use the `:syntax-unquote` option")}c=b.V(null);return p(y4.g?y4.g(b,c):y4.call(null,b,c))?sfa(a,b,c):O4(a,b,c)}var Ffa=Error; function K4(a){switch(arguments.length){case 2:return J4(arguments[0],arguments[1]);case 3:return Q4(arguments[0],arguments[1],arguments[2]);default:throw Error(["Invalid arity: ",q.h(arguments.length)].join(""));}}function J4(a,b){return Q4(a,b,null)} -function Q4(a,b,c){for(;;){var d=bV(b),e=function(){var G=G4(b);return p(G)?SU(b):G}();if(p(e)){var f=e,h=d?E4(b):null,k=PA.h(a),l=p(k)?Wu.h(w(b.frames)):null,g=p(k)?l.getLength():null,t=p(k)?uca(b,function(G,I,ea,fa,ia,sa,va,ya){return function(){return P4(G,I,ya)}}(a,b,c,h,k,l,g,f,e,d)):P4(a,b,f);if(b!==t){if(r4===t)return t;var r=aba.h(a),y=p(r)?function(){if(uf(t)&&A.g(ro,u(t)))try{var G=rfa(t)}catch(ea){if(ea instanceof Ffa)G=null;else throw ea;}else G=null;if(p(G)){var I=RA.h(a);return p(I)? -Gi(I,Ve.j(BM.h(G),Ip,U.h(G))):null}return null}():null,B=gJ.h(a),J=Xq.h(a),P=nv.h(a),V=null!=t?t.B&262144||$a===t.ke?!0:t.B?!1:zb(Gc,t):zb(Gc,t),ba=p(k)?fh.g(q.h(l),g).trim():null,da=function(){var G=d;if(G){if(G=V)G=(G=vb(J))?G:J.h?J.h(t):J.call(null,t);return p(G)?G:B}return G}(),ha=p(function(){var G=d;return G?(G=da,p(G)?P:G):G}())?E4(b):null,na=p(da)?jp.h(h):null,oa=p(P)?jp.h(ha):null,ma=p(da)?LH.h(h):null,M=p(P)?LH.h(ha):null,E=p(B)?function(G,I,ea,fa,ia,sa,va,ya,za,Ba,Ha,Na,Ea,Ga,Sa,Xa){return function(lb){var Jb= -function(){var dc=new n(null,1,[Vz,lb],null);dc=p(Ha)?Ve.j(dc,OS,function(){var rc=Xe([tS.h(G),Ea,Vr.h(G),Sa]);return p(ya)?Ve.l(rc,Hy.h(G),Ga,F([wT.h(G),Xa])):rc}()):dc;return p(Ba)?Ve.j(dc,function(){var rc=xP.h(G);return p(rc)?rc:PA}(),Ba):dc}();return sa.h?sa.h(Jb):sa.call(null,Jb)}}(a,b,c,r,y,B,J,P,V,ba,da,ha,na,oa,ma,M,h,k,l,g,t,f,e,d):null,N=p(c)?p(E)?Efa(t,E):Dfa(t):t;return p(B)?E.h?E.h(N):E.call(null,N):p(da)?Xh.g(N,function(G,I,ea,fa,ia,sa,va,ya,za,Ba,Ha,Na,Ea,Ga,Sa,Xa){return function(lb){lb= -Ve.j(Ve.j(lb,tS.h(G),Ea),Vr.h(G),Sa);lb=p(ya)?Ve.j(Ve.j(lb,Hy.h(G),Ga),wT.h(G),Xa):lb;return p(Ba)?Ve.j(lb,xP.h(G),Ba):lb}}(a,b,c,r,y,B,J,P,V,ba,da,ha,na,oa,ma,M,E,N,h,k,l,g,t,f,e,d)):N}}else return q4}} +function Q4(a,b,c){for(;;){var d=bV(b),e=function(){var G=G4(b);return p(G)?SU(b):G}();if(p(e)){var f=e,h=d?E4(b):null,k=OA.h(a),l=p(k)?Vu.h(w(b.frames)):null,g=p(k)?l.getLength():null,t=p(k)?uca(b,function(G,I,ea,fa,ia,sa,va,ya){return function(){return P4(G,I,ya)}}(a,b,c,h,k,l,g,f,e,d)):P4(a,b,f);if(b!==t){if(r4===t)return t;var r=aba.h(a),y=p(r)?function(){if(uf(t)&&A.g(ro,u(t)))try{var G=rfa(t)}catch(ea){if(ea instanceof Ffa)G=null;else throw ea;}else G=null;if(p(G)){var I=QA.h(a);return p(I)? +Gi(I,Ve.j(zM.h(G),Ip,U.h(G))):null}return null}():null,B=gJ.h(a),J=Vq.h(a),P=mv.h(a),V=null!=t?t.B&262144||$a===t.ke?!0:t.B?!1:zb(Gc,t):zb(Gc,t),ba=p(k)?fh.g(q.h(l),g).trim():null,da=function(){var G=d;if(G){if(G=V)G=(G=vb(J))?G:J.h?J.h(t):J.call(null,t);return p(G)?G:B}return G}(),ha=p(function(){var G=d;return G?(G=da,p(G)?P:G):G}())?E4(b):null,na=p(da)?jp.h(h):null,oa=p(P)?jp.h(ha):null,ma=p(da)?LH.h(h):null,M=p(P)?LH.h(ha):null,E=p(B)?function(G,I,ea,fa,ia,sa,va,ya,za,Ba,Ha,Na,Ea,Ga,Sa,Xa){return function(lb){var Jb= +function(){var dc=new n(null,1,[Wz,lb],null);dc=p(Ha)?Ve.j(dc,RS,function(){var rc=Xe([uS.h(G),Ea,Tr.h(G),Sa]);return p(ya)?Ve.l(rc,Jy.h(G),Ga,F([yT.h(G),Xa])):rc}()):dc;return p(Ba)?Ve.j(dc,function(){var rc=xP.h(G);return p(rc)?rc:OA}(),Ba):dc}();return sa.h?sa.h(Jb):sa.call(null,Jb)}}(a,b,c,r,y,B,J,P,V,ba,da,ha,na,oa,ma,M,h,k,l,g,t,f,e,d):null,N=p(c)?p(E)?Efa(t,E):Dfa(t):t;return p(B)?E.h?E.h(N):E.call(null,N):p(da)?Xh.g(N,function(G,I,ea,fa,ia,sa,va,ya,za,Ba,Ha,Na,Ea,Ga,Sa,Xa){return function(lb){lb= +Ve.j(Ve.j(lb,uS.h(G),Ea),Tr.h(G),Sa);lb=p(ya)?Ve.j(Ve.j(lb,Jy.h(G),Ga),yT.h(G),Xa):lb;return p(Ba)?Ve.j(lb,xP.h(G),Ba):lb}}(a,b,c,r,y,B,J,P,V,ba,da,ha,na,oa,ma,M,E,N,h,k,l,g,t,f,e,d)):N}}else return q4}} function R4(a,b,c,d,e,f,h,k,l,g,t,r,y,B,J,P,V,ba,da,ha,na,oa,ma){this.dispatch=a;this.deref=b;this.Ta=c;this.Ua=d;this.Va=e;this.quote=f;this.na=h;this.Aa=k;this.Pa=l;this.Qa=g;this.Ra=t;this.Ia=r;this.La=y;this.Ja=B;this.source=J;this.Sa=P;this.Oa=V;this.Ma=ba;this.Ka=da;this.Na=ha;this.F=na;this.v=oa;this.D=ma;this.B=2230716170;this.H=139264}m=R4.prototype;m.ea=function(a,b){return this.I(null,b,null)}; m.I=function(a,b,c){switch(b instanceof z?b.X:null){case "dispatch":return this.dispatch;case "deref":return this.deref;case "syntax-quote":return this.Ta;case "unquote":return this.Ua;case "unquote-splicing":return this.Va;case "quote":return this.quote;case "fn":return this.na;case "var":return this.Aa;case "read-eval":return this.Pa;case "regex":return this.Qa;case "row-key":return this.Ra;case "col-key":return this.Ia;case "end-row-key":return this.La;case "end-col-key":return this.Ja;case "source":return this.source; case "source-key":return this.Sa;case "postprocess":return this.Oa;case "location?":return this.Ma;case "end-location":return this.Ka;case "ns-state":return this.Na;default:return Yd.j(this.v,b,c)}};m.hb=function(a,b,c){return Rb.j(function(d,e){var f=D.j(e,0,null);e=D.j(e,1,null);return b.j?b.j(d,f,e):b.call(null,d,f,e)},c,this)}; -m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#edamame.impl.parser.Options{",", ","}",c,O.g(new R(null,20,5,S,[new R(null,2,5,S,[Qx,this.dispatch],null),new R(null,2,5,S,[PN,this.deref],null),new R(null,2,5,S,[gT,this.Ta],null),new R(null,2,5,S,[Vv,this.Ua],null),new R(null,2,5,S,[Ws,this.Va],null),new R(null,2,5,S,[RP,this.quote],null),new R(null,2,5,S,[wy,this.na],null),new R(null,2,5,S,[vv,this.Aa],null),new R(null,2,5,S,[iF,this.Pa],null),new R(null,2,5,S,[aM,this.Qa], -null),new R(null,2,5,S,[tS,this.Ra],null),new R(null,2,5,S,[Vr,this.Ia],null),new R(null,2,5,S,[Hy,this.La],null),new R(null,2,5,S,[wT,this.Ja],null),new R(null,2,5,S,[PA,this.source],null),new R(null,2,5,S,[xP,this.Sa],null),new R(null,2,5,S,[gJ,this.Oa],null),new R(null,2,5,S,[Xq,this.Ma],null),new R(null,2,5,S,[nv,this.Ka],null),new R(null,2,5,S,[RA,this.Na],null)],null),this.v))}; -m.Ba=function(){return new hk(this,20,new R(null,20,5,S,[Qx,PN,gT,Vv,Ws,RP,wy,vv,iF,aM,tS,Vr,Hy,wT,PA,xP,gJ,Xq,nv,RA],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 20+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-1037796634^je(this)}; +m.J=function(a,b,c){return sm(b,function(d){return sm(b,Am,""," ","",c,d)},"#edamame.impl.parser.Options{",", ","}",c,O.g(new R(null,20,5,S,[new R(null,2,5,S,[Px,this.dispatch],null),new R(null,2,5,S,[PN,this.deref],null),new R(null,2,5,S,[jT,this.Ta],null),new R(null,2,5,S,[Tv,this.Ua],null),new R(null,2,5,S,[Us,this.Va],null),new R(null,2,5,S,[UP,this.quote],null),new R(null,2,5,S,[xy,this.na],null),new R(null,2,5,S,[tv,this.Aa],null),new R(null,2,5,S,[dF,this.Pa],null),new R(null,2,5,S,[aM,this.Qa], +null),new R(null,2,5,S,[uS,this.Ra],null),new R(null,2,5,S,[Tr,this.Ia],null),new R(null,2,5,S,[Jy,this.La],null),new R(null,2,5,S,[yT,this.Ja],null),new R(null,2,5,S,[OA,this.source],null),new R(null,2,5,S,[xP,this.Sa],null),new R(null,2,5,S,[gJ,this.Oa],null),new R(null,2,5,S,[Vq,this.Ma],null),new R(null,2,5,S,[mv,this.Ka],null),new R(null,2,5,S,[QA,this.Na],null)],null),this.v))}; +m.Ba=function(){return new hk(this,20,new R(null,20,5,S,[Px,PN,jT,Tv,Us,UP,xy,tv,dF,aM,uS,Tr,Jy,yT,OA,xP,gJ,Vq,mv,QA],null),p(this.v)?Id(this.v):ai())};m.P=function(){return this.F};m.Z=function(){return 20+Ce(this.v)};m.U=function(){var a=this.D;return null!=a?a:this.D=a=-1037796634^je(this)}; m.T=function(a,b){return null!=b&&this.constructor===b.constructor&&A.g(this.dispatch,b.dispatch)&&A.g(this.deref,b.deref)&&A.g(this.Ta,b.Ta)&&A.g(this.Ua,b.Ua)&&A.g(this.Va,b.Va)&&A.g(this.quote,b.quote)&&A.g(this.na,b.na)&&A.g(this.xg,b.xg)&&A.g(this.Pa,b.Pa)&&A.g(this.Qa,b.Qa)&&A.g(this.Ra,b.Ra)&&A.g(this.Ia,b.Ia)&&A.g(this.La,b.La)&&A.g(this.Ja,b.Ja)&&A.g(this.source,b.source)&&A.g(this.Sa,b.Sa)&&A.g(this.Oa,b.Oa)&&A.g(this.Ma,b.Ma)&&A.g(this.Ka,b.Ka)&&A.g(this.Na,b.Na)&&A.g(this.v,b.v)}; -m.kb=function(a,b){return Af(new El(null,new n(null,20,[wy,null,Ws,null,nv,null,Xq,null,Vv,null,Hy,null,tS,null,Vr,null,xP,null,iF,null,RA,null,PA,null,Qx,null,gT,null,vv,null,RP,null,PN,null,aM,null,wT,null,gJ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,Zh(Ye.g(this.v,b)),null)}; +m.kb=function(a,b){return Af(new El(null,new n(null,20,[xy,null,Us,null,mv,null,Vq,null,Tv,null,Jy,null,uS,null,Tr,null,xP,null,dF,null,QA,null,OA,null,Px,null,jT,null,tv,null,UP,null,PN,null,aM,null,yT,null,gJ,null],null),null),b)?Ye.g(Hc(jj.g(Wh,this),this.F),b):new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,Zh(Ye.g(this.v,b)),null)}; m.ab=function(a,b){switch(b instanceof z?b.X:null){case "dispatch":case "deref":case "syntax-quote":case "unquote":case "unquote-splicing":case "quote":case "fn":case "var":case "read-eval":case "regex":case "row-key":case "col-key":case "end-row-key":case "end-col-key":case "source":case "source-key":case "postprocess":case "location?":case "end-location":case "ns-state":return!0;default:return Af(this.v,b)}}; -m.ca=function(a,b,c){return p(nh.g?nh.g(Qx,b):nh.call(null,Qx,b))?new R4(c,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(PN,b):nh.call(null,PN,b))?new R4(this.dispatch,c,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(gT, -b):nh.call(null,gT,b))?new R4(this.dispatch,this.deref,c,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Vv,b):nh.call(null,Vv,b))?new R4(this.dispatch,this.deref,this.Ta,c,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Ws,b):nh.call(null,Ws,b))?new R4(this.dispatch, -this.deref,this.Ta,this.Ua,c,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(RP,b):nh.call(null,RP,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,c,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(wy,b):nh.call(null,wy,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va, -this.quote,c,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(vv,b):nh.call(null,vv,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,c,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(iF,b):nh.call(null,iF,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,c,this.Qa, -this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(aM,b):nh.call(null,aM,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,c,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(tS,b):nh.call(null,tS,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,c,this.Ia,this.La,this.Ja, -this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Vr,b):nh.call(null,Vr,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,c,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Hy,b):nh.call(null,Hy,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,c,this.Ja,this.source,this.Sa,this.Oa,this.Ma, -this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(wT,b):nh.call(null,wT,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,c,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(PA,b):nh.call(null,PA,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,c,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null): -p(nh.g?nh.g(xP,b):nh.call(null,xP,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,c,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(gJ,b):nh.call(null,gJ,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,c,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Xq,b):nh.call(null, -Xq,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,c,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(nv,b):nh.call(null,nv,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,c,this.Na,this.F,this.v,null):p(nh.g?nh.g(RA,b):nh.call(null,RA,b))?new R4(this.dispatch,this.deref, +m.ca=function(a,b,c){return p(nh.g?nh.g(Px,b):nh.call(null,Px,b))?new R4(c,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(PN,b):nh.call(null,PN,b))?new R4(this.dispatch,c,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(jT, +b):nh.call(null,jT,b))?new R4(this.dispatch,this.deref,c,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Tv,b):nh.call(null,Tv,b))?new R4(this.dispatch,this.deref,this.Ta,c,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Us,b):nh.call(null,Us,b))?new R4(this.dispatch, +this.deref,this.Ta,this.Ua,c,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(UP,b):nh.call(null,UP,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,c,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(xy,b):nh.call(null,xy,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va, +this.quote,c,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(tv,b):nh.call(null,tv,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,c,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(dF,b):nh.call(null,dF,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,c,this.Qa, +this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(aM,b):nh.call(null,aM,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,c,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(uS,b):nh.call(null,uS,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,c,this.Ia,this.La,this.Ja, +this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Tr,b):nh.call(null,Tr,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,c,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Jy,b):nh.call(null,Jy,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,c,this.Ja,this.source,this.Sa,this.Oa,this.Ma, +this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(yT,b):nh.call(null,yT,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,c,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(OA,b):nh.call(null,OA,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,c,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null): +p(nh.g?nh.g(xP,b):nh.call(null,xP,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,c,this.Oa,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(gJ,b):nh.call(null,gJ,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,c,this.Ma,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(Vq,b):nh.call(null, +Vq,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,c,this.Ka,this.Na,this.F,this.v,null):p(nh.g?nh.g(mv,b):nh.call(null,mv,b))?new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,c,this.Na,this.F,this.v,null):p(nh.g?nh.g(QA,b):nh.call(null,QA,b))?new R4(this.dispatch,this.deref, this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,c,this.F,this.v,null):new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,this.F,Ve.j(this.v,b,c),null)}; -m.W=function(){return C(O.g(new R(null,20,5,S,[new Cf(Qx,this.dispatch),new Cf(PN,this.deref),new Cf(gT,this.Ta),new Cf(Vv,this.Ua),new Cf(Ws,this.Va),new Cf(RP,this.quote),new Cf(wy,this.na),new Cf(vv,this.Aa),new Cf(iF,this.Pa),new Cf(aM,this.Qa),new Cf(tS,this.Ra),new Cf(Vr,this.Ia),new Cf(Hy,this.La),new Cf(wT,this.Ja),new Cf(PA,this.source),new Cf(xP,this.Sa),new Cf(gJ,this.Oa),new Cf(Xq,this.Ma),new Cf(nv,this.Ka),new Cf(RA,this.Na)],null),this.v))}; +m.W=function(){return C(O.g(new R(null,20,5,S,[new Cf(Px,this.dispatch),new Cf(PN,this.deref),new Cf(jT,this.Ta),new Cf(Tv,this.Ua),new Cf(Us,this.Va),new Cf(UP,this.quote),new Cf(xy,this.na),new Cf(tv,this.Aa),new Cf(dF,this.Pa),new Cf(aM,this.Qa),new Cf(uS,this.Ra),new Cf(Tr,this.Ia),new Cf(Jy,this.La),new Cf(yT,this.Ja),new Cf(OA,this.source),new Cf(xP,this.Sa),new Cf(gJ,this.Oa),new Cf(Vq,this.Ma),new Cf(mv,this.Ka),new Cf(QA,this.Na)],null),this.v))}; m.S=function(a,b){return new R4(this.dispatch,this.deref,this.Ta,this.Ua,this.Va,this.quote,this.na,this.Aa,this.Pa,this.Qa,this.Ra,this.Ia,this.La,this.Ja,this.source,this.Sa,this.Oa,this.Ma,this.Ka,this.Na,b,this.v,this.D)};m.$=function(a,b){return nf(b)?this.ca(null,ac(b,0),ac(b,1)):Rb.j(Zb,this,b)}; -function Gfa(a){var b=Ye.l(a,Qx,F([PN,gT,Vv,Ws,RP,wy,vv,iF,aM,tS,Vr,Hy,wT,PA,xP,gJ,Xq,nv,RA]));b=mf(a)?jj.g(Wh,b):b;return new R4(Qx.h(a),PN.h(a),gT.h(a),Vv.h(a),Ws.h(a),RP.h(a),wy.h(a),vv.h(a),iF.h(a),aM.h(a),tS.h(a),Vr.h(a),Hy.h(a),wT.h(a),PA.h(a),xP.h(a),gJ.h(a),Xq.h(a),nv.h(a),RA.h(a),null,Zh(b),null)};function S4(a,b){if(null!=a&&null!=a.Md)a=a.Md(a,b);else{var c=S4[ca(null==a?null:a)];if(null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else if(c=S4._,null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else throw Bb("IBox.setVal",a);}return a}function T4(a){if(null!=a&&null!=a.mc)a=a.mc(a);else{var b=T4[ca(null==a?null:a)];if(null!=b)a=b.h?b.h(a):b.call(null,a);else if(b=T4._,null!=b)a=b.h?b.h(a):b.call(null,a);else throw Bb("IBox.getVal",a);}return a} +function Gfa(a){var b=Ye.l(a,Px,F([PN,jT,Tv,Us,UP,xy,tv,dF,aM,uS,Tr,Jy,yT,OA,xP,gJ,Vq,mv,QA]));b=mf(a)?jj.g(Wh,b):b;return new R4(Px.h(a),PN.h(a),jT.h(a),Tv.h(a),Us.h(a),UP.h(a),xy.h(a),tv.h(a),dF.h(a),aM.h(a),uS.h(a),Tr.h(a),Jy.h(a),yT.h(a),OA.h(a),xP.h(a),gJ.h(a),Vq.h(a),mv.h(a),QA.h(a),null,Zh(b),null)};function S4(a,b){if(null!=a&&null!=a.Md)a=a.Md(a,b);else{var c=S4[ca(null==a?null:a)];if(null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else if(c=S4._,null!=c)a=c.g?c.g(a,b):c.call(null,a,b);else throw Bb("IBox.setVal",a);}return a}function T4(a){if(null!=a&&null!=a.mc)a=a.mc(a);else{var b=T4[ca(null==a?null:a)];if(null!=b)a=b.h?b.h(a):b.call(null,a);else if(b=T4._,null!=b)a=b.h?b.h(a):b.call(null,a);else throw Bb("IBox.getVal",a);}return a} function U4(a){if(null!=a&&null!=a.sg)a=a.ef;else{var b=U4[ca(null==a?null:a)];if(null!=b)a=b.h?b.h(a):b.call(null,a);else if(b=U4._,null!=b)a=b.h?b.h(a):b.call(null,a);else throw Bb("IReified.getMethods",a);}return a}function V4(a,b){this.ef=a;this.lg=b}V4.prototype.rg=$a;V4.prototype.sg=function(){return this.ef}; function W4(a,b,c){if(null!=a&&null!=a.vf)a=a.vf(a,b,c);else{var d=W4[ca(null==a?null:a)];if(null!=d)a=d.j?d.j(a,b,c):d.call(null,a,b,c);else if(d=W4._,null!=d)a=d.j?d.j(a,b,c):d.call(null,a,b,c);else throw Bb("SciTypeInstance.-mutate",a);}return a}var X4=function X4(a){for(var c=[],d=arguments.length,e=0;;)if(eE:E:I)&&B7("Can't have fixed arity function with more params than variadic function",b);return qj.u(qj.u(Ve.l(oa,RT,fa,F([bz,ea>M?ea:M])),dA,Re,Ve.j(G,VD,ma)),T,Re,N)},new n(null,4,[dA,Se,T,Se,CF,null,bz,-1],null),e);e=nj.g(w(g),d);e=Kb.g(zl,ri.g(ru,ok(e)));var y=p(t)?Af(e,l):null,B=fj.g(k,nk(e)),J=nj.g(w(g),Re.g(df(d),ru));d=p(J)?Ql(B,kj.g(J,B)):null;var P=Ce(B);e=Ql(B,cm.h(P));var V=p(t)?Ve.j(e,l,P):e;d=(p(y)? -y:C(d))?function(){var oa=p(t)?P+1:P,ma=Pb.h(Ci.g(function(M){var E=Yd.g(J,M);if(p(E)){M=Yd.g(V,M);var N=Hh.h(2);N[0]=E;N[1]=M;return N}return null},B));return new R(null,2,5,S,[function(M){for(var E=ma.length,N=0,G=Hh.h(oa);;)if(NE:E:I)&&B7("Can't have fixed arity function with more params than variadic function",b);return qj.u(qj.u(Ve.l(oa,TT,fa,F([cz,ea>M?ea:M])),eA,Re,Ve.j(G,UD,ma)),T,Re,N)},new n(null,4,[eA,Se,T,Se,AF,null,cz,-1],null),e);e=nj.g(w(g),d);e=Kb.g(zl,ri.g(qu,ok(e)));var y=p(t)?Af(e,l):null,B=fj.g(k,nk(e)),J=nj.g(w(g),Re.g(df(d),qu));d=p(J)?Ql(B,kj.g(J,B)):null;var P=Ce(B);e=Ql(B,cm.h(P));var V=p(t)?Ve.j(e,l,P):e;d=(p(y)? +y:C(d))?function(){var oa=p(t)?P+1:P,ma=Pb.h(Ci.g(function(M){var E=Yd.g(J,M);if(p(E)){M=Yd.g(V,M);var N=Hh.h(2);N[0]=E;N[1]=M;return N}return null},B));return new R(null,2,5,S,[function(M){for(var E=ma.length,N=0,G=Hh.h(oa);;)if(NCe(b))throw Error("Malformed member expression, expecting (.member target ...)");return O7(a,b)}if(A.g(rD,c))return I7(a,b,ce(b));if(A.g(PS,c))return Hga(b);if(A.g(EF,c))return N7(a,b);if(A.g(vo,c))return vga(a,b);if(A.g(po,c))return zga(a,b);if(A.g(mo,c)){c=Le(b);var d=dm.g(2,c);b=Pe(b);b=Q.h(C(O.l(new H(null,to,null,1,null),new H(null,c,null,1,null),F([new H(null,Kh.g(Q.h(C(O.l(new H(null,vo,null,1,null),new H(null,Mj(d),null,1,null),F([b])))),d),null,1,null)])))); -return D7.g?D7.g(a,b):D7.call(null,a,b)}if(A.g(no,c))return G7(a,b,ce(b));if(A.g(uG,c))return c=C(b),b=u(c),c=v(c),d=uh(b),d=af(Zd.g(oh(b),fh.j(d,0,d.length-1)),bf(b)),P7(a,af(Kh.j(qo,d,c),bf(b)));if(A.g(Do,c))return xga(a,b);if(A.g(Ao,c))return A.g(2,Ce(b))||B7("Wrong number of args (0) passed to quote",b),Le(b);if(A.g(to,c))return M7(a,b,Le(b),Pe(b));if(A.g(ST,c)){d=C(b);c=u(d);var e=v(d);d=u(e);e=v(e);if(2>Ce(b))throw Error("Malformed member expression, expecting (.member target ...)");return O7(a, +function Hga(a){var b=ce(a);a=Ve.l(bf(a),W,w(V5),F([UQ,w(J5)]));return a5(function(c,d){try{return Kb.j(c7,d,b)}catch(e){if(e instanceof Error)return O5(d,0,e,c);throw e;}},a)} +function Iga(a,b,c){if(A.g(yo,c)){if(3>Ce(b))throw Error("Malformed member expression, expecting (.member target ...)");return O7(a,b)}if(A.g(qD,c))return I7(a,b,ce(b));if(A.g(SS,c))return Hga(b);if(A.g(CF,c))return N7(a,b);if(A.g(vo,c))return vga(a,b);if(A.g(po,c))return zga(a,b);if(A.g(mo,c)){c=Le(b);var d=dm.g(2,c);b=Pe(b);b=Q.h(C(O.l(new H(null,to,null,1,null),new H(null,c,null,1,null),F([new H(null,Kh.g(Q.h(C(O.l(new H(null,vo,null,1,null),new H(null,Mj(d),null,1,null),F([b])))),d),null,1,null)])))); +return D7.g?D7.g(a,b):D7.call(null,a,b)}if(A.g(no,c))return G7(a,b,ce(b));if(A.g(uG,c))return c=C(b),b=u(c),c=v(c),d=uh(b),d=af(Zd.g(oh(b),fh.j(d,0,d.length-1)),bf(b)),P7(a,af(Kh.j(qo,d,c),bf(b)));if(A.g(Do,c))return xga(a,b);if(A.g(Ao,c))return A.g(2,Ce(b))||B7("Wrong number of args (0) passed to quote",b),Le(b);if(A.g(to,c))return M7(a,b,Le(b),Pe(b));if(A.g(UT,c)){d=C(b);c=u(d);var e=v(d);d=u(e);e=v(e);if(2>Ce(b))throw Error("Malformed member expression, expecting (.member target ...)");return O7(a, af(new H(null,yo,new H(null,d,new H(null,He(Zd.h(fh.g(uh(c),1)),e),null,1,null),2,null),3,null),bf(b)))}if(A.g(ro,c))return Dga(a,b);if(A.g(ho,c))return N7(a,b);if(A.g(xo,c))return Ega(a,b);if(A.g(wo,c))return rga(a,b,J7(z7(a),ce(b)));if(A.g(qo,c))return P7(a,b);if(A.g(zo,c))return D.j(b,0,null),b=D.j(b,1,null),y7(a,b,!1,null);if(A.g(IC,c))return yga(a,b);if(A.g(Co,c))return Bga(a,b);if(A.g(jo,c))return Aga(a,b);if(A.g(SH,c))return H7(a,b,ce(b));throw Error(["No matching clause: ",q.h(c)].join("")); } -function Jga(a,b,c,d){var e=p(p(d)?p(c)?oG.h(c):c:d)?new n(null,2,[Fz,Fz.h(c),oG,oG.h(c)],null):null;p(e)&&(G5=e);try{var f=Bs.h(c);p(f)&&r5(Xe([J5,f]));try{var h=u(b);if(h instanceof x){var k=Yd.g(A7,h);p(p(k)?JP.h(a):k)&&v7(a,h,new R(null,2,5,S,[k,null],null));var l=p(k)?k:y7(a,h,!0,null),g=bf(l),t=p(g)?EO.h(g):g,r=vL.h(g),y=p(r)?r:l;if(p(p(g)?ID.h(g):g)){var B=D.j(y,0,null),J=D.j(y,1,null),P=Qe(J),V=A.g(P,""),ba=Ce(J),da=J.slice(0,ba-1),ha=A.g(1,ba)?wi([B,P]):function(){return[w6(B,da),P]};try{var na=ha()}catch(Ga){na= +function Jga(a,b,c,d){var e=p(p(d)?p(c)?oG.h(c):c:d)?new n(null,2,[Fz,Fz.h(c),oG,oG.h(c)],null):null;p(e)&&(G5=e);try{var f=zs.h(c);p(f)&&r5(Xe([J5,f]));try{var h=u(b);if(h instanceof x){var k=Yd.g(A7,h);p(p(k)?LP.h(a):k)&&v7(a,h,new R(null,2,5,S,[k,null],null));var l=p(k)?k:y7(a,h,!0,null),g=bf(l),t=p(g)?DO.h(g):g,r=wL.h(g),y=p(r)?r:l;if(p(p(g)?ID.h(g):g)){var B=D.j(y,0,null),J=D.j(y,1,null),P=Qe(J),V=A.g(P,""),ba=Ce(J),da=J.slice(0,ba-1),ha=A.g(1,ba)?wi([B,P]):function(){return[w6(B,da),P]};try{var na=ha()}catch(Ga){na= null}var oa=D.j(na,0,null),ma=D.j(na,1,null),M=J7(a,ce(b)),E=Pb.h(M);if(p(oa)){if(V)return a5(function(Ga,Sa,Xa){return x6(Sa,Xa,oa,E)},null);var N=oa[ma];return a5(function(Ga,Sa,Xa){return y6(Sa,Xa,oa,N,E)},null)}return V?a5(function(Ga,Sa,Xa){Ga=ha()[0];return x6(Sa,Xa,Ga,E)},null):a5(function(Ga,Sa,Xa){Ga=ha();var lb=Ga[0];return y6(Sa,Xa,lb,lb[Ga[1]],E)},null)}if(p(function(){var Ga=vb(t);return Ga?(Ga=y instanceof x)?p(k)?k:Af(h6,y):Ga:Ga}()))return Iga(a,b,y);try{if(p(L5(y))){var G=function(){var Ga= -q6(y);return Ga?q5(y):Ga}(),I=q6(y)?w(y):y,ea=function(){var Ga=I.afn;return p(Ga)?Ga:I}(),fa=p(G)?Kb.G(ea,b,TM.h(a),a,ce(b)):Kb.u(ea,b,TM.h(a),ce(b));return p(RG.h(a))?fa:p(p(d)?uf(fa)&&A.g(no,u(fa)):d)?new Y4(null!=fa&&(fa.B&262144||$a===fa.ke)?af(fa,zl.l(F([c,bf(fa)]))):fa):function(){var Ga=p(c)?null!=fa&&(fa.B&262144||$a===fa.ke)?af(fa,zl.l(F([c,bf(fa)]))):fa:fa;return D7.j?D7.j(a,Ga,d):D7.call(null,a,Ga,d)}()}var ia=eG.h(g);if(p(ia))return I=ia,Q7(a,b,I,J7(a,ce(b)),Ve.l(c,W,w(V5),F([PQ,w(J5), -Gs,g])),null);var sa=EO.h(bf(y));if(p(sa))switch(sa instanceof z?sa.X:null){case "resolve-sym":return Fga(qR.h(bf(y)),J7(a,ce(b)),Ve.l(c,W,w(V5),F([PQ,w(J5),Gs,g])));default:return M=J7(a,ce(b)),Q7(a,b,y,M,Ve.l(c,W,w(V5),F([PQ,w(J5),Gs,g])),null)}else{G=function(){var Ga=q6(y);return Ga?q5(y):Ga}();if(p(G))return Gga(b,y,J7(a,ce(b)));var va=baa.h(a);if(p(p(va)?va.h?va.h(y):va.call(null,y):va))return M=J7(a,ce(b)),Q7(a,b,y,M,Ve.l(c,W,w(V5),F([PQ,w(J5),Gs,g])),function(Ga,Sa){return w(Sa.get(h))}); -M=J7(a,ce(b));return Q7(a,b,y,M,Ve.l(c,W,w(V5),F([PQ,w(J5),Gs,g])),q6(y)?function(Ga,Sa,Xa){return w(Xa)}:null)}}catch(Ga){if(Ga instanceof Error){var ya=Ga;return N5(a,ya,function(){var Sa=Ve.l(c,W,w(V5),F([PQ,w(J5),Gs,g]));return a5(function(){return null},Sa)}())}throw Ga;}}else if(h instanceof z){M=J7(a,ce(b));var za=Ce(M);switch(za){case 1:var Ba=D.g(M,0);return a5(function(Ga,Sa,Xa){return h.h(Z(Ba,Sa,Xa))},null);case 2:var Ha=D.g(M,0),Na=D.g(M,1);return a5(function(Ga,Sa,Xa){return h.g(Z(Ha, -Sa,Xa),Z(Na,Sa,Xa))},null);default:return B7(["Wrong number of args (",q.h(za),") passed to: ",q.h(h)].join(""),b)}}else{l=D7.g?D7.g(a,h):D7.call(null,a,h);M=J7(a,ce(b));var Ea=Ve.l(c,W,w(V5),F([PQ,w(J5)]));return Q7(a,b,l,M,Ea,q6(l)?function(Ga,Sa,Xa){return Z(w(Xa),Ga,Sa)}:function(Ga,Sa,Xa){return Z(Xa,Ga,Sa)})}}catch(Ga){return ya=Ga,N5(a,ya,a5(function(){return null},j6(c,!1)))}finally{p(f)&&s5()}}finally{p(e)&&(G5=null)}}function R7(a){return 16>=a?ul:tl} +q6(y);return Ga?q5(y):Ga}(),I=q6(y)?w(y):y,ea=function(){var Ga=I.afn;return p(Ga)?Ga:I}(),fa=p(G)?Kb.G(ea,b,TM.h(a),a,ce(b)):Kb.u(ea,b,TM.h(a),ce(b));return p(RG.h(a))?fa:p(p(d)?uf(fa)&&A.g(no,u(fa)):d)?new Y4(null!=fa&&(fa.B&262144||$a===fa.ke)?af(fa,zl.l(F([c,bf(fa)]))):fa):function(){var Ga=p(c)?null!=fa&&(fa.B&262144||$a===fa.ke)?af(fa,zl.l(F([c,bf(fa)]))):fa:fa;return D7.j?D7.j(a,Ga,d):D7.call(null,a,Ga,d)}()}var ia=eG.h(g);if(p(ia))return I=ia,Q7(a,b,I,J7(a,ce(b)),Ve.l(c,W,w(V5),F([UQ,w(J5), +Es,g])),null);var sa=DO.h(bf(y));if(p(sa))switch(sa instanceof z?sa.X:null){case "resolve-sym":return Fga(tR.h(bf(y)),J7(a,ce(b)),Ve.l(c,W,w(V5),F([UQ,w(J5),Es,g])));default:return M=J7(a,ce(b)),Q7(a,b,y,M,Ve.l(c,W,w(V5),F([UQ,w(J5),Es,g])),null)}else{G=function(){var Ga=q6(y);return Ga?q5(y):Ga}();if(p(G))return Gga(b,y,J7(a,ce(b)));var va=baa.h(a);if(p(p(va)?va.h?va.h(y):va.call(null,y):va))return M=J7(a,ce(b)),Q7(a,b,y,M,Ve.l(c,W,w(V5),F([UQ,w(J5),Es,g])),function(Ga,Sa){return w(Sa.get(h))}); +M=J7(a,ce(b));return Q7(a,b,y,M,Ve.l(c,W,w(V5),F([UQ,w(J5),Es,g])),q6(y)?function(Ga,Sa,Xa){return w(Xa)}:null)}}catch(Ga){if(Ga instanceof Error){var ya=Ga;return N5(a,ya,function(){var Sa=Ve.l(c,W,w(V5),F([UQ,w(J5),Es,g]));return a5(function(){return null},Sa)}())}throw Ga;}}else if(h instanceof z){M=J7(a,ce(b));var za=Ce(M);switch(za){case 1:var Ba=D.g(M,0);return a5(function(Ga,Sa,Xa){return h.h(Z(Ba,Sa,Xa))},null);case 2:var Ha=D.g(M,0),Na=D.g(M,1);return a5(function(Ga,Sa,Xa){return h.g(Z(Ha, +Sa,Xa),Z(Na,Sa,Xa))},null);default:return B7(["Wrong number of args (",q.h(za),") passed to: ",q.h(h)].join(""),b)}}else{l=D7.g?D7.g(a,h):D7.call(null,a,h);M=J7(a,ce(b));var Ea=Ve.l(c,W,w(V5),F([UQ,w(J5)]));return Q7(a,b,l,M,Ea,q6(l)?function(Ga,Sa,Xa){return Z(w(Xa),Ga,Sa)}:function(Ga,Sa,Xa){return Z(Xa,Ga,Sa)})}}catch(Ga){return ya=Ga,N5(a,ya,a5(function(){return null},j6(c,!1)))}finally{p(f)&&s5()}}finally{p(e)&&(G5=null)}}function R7(a){return 16>=a?ul:tl} function Kga(a,b,c){var d=R7(Ce(c));Q7(a,b,d,c,null,null);return Q7(a,b,d,c,null,null)}function S7(a){return!(a instanceof $4)}function Lga(a,b,c){a=z7(a);var d=jj.j(Se,ej,b),e=J7(a,d),f=si(S7,e);d=f?A.g(d,e):null;d=f?p(d)?b:function(){var l=R7(Ce(e));return Kb.g(l,e)}():null;var h=f?d:Kga(a,b,e),k=p(c)?D7.g?D7.g(a,c):D7.call(null,a,c):null;return p(k)?a5(function(l,g,t){l=Z(h,g,t);g=Z(k,g,t);return af(l,g)},null):h} function T7(a,b,c,d,e){a=z7(a);var f=p(e)?D7.g?D7.g(a,e):D7.call(null,a,e):null;e=J7(a,d);var h=si(S7,e),k=hf(d),l=h&&A.g(k?function(){var t=C(d);return t?t:Se}():d,e);b=h?l?ff(d)?k?Gl:Se:d:b.h?b.h(e):b.call(null,e):null;var g=h?b:Q7(a,d,c,e,null,null);return p(f)?a5(function(t,r,y){t=Z(g,r,y);r=Z(f,r,y);return af(t,r)},null):g} function Mga(a,b){b=b.val;if(lf(b)){var c=nk(b),d=ri.g(uh,c),e=ok(b),f=J7(a,e);return a5(function(h,k,l){return Kb.g(pf,bj.g(d,ri.g(function(g){return Z(g,k,l)},f)))},null)}e=J7(a,b);return a5(function(h,k,l){var g=[];kn(function(t){return g.push(Z(t,k,l))},e);return g},null)} var D7=function D7(a){switch(arguments.length){case 2:return D7.g(arguments[0],arguments[1]);case 3:return D7.j(arguments[0],arguments[1],arguments[2]);default:throw Error(["Invalid arity: ",q.h(arguments.length)].join(""));}};D7.g=function(a,b){return D7.j(a,b,!1)}; -D7.j=function(a,b,c){var d=bf(b);if(F5(b))return b;if(b instanceof x){var e=y7(a,b,!1,RL.h(d)),f=bf(e);if(F5(e))return e;if(q6(e)){if(p(function(){var h=q5(e);return p(h)?X.h(f):h}()))return yi.g(e,a);if(p(fv.h(f)))return w(e);if(p(l5(e)))throw Error(["Can't take value of a macro: ",q.h(e),""].join(""));return a5(function(){return w(e)},null)}return e}return mf(b)?b:lf(b)?Lga(a,b,d):b instanceof j4?Mga(a,b):nf(b)?T7(a,Rf,Qj,b,d):hf(b)?T7(a,Jl,Kl,b,d):uf(b)?C(b)?Jga(a,b,d,c):b:b};D7.m=3;Gd(e6,D7);"undefined"!==typeof Ya&&"undefined"!==typeof Ya.He&&"undefined"!==typeof Ya.He.Cf&&"undefined"!==typeof Ya.He.Cf.resolve&&af(vq,new n(null,1,[QO,!0],null));function U7(a,b,c,d,e){c=new n(null,3,[W,p(c)?c:m6,vU,!0,X,!0],null);e=p(e)?zl.l(F([c,e])):c;return p6(a,b,e,d)}function V7(a,b){return W7(a,b,null,!1)}function X7(a,b,c){return W7(a,b,c,!0)}function W7(a,b,c,d){d=p(d)?d:!0===c;c=new n(null,2,[W,!0===c?m6:p(c)?c:m6,X,!0],null);c=p(null)?zl.l(F([c,null])):c;return p6(a,b,c,d)};var Y7,Nga=Ei.h(Wh),Oga=Ei.h(Wh),Pga=Ei.h(Wh),Qga=Ei.h(Wh),Rga=Yd.j(Wh,bD,Dn.s?Dn.s():Dn.call(null));Y7=new Xn(Zd.g("sci.impl.core-protocols","-deref"),X4,bq,Rga,Nga,Oga,Pga,Qga);Y7.la(null,jt,function(a){var b=U4(a);b=Yd.g(b,Du);return b.h?b.h(a):b.call(null,a)});var Sga=Y7.la(null,bq,function(a){return w(a)}),Z7=C5(Ap,null),Tga=o6(Iba,new n(null,3,[BB,Dc,sG,Ef([Y7]),W,Z7],null),new n(null,1,[W,Z7],null)),$7,Uga=Ei.h(Wh),Vga=Ei.h(Wh),Wga=Ei.h(Wh),Xga=Ei.h(Wh),Yga=Yd.j(Wh,bD,Dn.s?Dn.s():Dn.call(null)); -$7=new Xn(Zd.g("sci.impl.core-protocols","-swap!"),X4,bq,Yga,Uga,Vga,Wga,Xga);var a8,Zga=Ei.h(Wh),$ga=Ei.h(Wh),aha=Ei.h(Wh),bha=Ei.h(Wh),cha=Yd.j(Wh,bD,Dn.s?Dn.s():Dn.call(null));a8=new Xn(Zd.g("sci.impl.core-protocols","-reset!"),X4,bq,cha,Zga,$ga,aha,bha); -$7.la(null,jt,function(){function a(f,h,k,l){var g=U4(f);g=Yd.g(g,Ot);return g.u?g.u(f,h,k,l):g.call(null,f,h,k,l)}function b(f,h,k){var l=U4(f);l=Yd.g(l,Ot);return l.j?l.j(f,h,k):l.call(null,f,h,k)}function c(f,h){var k=U4(f);k=Yd.g(k,Ot);return k.g?k.g(f,h):k.call(null,f,h)}var d=null,e=function(){function f(k,l,g,t,r){var y=null;if(4a:!1},aO,new n(null,5,[U,aO,T,K(new R(null,1,5,S,[UC],null)),Y,"Return true if x satisfies int? and is negative.", -X,!0,W,m6],null),null),new z5(kj,Nv,new n(null,5,[U,Nv,T,K(new R(null,2,5,S,[vC,yO],null),new R(null,3,5,S,[vC,GM,KM],null),new R(null,4,5,S,[vC,GM,KM,LM],null),new R(null,6,5,S,[vC,GM,KM,LM,go,UO],null)),Y,"Returns a vector consisting of the result of applying f to the\n set of first items of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments.", -X,!0,W,m6],null),null),U7(nT,function(a,b,c,d){return Q.h(C(O.l(new H(null,Bv,null,1,null),new H(null,Mj(Q.h(C(O.g(new H(null,NR,null,1,null),new H(null,Q.h(C(O.g(new H(null,Do,null,1,null),new H(null,c,null,1,null)))),null,1,null))))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,MM,null,1,null),new H(null,Q.h(C(O.g(new H(null,HR,null,1,null),new H(null,NR,null,1,null)))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,Do,null,1,null),new H(null,c,null,1,null),F([new H(null,d,null,1,null)])))), -null,1,null)])))),null,1,null)]))))},null,null,new n(null,3,[U,nT,T,K(new R(null,2,5,S,[UC,fR],null)),Y,"defs name to have the root value of init iff the named var has no root value,\n else init is unevaluated"],null)),new z5(function(a,b){l7(Lr.h(a),b);return null},Lv,new n(null,5,[U,Lv,T,null,Y,null,X,!0,W,m6],null),!0),new z5(x8,kS,new n(null,5,[U,kS,T,K(new R(null,2,5,S,[go,rS],null)),Y,"Same as pr followed by (newline).",X,!0,W,m6],null),null),new z5(Pi,XS,new n(null,5,[U,XS,T,K(new R(null, -1,5,S,[OC],null),new R(null,2,5,S,[CC,OC],null)),Y,"Return a lazy sequence of all but the last n (default 1) items in coll",X,!0,W,m6],null),null),new z5(I9,vR,new n(null,5,[U,vR,T,null,Y,null,X,!0,W,m6],null),null),new z5(zi,Uq,new n(null,5,[U,Uq,T,K(new R(null,2,5,S,[vC,UC],null),new R(null,3,5,S,[vC,UC,vD],null),new R(null,4,5,S,[vC,UC,vD,uD],null)),Y,"Takes a function f, and returns a function that calls f, replacing\n a nil first argument to f with the supplied value x. Higher arity\n versions can replace arguments in the second and third\n positions (y, z). Note that the function f can take any number of\n arguments, not just the one(s) being nil-patched.", -X,!0,W,m6],null),null),U7(MN,X8,null,null,new n(null,3,[U,MN,T,K(new R(null,3,5,S,[kE,go,YS],null)),Y,"Takes an expression and a set of test/form pairs. Threads expr (via -\x3e\x3e)\n through each form for which the corresponding test expression\n is true. Note that, unlike cond branching, cond-\x3e\x3e threading does not short circuit\n after the first true test expression."],null)),new z5(s5,tq,new n(null,5,[U,tq,T,null,Y,null,X,!0,W,m6],null),null),new z5(V6,wR,new n(null,5,[U,wR,T,K(new R(null, -2,5,S,[Op,UC],null)),Y,"Returns true if x satisfies the protocol",X,!0,W,m6],null),null),new z5(v,gG,new n(null,5,[U,gG,T,K(new R(null,1,5,S,[yO],null)),Y,"Returns a seq of the items after the first. Calls seq on its\n argument. If there are no more items, returns nil",X,!0,W,m6],null),null),new z5(Uf,XB,new n(null,6,[U,XB,eG,Uf,T,K(Se,new R(null,1,5,S,[UC],null),new R(null,2,5,S,[UC,vD],null),new R(null,4,5,S,[UC,vD,go,tF],null)),Y,"Returns the sum of nums. (+) returns 0.",X,!0,W,m6],null),null), -new z5(function(a,b){r5(Xe([V5,w(V5)]));try{var c=dV(cV(b));for(b=null;;){var d=H8(a,c,null);if(nh(Ut,d))return b;b=f6(a,d)}}finally{s5()}},sQ,new n(null,5,[U,sQ,T,null,Y,null,X,!0,W,m6],null),!0),new z5(uh,TE,new n(null,5,[U,TE,T,K(new R(null,1,5,S,[UC],null)),Y,"Returns the name String of a string, symbol or keyword.",X,!0,W,m6],null),null),new z5(ng,PF,new n(null,6,[U,PF,eG,ng,T,K(new R(null,1,5,S,[UC],null)),Y,null,X,!0,W,m6],null),null),U7(zp,$8,null,null,new n(null,3,[U,zp,T,K(new R(null,3, -5,S,[cr,go,sC],null)),Y,"bindings \x3d\x3e binding-form test\n\n When test is true, evaluates body with binding-form bound to the value of test"],null)),new z5(Vd,ms,new n(null,5,[U,ms,T,K(new R(null,1,5,S,[UC],null)),Y,"Return true if x is a Symbol",X,!0,W,m6],null),null),new z5(Bh,KP,new n(null,5,[U,KP,T,K(new R(null,2,5,S,[zr,px],null)),Y,null,X,!0,W,m6],null),null),new z5(Oh,nA,new n(null,5,[U,nA,T,K(new R(null,2,5,S,[Ur,nO],null),new R(null,4,5,S,[Ur,nO,go,CL],null)),Y,"disj[oin]. Returns a transient set of the same (hashed/sorted) type, that\n does not contain key(s).", -X,!0,W,m6],null),null),new z5(function(a,b){return new hn(a,b)},Fp,new n(null,5,[U,Fp,T,K(new R(null,2,5,S,[Oz,yO],null)),Y,"Positional factory function for cljs.core/Eduction.",X,!0,W,m6],null),null),new z5(y9,MI,new n(null,5,[U,MI,T,K(new R(null,1,5,S,[Jq],null)),Y,"Returns a map of the import mappings for the namespace.",X,!0,W,m6],null),!0),new z5(function(a){return Un(a)},wP,new n(null,5,[U,wP,T,K(new R(null,1,5,S,[HE],null)),Y,"Given a multimethod, returns a map of dispatch values -\x3e dispatch fns", -X,!0,W,m6],null),null),new z5(function(a,b){return a.meta=b},tu,new n(null,5,[U,tu,T,K(new R(null,2,5,S,[XO,DC],null)),Y,"Atomically resets the metadata for an atom",X,!0,W,m6],null),null),U7(oD,function(a,b,c,d,e,f,h){return Q.h(C(O.l(new H(null,Bv,null,1,null),new H(null,Mj(Q.h(C(O.l(new H(null,Hq,null,1,null),new H(null,c,null,1,null),F([new H(null,GF,null,1,null),new H(null,Q.h(C(O.g(new H(null,eD,null,1,null),new H(null,Hq,null,1,null)))),null,1,null)]))))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null, -dF,null,1,null),new H(null,Mj(Q.h(C(O.l(new H(null,d,null,1,null),new H(null,0,null,1,null),F([new H(null,e,null,1,null),new H(null,f,null,1,null)]))))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,po,null,1,null),new H(null,Q.h(C(O.l(new H(null,GT,null,1,null),new H(null,d,null,1,null),F([new H(null,GF,null,1,null)])))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,wo,null,1,null),new H(null,Q.h(C(O.g(new H(null,IL,null,1,null),new H(null,d,null,1,null)))),null,1,null),F([new H(null,h,null, -1,null)])))),null,1,null),new H(null,e,null,1,null)])))),null,1,null)])))),null,1,null)]))))},null,null,new n(null,3,[U,oD,T,K(new R(null,5,5,S,[pC,GN,iH,fR,kE],null)),Y,"Reduces an expression across an array a, using an index named idx,\n and return value named ret, initialized to init, setting ret to the\n evaluation of expr at each step, returning ret."],null)),U7(ro,$9,null,null,new n(null,4,[U,ro,T,null,Y,null,vL,ro],null)),new z5(sn,uz,new n(null,5,[U,uz,T,K(new R(null,1,5,S,[UC],null),new R(null, -3,5,S,[UC,go,yq],null)),Y,"Recursively transforms JavaScript arrays into ClojureScript\n vectors, and JavaScript objects into ClojureScript maps. With\n option ':keywordize-keys true' will convert object fields from\n strings to keywords.",X,!0,W,m6],null),null),U7(TN,Q8,null,null,new n(null,3,[U,TN,T,K(new R(null,3,5,S,[cr,go,sC],null)),Y,"bindings \x3d\x3e name n\n\n Repeatedly executes body (presumably for side-effects) with name\n bound to integers from 0 through n-1."],null)),new z5(wn, -mx,new n(null,5,[U,mx,T,K(new R(null,1,5,S,[CC],null)),Y,"Returns a random integer between 0 (inclusive) and n (exclusive).",X,!0,W,m6],null),null),new z5(vi,xK,new n(null,5,[U,xK,T,K(new R(null,1,5,S,[vC],null)),Y,"Takes a fn f and returns a fn that takes the same arguments as f,\n has the same effects, if any, and returns the opposite truth value.",X,!0,W,m6],null),null),new z5(gh,XF,new n(null,5,[U,XF,T,K(new R(null,1,5,S,[UC],null)),Y,"Returns true if x implements IList",X,!0,W,m6],null),null), -new z5(Mb,zw,new n(null,6,[U,zw,eG,Mb,T,K(new R(null,2,5,S,[Xr,GN],null),new R(null,4,5,S,[Xr,GN,go,WJ],null)),Y,"Returns the value at the index/indices. Works on JavaScript arrays.",X,!0,W,m6],null),null),new z5(Ql,AE,new n(null,5,[U,AE,T,K(new R(null,2,5,S,[CM,CL],null)),Y,"Returns a map with the keys mapped to the corresponding vals.",X,!0,W,m6],null),null),new z5(function(a,b){if(rh(b)){var c=Zd.h(oh(b));b=Zd.h(uh(b));a=Yd.g(jT.h(w(Lr.h(a))),c);if(p(a))return Yd.g(a,b);throw Error(["No such namespace: ", -q.h(c)].join(""));}throw Error(["Not a qualified symbol: ",q.h(b)].join(""));},iL,new n(null,5,[U,iL,T,null,Y,null,X,!0,W,m6],null),!0),U7(SA,function(a,b,c,d){gha(a,c);var e=function(){function f(k){var l=null;if(0a:!1},aO,new n(null,5,[U,aO,T,K(new R(null,1,5,S,[UC],null)),Y,"Return true if x satisfies int? and is negative.", +X,!0,W,m6],null),null),new z5(kj,Lv,new n(null,5,[U,Lv,T,K(new R(null,2,5,S,[vC,xO],null),new R(null,3,5,S,[vC,EM,JM],null),new R(null,4,5,S,[vC,EM,JM,KM],null),new R(null,6,5,S,[vC,EM,JM,KM,go,VO],null)),Y,"Returns a vector consisting of the result of applying f to the\n set of first items of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments.", +X,!0,W,m6],null),null),U7(qT,function(a,b,c,d){return Q.h(C(O.l(new H(null,zv,null,1,null),new H(null,Mj(Q.h(C(O.g(new H(null,Sz,null,1,null),new H(null,Q.h(C(O.g(new H(null,Do,null,1,null),new H(null,c,null,1,null)))),null,1,null))))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,LM,null,1,null),new H(null,Q.h(C(O.g(new H(null,JR,null,1,null),new H(null,Sz,null,1,null)))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,Do,null,1,null),new H(null,c,null,1,null),F([new H(null,d,null,1,null)])))), +null,1,null)])))),null,1,null)]))))},null,null,new n(null,3,[U,qT,T,K(new R(null,2,5,S,[UC,jR],null)),Y,"defs name to have the root value of init iff the named var has no root value,\n else init is unevaluated"],null)),new z5(function(a,b){l7(Jr.h(a),b);return null},Jv,new n(null,5,[U,Jv,T,null,Y,null,X,!0,W,m6],null),!0),new z5(x8,kS,new n(null,5,[U,kS,T,K(new R(null,2,5,S,[go,rS],null)),Y,"Same as pr followed by (newline).",X,!0,W,m6],null),null),new z5(Pi,aT,new n(null,5,[U,aT,T,K(new R(null, +1,5,S,[OC],null),new R(null,2,5,S,[CC,OC],null)),Y,"Return a lazy sequence of all but the last n (default 1) items in coll",X,!0,W,m6],null),null),new z5(I9,yR,new n(null,5,[U,yR,T,null,Y,null,X,!0,W,m6],null),null),new z5(zi,Sq,new n(null,5,[U,Sq,T,K(new R(null,2,5,S,[vC,UC],null),new R(null,3,5,S,[vC,UC,uD],null),new R(null,4,5,S,[vC,UC,uD,tD],null)),Y,"Takes a function f, and returns a function that calls f, replacing\n a nil first argument to f with the supplied value x. Higher arity\n versions can replace arguments in the second and third\n positions (y, z). Note that the function f can take any number of\n arguments, not just the one(s) being nil-patched.", +X,!0,W,m6],null),null),U7(MN,X8,null,null,new n(null,3,[U,MN,T,K(new R(null,3,5,S,[hE,go,bT],null)),Y,"Takes an expression and a set of test/form pairs. Threads expr (via -\x3e\x3e)\n through each form for which the corresponding test expression\n is true. Note that, unlike cond branching, cond-\x3e\x3e threading does not short circuit\n after the first true test expression."],null)),new z5(s5,rq,new n(null,5,[U,rq,T,null,Y,null,X,!0,W,m6],null),null),new z5(V6,zR,new n(null,5,[U,zR,T,K(new R(null, +2,5,S,[Op,UC],null)),Y,"Returns true if x satisfies the protocol",X,!0,W,m6],null),null),new z5(v,gG,new n(null,5,[U,gG,T,K(new R(null,1,5,S,[xO],null)),Y,"Returns a seq of the items after the first. Calls seq on its\n argument. If there are no more items, returns nil",X,!0,W,m6],null),null),new z5(Uf,YB,new n(null,6,[U,YB,eG,Uf,T,K(Se,new R(null,1,5,S,[UC],null),new R(null,2,5,S,[UC,uD],null),new R(null,4,5,S,[UC,uD,go,pF],null)),Y,"Returns the sum of nums. (+) returns 0.",X,!0,W,m6],null),null), +new z5(function(a,b){r5(Xe([V5,w(V5)]));try{var c=dV(cV(b));for(b=null;;){var d=H8(a,c,null);if(nh(St,d))return b;b=f6(a,d)}}finally{s5()}},wQ,new n(null,5,[U,wQ,T,null,Y,null,X,!0,W,m6],null),!0),new z5(uh,PE,new n(null,5,[U,PE,T,K(new R(null,1,5,S,[UC],null)),Y,"Returns the name String of a string, symbol or keyword.",X,!0,W,m6],null),null),new z5(ng,OF,new n(null,6,[U,OF,eG,ng,T,K(new R(null,1,5,S,[UC],null)),Y,null,X,!0,W,m6],null),null),U7(zp,$8,null,null,new n(null,3,[U,zp,T,K(new R(null,3, +5,S,[ar,go,sC],null)),Y,"bindings \x3d\x3e binding-form test\n\n When test is true, evaluates body with binding-form bound to the value of test"],null)),new z5(Vd,ks,new n(null,5,[U,ks,T,K(new R(null,1,5,S,[UC],null)),Y,"Return true if x is a Symbol",X,!0,W,m6],null),null),new z5(Bh,NP,new n(null,5,[U,NP,T,K(new R(null,2,5,S,[wr,ox],null)),Y,null,X,!0,W,m6],null),null),new z5(Oh,oA,new n(null,5,[U,oA,T,K(new R(null,2,5,S,[Sr,mO],null),new R(null,4,5,S,[Sr,mO,go,DL],null)),Y,"disj[oin]. Returns a transient set of the same (hashed/sorted) type, that\n does not contain key(s).", +X,!0,W,m6],null),null),new z5(function(a,b){return new hn(a,b)},Fp,new n(null,5,[U,Fp,T,K(new R(null,2,5,S,[Oz,xO],null)),Y,"Positional factory function for cljs.core/Eduction.",X,!0,W,m6],null),null),new z5(y9,NI,new n(null,5,[U,NI,T,K(new R(null,1,5,S,[Hq],null)),Y,"Returns a map of the import mappings for the namespace.",X,!0,W,m6],null),!0),new z5(function(a){return Un(a)},wP,new n(null,5,[U,wP,T,K(new R(null,1,5,S,[BE],null)),Y,"Given a multimethod, returns a map of dispatch values -\x3e dispatch fns", +X,!0,W,m6],null),null),new z5(function(a,b){return a.meta=b},su,new n(null,5,[U,su,T,K(new R(null,2,5,S,[YO,DC],null)),Y,"Atomically resets the metadata for an atom",X,!0,W,m6],null),null),U7(nD,function(a,b,c,d,e,f,h){return Q.h(C(O.l(new H(null,zv,null,1,null),new H(null,Mj(Q.h(C(O.l(new H(null,tB,null,1,null),new H(null,c,null,1,null),F([new H(null,GH,null,1,null),new H(null,Q.h(C(O.g(new H(null,eD,null,1,null),new H(null,tB,null,1,null)))),null,1,null)]))))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null, +ZE,null,1,null),new H(null,Mj(Q.h(C(O.l(new H(null,d,null,1,null),new H(null,0,null,1,null),F([new H(null,e,null,1,null),new H(null,f,null,1,null)]))))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,po,null,1,null),new H(null,Q.h(C(O.l(new H(null,IT,null,1,null),new H(null,d,null,1,null),F([new H(null,GH,null,1,null)])))),null,1,null),F([new H(null,Q.h(C(O.l(new H(null,wo,null,1,null),new H(null,Q.h(C(O.g(new H(null,JL,null,1,null),new H(null,d,null,1,null)))),null,1,null),F([new H(null,h,null, +1,null)])))),null,1,null),new H(null,e,null,1,null)])))),null,1,null)])))),null,1,null)]))))},null,null,new n(null,3,[U,nD,T,K(new R(null,5,5,S,[pC,GN,hH,jR,hE],null)),Y,"Reduces an expression across an array a, using an index named idx,\n and return value named ret, initialized to init, setting ret to the\n evaluation of expr at each step, returning ret."],null)),U7(ro,$9,null,null,new n(null,4,[U,ro,T,null,Y,null,wL,ro],null)),new z5(sn,uz,new n(null,5,[U,uz,T,K(new R(null,1,5,S,[UC],null),new R(null, +3,5,S,[UC,go,wq],null)),Y,"Recursively transforms JavaScript arrays into ClojureScript\n vectors, and JavaScript objects into ClojureScript maps. With\n option ':keywordize-keys true' will convert object fields from\n strings to keywords.",X,!0,W,m6],null),null),U7(TN,Q8,null,null,new n(null,3,[U,TN,T,K(new R(null,3,5,S,[ar,go,sC],null)),Y,"bindings \x3d\x3e name n\n\n Repeatedly executes body (presumably for side-effects) with name\n bound to integers from 0 through n-1."],null)),new z5(wn, +lx,new n(null,5,[U,lx,T,K(new R(null,1,5,S,[CC],null)),Y,"Returns a random integer between 0 (inclusive) and n (exclusive).",X,!0,W,m6],null),null),new z5(vi,xK,new n(null,5,[U,xK,T,K(new R(null,1,5,S,[vC],null)),Y,"Takes a fn f and returns a fn that takes the same arguments as f,\n has the same effects, if any, and returns the opposite truth value.",X,!0,W,m6],null),null),new z5(gh,XF,new n(null,5,[U,XF,T,K(new R(null,1,5,S,[UC],null)),Y,"Returns true if x implements IList",X,!0,W,m6],null),null), +new z5(Mb,ww,new n(null,6,[U,ww,eG,Mb,T,K(new R(null,2,5,S,[Vr,GN],null),new R(null,4,5,S,[Vr,GN,go,VJ],null)),Y,"Returns the value at the index/indices. Works on JavaScript arrays.",X,!0,W,m6],null),null),new z5(Ql,wE,new n(null,5,[U,wE,T,K(new R(null,2,5,S,[AM,DL],null)),Y,"Returns a map with the keys mapped to the corresponding vals.",X,!0,W,m6],null),null),new z5(function(a,b){if(rh(b)){var c=Zd.h(oh(b));b=Zd.h(uh(b));a=Yd.g(mT.h(w(Jr.h(a))),c);if(p(a))return Yd.g(a,b);throw Error(["No such namespace: ", +q.h(c)].join(""));}throw Error(["Not a qualified symbol: ",q.h(b)].join(""));},jL,new n(null,5,[U,jL,T,null,Y,null,X,!0,W,m6],null),!0),U7(RA,function(a,b,c,d){gha(a,c);var e=function(){function f(k){var l=null;if(0=Ce(b)&&si(function(c){return Af(a,c)},b)},oJ,new n(null,5,[U,oJ,T,K(new R(null,2,5,S,[bI,cI],null)),Y,"Is set1 a superset of set2?",X,!0,W,i$],null),null),new z5(PY,cB,new n(null,5,[U,cB,T,K(new R(null,2,5,S,[$Q,XC],null),new R(null,3,5,S,[$Q,XC,JG],null)),Y,"When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys.", -X,!0,W,i$],null),null),new z5(JY,ax,new n(null,5,[U,ax,T,K(Se,new R(null,1,5,S,[vI],null),new R(null,2,5,S,[vI,zI],null),new R(null,4,5,S,[vI,zI,go,tH],null)),Y,"Return a set that is the union of the input sets",X,!0,W,i$],null),null),new z5(function(a,b){return Jl(ri.g(function(c){return MY(c,b)},a))},dP,new n(null,5,[U,dP,T,K(new R(null,2,5,S,[$Q,Fs],null)),Y,"Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap",X,!0,W,i$],null),null),new z5(function(a,b){return Ce(a)<= -Ce(b)&&si(function(c){return Af(b,c)},a)},VN,new n(null,5,[U,VN,T,K(new R(null,2,5,S,[bI,cI],null)),Y,"Is set1 a subset of set2?",X,!0,W,i$],null),null),new z5(LY,bS,new n(null,5,[U,bS,T,K(new R(null,1,5,S,[vI],null),new R(null,2,5,S,[vI,zI],null),new R(null,4,5,S,[vI,zI,go,tH],null)),Y,"Return a set that is the first set without elements of the remaining sets",X,!0,W,i$],null),null),i$,new z5(KY,IN,new n(null,5,[U,IN,T,K(new R(null,1,5,S,[vI],null),new R(null,2,5,S,[vI,zI],null),new R(null,4,5,S, -[vI,zI,go,tH],null)),Y,"Return a set that is the intersection of the input sets",X,!0,W,i$],null),null),new z5(NY,xQ,new n(null,5,[U,xQ,T,K(new R(null,2,5,S,[$Q,OG],null)),Y,"Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks.",X,!0,W,i$],null),null),new z5(MY,Nz,new n(null,5,[U,Nz,T,K(new R(null,2,5,S,[iQ,Fs],null)),Y,"Returns the map with the keys in kmap renamed to the vals in kmap",X,!0,W,i$],null),null)]),wha,kka, -vha,new n(null,3,[Vz,k$,JC,new z5(XV,JC,new n(null,5,[U,JC,T,K(new R(null,1,5,S,[iv],null),new R(null,2,5,S,[new n(null,2,[$B,new R(null,1,5,S,[pK],null),rz,yq],null),iv],null),new R(null,4,5,S,[iv,Qba,pK,yq],null)),Y,"Reads the first object from an cljs.tools.reader.reader-types/IPushbackReader.\n Returns the object read. If EOF, throws if eof-error? is true otherwise returns eof.\n If no reader is provided, *in* will be used.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n cljs.tools.reader.edn/read doesn't depend on dynamic Vars, all configuration\n is done by passing an opt map.\n\n opts is a map that can include the following keys:\n :eof - value to return on end-of-file. When not supplied, eof throws an exception.\n :readers - a map of tag symbols to data-reader functions to be considered before default-data-readers.\n When not supplied, only the default-data-readers will be used.\n :default - A function of two args, that will, if present and no reader is found for a tag,\n be called with the tag and the value.", -X,!0,W,k$],null),null),DD,new z5(YV,DD,new n(null,5,[U,DD,T,K(new R(null,1,5,S,[OC],null),new R(null,2,5,S,[yq,OC],null)),Y,"Reads one object from the string s.\n Returns nil when s is nil or empty.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n opts is a map as per cljs.tools.reader.edn/read",X,!0,W,k$],null),null)],null),hka]);var lka=nk(l$);function m$(a){return Zh(jj.j(Gl,xi.g(ej,ri.h(P5)),a))} -var mka=new n(null,4,[rp,new n(null,2,[Sp,Error,AG,function(){var a=null;a=function(b,c,d){switch(arguments.length){case 1:return Error(b);case 2:return Error(b,c);case 3:return Error(b,c,d)}throw Error("Invalid arity: "+arguments.length);};a.h=function(b){return Error(b)};a.g=function(b,c){return Error(b,c)};a.j=function(b,c,d){return Error(b,c,d)};return a}()],null),wA,dk,XJ,new n(null,2,[Sp,Wa,AG,function(a){return new Wa(a)}],null),hL,y5],null);function nka(){return null} -var oka=new n(null,1,[Ap,sJ],null);var n$=function n$(a,b){if(uf(b))if(A.g(no,u(b))){var d=bf(b);d=p(p(d)?oG.h(d):d)?new n(null,2,[Fz,Fz.h(d),oG,oG.h(d)],null):null;p(d)&&(G5=d);try{var e=ce(b);for(b=null;;)if(C(e)){var f=ce(e),h=u(e);var k=n$.g?n$.g(a,h):n$.call(null,a,h);e=f;b=k}else return b}finally{p(d)&&(G5=null)}}else{e=Vm.s();f=Bi(Xe([e,new n(null,1,[0,new n(null,1,[ru,Wh],null)],null)]));a=Ve.l(a,zn,new R(null,2,5,S,[e,0],null),F([pu,f]));b=D7.j(a,b,!0);e=Ce(nj.g(w(f),new R(null,3,5,S,[e,0,ru],null)));e=Hh.h(e);if(b instanceof -Y4)return b=b.mc(null),n$.g?n$.g(a,b):n$.call(null,a,b);try{return Z(b,a,e)}catch(l){if(l instanceof Error)return e=l,O5(a,0,e,b);throw l;}}else{e=Vm.s();f=Bi(Xe([e,new n(null,1,[0,new n(null,1,[ru,Wh],null)],null)]));a=Ve.l(a,zn,new R(null,2,5,S,[e,0],null),F([pu,f]));b=D7.g(a,b);e=Ce(nj.g(w(f),new R(null,3,5,S,[e,0,ru],null)));e=Hh.h(e);try{return Z(b,a,e)}catch(l){if(l instanceof Error)return e=l,O5(a,0,e,b);throw l;}}};Gd(W5,n$); -var o$=function o$(a){switch(arguments.length){case 2:return o$.g(arguments[0],arguments[1]);case 3:return o$.j(arguments[0],arguments[1],arguments[2]);default:throw Error(["Invalid arity: ",q.h(arguments.length)].join(""));}};o$.g=function(a,b){return o$.j(a,b,null)};o$.j=function(a,b,c){var d=V5;var e=p(c)?W.h(c):null;e=p(e)?e:w(V5);r5(Xe([d,e]));try{var f=dV(cV(b));for(b=null;;){var h=H8(a,f,null);if(nh(Ut,h))return p(p(c)?Yq.h(c):null)?new n(null,2,[Sm,b,W,w(V5)],null):b;b=n$(a,h)}}finally{s5()}}; -o$.m=3;Gd(c6,o$);function p$(a,b,c){return new z5(b,a,Ve.j(c,U,w5.h?w5.h(a):w5.call(null,a)),!1)}function q$(a,b,c){return new z5(b,a,Ve.l(c,qN,!0,F([U,w5.h?w5.h(a):w5.call(null,a)])),!1)}function r$(a,b,c){return new z5(Xh.u(b,Ve,xG,!0),a,Ve.l(c,vU,!0,F([U,w5.h?w5.h(a):w5.call(null,a)])),!1)}function s$(a,b){var c=c5;c5=!0;try{x5.g(a,b)}finally{c5=c}}function pka(a,b){var c=new n(null,1,[W,w(t$)],null);return o$.j(a,b,Ve.j(c,Yq,!0))} -function qka(a){a=null==a?null:bo(a);a=null==a?null:KA.h(a);return null==a?null:Mfa(a)}function u$(a,b){return Rb.j(function(c,d){var e=D.j(d,0,null),f=D.j(d,1,null);d=ob.h(f);var h=Ve.j,k=vv.h(f);f=p(k)?w(k):Sm.h(f);return h.call(Ve,c,e,p$(e,f,Ve.l(d,W,b,F([U,e]))))},Wh,a)};var v$=function v$(a){for(var c=[],d=arguments.length,e=0;;)if(e=Ce(b)&&si(function(c){return Af(a,c)},b)},oJ,new n(null,5,[U,oJ,T,K(new R(null,2,5,S,[cI,dI],null)),Y,"Is set1 a superset of set2?",X,!0,W,i$],null),null),new z5(PY,cB,new n(null,5,[U,cB,T,K(new R(null,2,5,S,[dR,XC],null),new R(null,3,5,S,[dR,XC,JG],null)),Y,"When passed 2 rels, returns the rel corresponding to the natural\n join. When passed an additional keymap, joins on the corresponding\n keys.", +X,!0,W,i$],null),null),new z5(JY,Yw,new n(null,5,[U,Yw,T,K(Se,new R(null,1,5,S,[vI],null),new R(null,2,5,S,[vI,yI],null),new R(null,4,5,S,[vI,yI,go,sH],null)),Y,"Return a set that is the union of the input sets",X,!0,W,i$],null),null),new z5(function(a,b){return Jl(ri.g(function(c){return MY(c,b)},a))},eP,new n(null,5,[U,eP,T,K(new R(null,2,5,S,[dR,Ds],null)),Y,"Returns a rel of the maps in xrel with the keys in kmap renamed to the vals in kmap",X,!0,W,i$],null),null),new z5(function(a,b){return Ce(a)<= +Ce(b)&&si(function(c){return Af(b,c)},a)},VN,new n(null,5,[U,VN,T,K(new R(null,2,5,S,[cI,dI],null)),Y,"Is set1 a subset of set2?",X,!0,W,i$],null),null),new z5(LY,bS,new n(null,5,[U,bS,T,K(new R(null,1,5,S,[vI],null),new R(null,2,5,S,[vI,yI],null),new R(null,4,5,S,[vI,yI,go,sH],null)),Y,"Return a set that is the first set without elements of the remaining sets",X,!0,W,i$],null),null),i$,new z5(KY,IN,new n(null,5,[U,IN,T,K(new R(null,1,5,S,[vI],null),new R(null,2,5,S,[vI,yI],null),new R(null,4,5,S, +[vI,yI,go,sH],null)),Y,"Return a set that is the intersection of the input sets",X,!0,W,i$],null),null),new z5(NY,BQ,new n(null,5,[U,BQ,T,K(new R(null,2,5,S,[dR,OG],null)),Y,"Returns a map of the distinct values of ks in the xrel mapped to a\n set of the maps in xrel with the corresponding values of ks.",X,!0,W,i$],null),null),new z5(MY,Nz,new n(null,5,[U,Nz,T,K(new R(null,2,5,S,[lQ,Ds],null)),Y,"Returns the map with the keys in kmap renamed to the vals in kmap",X,!0,W,i$],null),null)]),wha,kka, +vha,new n(null,3,[Wz,k$,JC,new z5(XV,JC,new n(null,5,[U,JC,T,K(new R(null,1,5,S,[hv],null),new R(null,2,5,S,[new n(null,2,[aC,new R(null,1,5,S,[pK],null),rz,wq],null),hv],null),new R(null,4,5,S,[hv,Qba,pK,wq],null)),Y,"Reads the first object from an cljs.tools.reader.reader-types/IPushbackReader.\n Returns the object read. If EOF, throws if eof-error? is true otherwise returns eof.\n If no reader is provided, *in* will be used.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n cljs.tools.reader.edn/read doesn't depend on dynamic Vars, all configuration\n is done by passing an opt map.\n\n opts is a map that can include the following keys:\n :eof - value to return on end-of-file. When not supplied, eof throws an exception.\n :readers - a map of tag symbols to data-reader functions to be considered before default-data-readers.\n When not supplied, only the default-data-readers will be used.\n :default - A function of two args, that will, if present and no reader is found for a tag,\n be called with the tag and the value.", +X,!0,W,k$],null),null),CD,new z5(YV,CD,new n(null,5,[U,CD,T,K(new R(null,1,5,S,[OC],null),new R(null,2,5,S,[wq,OC],null)),Y,"Reads one object from the string s.\n Returns nil when s is nil or empty.\n\n Reads data in the edn format (subset of Clojure data):\n http://edn-format.org\n\n opts is a map as per cljs.tools.reader.edn/read",X,!0,W,k$],null),null)],null),hka]);var lka=nk(l$);function m$(a){return Zh(jj.j(Gl,xi.g(ej,ri.h(P5)),a))} +var mka=new n(null,4,[rp,new n(null,2,[Sp,Error,AG,function(){var a=null;a=function(b,c,d){switch(arguments.length){case 1:return Error(b);case 2:return Error(b,c);case 3:return Error(b,c,d)}throw Error("Invalid arity: "+arguments.length);};a.h=function(b){return Error(b)};a.g=function(b,c){return Error(b,c)};a.j=function(b,c,d){return Error(b,c,d)};return a}()],null),wA,dk,XJ,new n(null,2,[Sp,Wa,AG,function(a){return new Wa(a)}],null),iL,y5],null);function nka(){return null} +var oka=new n(null,1,[Ap,rJ],null);var n$=function n$(a,b){if(uf(b))if(A.g(no,u(b))){var d=bf(b);d=p(p(d)?oG.h(d):d)?new n(null,2,[Fz,Fz.h(d),oG,oG.h(d)],null):null;p(d)&&(G5=d);try{var e=ce(b);for(b=null;;)if(C(e)){var f=ce(e),h=u(e);var k=n$.g?n$.g(a,h):n$.call(null,a,h);e=f;b=k}else return b}finally{p(d)&&(G5=null)}}else{e=Vm.s();f=Bi(Xe([e,new n(null,1,[0,new n(null,1,[qu,Wh],null)],null)]));a=Ve.l(a,zn,new R(null,2,5,S,[e,0],null),F([nu,f]));b=D7.j(a,b,!0);e=Ce(nj.g(w(f),new R(null,3,5,S,[e,0,qu],null)));e=Hh.h(e);if(b instanceof +Y4)return b=b.mc(null),n$.g?n$.g(a,b):n$.call(null,a,b);try{return Z(b,a,e)}catch(l){if(l instanceof Error)return e=l,O5(a,0,e,b);throw l;}}else{e=Vm.s();f=Bi(Xe([e,new n(null,1,[0,new n(null,1,[qu,Wh],null)],null)]));a=Ve.l(a,zn,new R(null,2,5,S,[e,0],null),F([nu,f]));b=D7.g(a,b);e=Ce(nj.g(w(f),new R(null,3,5,S,[e,0,qu],null)));e=Hh.h(e);try{return Z(b,a,e)}catch(l){if(l instanceof Error)return e=l,O5(a,0,e,b);throw l;}}};Gd(W5,n$); +var o$=function o$(a){switch(arguments.length){case 2:return o$.g(arguments[0],arguments[1]);case 3:return o$.j(arguments[0],arguments[1],arguments[2]);default:throw Error(["Invalid arity: ",q.h(arguments.length)].join(""));}};o$.g=function(a,b){return o$.j(a,b,null)};o$.j=function(a,b,c){var d=V5;var e=p(c)?W.h(c):null;e=p(e)?e:w(V5);r5(Xe([d,e]));try{var f=dV(cV(b));for(b=null;;){var h=H8(a,f,null);if(nh(St,h))return p(p(c)?Wq.h(c):null)?new n(null,2,[Sm,b,W,w(V5)],null):b;b=n$(a,h)}}finally{s5()}}; +o$.m=3;Gd(c6,o$);function p$(a,b,c){return new z5(b,a,Ve.j(c,U,w5.h?w5.h(a):w5.call(null,a)),!1)}function q$(a,b,c){return new z5(b,a,Ve.l(c,qN,!0,F([U,w5.h?w5.h(a):w5.call(null,a)])),!1)}function r$(a,b,c){return new z5(Xh.u(b,Ve,xG,!0),a,Ve.l(c,vU,!0,F([U,w5.h?w5.h(a):w5.call(null,a)])),!1)}function s$(a,b){var c=c5;c5=!0;try{x5.g(a,b)}finally{c5=c}}function pka(a,b){var c=new n(null,1,[W,w(t$)],null);return o$.j(a,b,Ve.j(c,Wq,!0))} +function qka(a){a=null==a?null:bo(a);a=null==a?null:KA.h(a);return null==a?null:Mfa(a)}function u$(a,b){return Rb.j(function(c,d){var e=D.j(d,0,null),f=D.j(d,1,null);d=ob.h(f);var h=Ve.j,k=tv.h(f);f=p(k)?w(k):Sm.h(f);return h.call(Ve,c,e,p$(e,f,Ve.l(d,W,b,F([U,e]))))},Wh,a)};var v$=function v$(a){for(var c=[],d=arguments.length,e=0;;)if(eclj ( .getItem js/localStorage \"defaults-key\" ))] ;; <-- Problem ( assoc db :defaults val )))) This works, but there's a cost. Because it has directly accessed LocalStore, this event handler is not pure, and impure functions cause well-documented paper cuts, and paper cuts have a way of accumulating non-linearly. How We Want It \u00b6 Our goal in this tutorial is to rewrite this event handler so that it only uses data from arguments (coeffects!). This will take a few steps. The first is that we switch to using reg-event-fx (instead of reg-event-db ). Event handlers registered via reg-event-fx are slightly different to those registered via reg-event-db . -fx handlers get two arguments, but the first is not db . Instead it is an argument which we will call cofx (that's a nice distinct name which will aid communication). Previous tutorials showed there's a :db key in cofx . We now want cofx to have other keys and values, like this: ( reg-event-fx ;; note: -fx :load-defaults ( fn [ cofx event ] ;; cofx means coeffects ( let [ val ( :local-store cofx ) ;; <-- get data from cofx db ( :db cofx )] ;; <-- more data from cofx { :db ( assoc db :defaults val )}))) ;; returns an effect Notice how cofx magically contains a :local-store key with the right value. Nice! But how do we make this magic happen? Abracadabra \u00b6 Each time an event is \"handled\", a brand new context (map) is created, and within that context is a :coeffects key which is a further map (initially empty). That pristine context value (containing, in turn, a pristine :coeffects map) is threaded through the :before function of each interceptor (in the event handler chain) before it finally reaches the registered event handler, which sits on the end of the chain, itself wrapped up in an interceptor. We know this story well from a previous tutorial. These :before functions have the opportunity to assoc into the :coeffects map (within the context ), cumulatively adding to what it holds. Later, our event handler, which sits on the end of the chain, finds that its first cofx argument contains just the right data, like, for example, a value for the key :local-store . So, it is the event handler's Interceptor chain which can add to the \"world\" eventually \"seen\" by an event handler. Which Interceptors? \u00b6 If Interceptors put data in :coeffects , then we'll need to add the right ones when we register our event handler. Something like this (this handler is the same as before, except for one detail): ( reg-event-fx :load-defaults [ ( inject-cofx :local-store \"defaults-key\" ) ] ;; <-- this is new ( fn [ cofx event ] ( let [ val ( :local-store cofx ) db ( :db cofx )] { :db ( assoc db :defaults val )}))) Look at that - my event handler now has a new Interceptor which will inject (assoc) the right key/value pair ( :local-store ) into context's :coeffects , which itself is the map which goes on to be the first argument to our event handler (aka cofx ). inject-cofx \u00b6 inject-cofx is part of the re-frame API. It is a function which returns an Interceptor whose :before function loads a key/value pair into a context's :coeffects map. inject-cofx takes either one or two arguments. The first is always the id of the coeffect required (called a cofx-id ). The 2nd is an optional additional value. So, in the case above, the cofx-id was :local-store and the additional value was \"defaults-key\" which was presumably the LocalStore key. More inject-cofx \u00b6 Here's some other usage examples: (inject-cofx :random-int 10) (inject-cofx :guid) (inject-cofx :now) I could create an event handler which has access to 3 coeffects: ( reg-event-fx :some-id [( inject-cofx :random-int 10 ) ( inject-cofx :now ) ( inject-cofx :local-store \"blah\" )] ;; 3 ( fn [ cofx _ ] ... in here I can access cofx 's keys :now :local-store and :random-int )) But that's probably just greedy. And so, to the final piece in the puzzle: how does inject-cofx know what to do when it is given :now or :local-store ? Each cofx-id requires a different action. Meet reg-cofx \u00b6 This function is also part of the re-frame API. It allows you to associate a cofx-id (like :now or :local-store ) with a handler function that injects the right key/value pair. The function you register will be passed two arguments: a :coeffects map (to which it should add a key/value pair), and optionally, the additional value supplied to inject-cofx and it is expected to return a modified :coeffects map. Example Of reg-cofx \u00b6 Above, we wrote an event handler that wanted :now data to be available. Here is how a handler could be registered for :now : ( reg-cofx ;; registration function :now ;; what cofx-id are we registering ( fn [ coeffects _ ] ;; second parameter not used in this case ( assoc coeffects :now ( js.Date. )))) ;; add :now key, with value The outcome is: because that cofx handler above is now registered for :now , I can add an Interceptor to an event handler which looks like (inject-cofx :now) which means within that event handler I can access a :now value from cofx As a result, my event handler is pure. Another Example Of reg-cofx \u00b6 This: ( reg-cofx ;; new registration function :local-store ( fn [ coeffects local-store-key ] ( assoc coeffects :local-store ( js->clj ( .getItem js/localStorage local-store-key ))))) With these two registrations in place, I could now use both (inject-cofx :now) and (inject-cofx :local-store \"blah\") in an event handler's interceptor chain. To put this another way: I can't use (inject-cofx :blah) UNLESS I have previously used reg-cofx to register a handler for :blah . Otherwise inject-cofx doesn't know how to inject a :blah . Secret Interceptors \u00b6 In a previous tutorial we learned that reg-events-db and reg-events-fx add default interceptors to the front of the interceptor chain specified during registration. We found they inserted an Interceptor called do-fx . I can now reveal that they also add (inject-cofx :db) at the front of each chain. Guess what that injects into the :coeffects of every event handler? This is how :db is always available to event handlers. Okay, so that was the last surprise. Now you know everything. If ever you wanted to use DataScript, instead of an atom-containing-a-map like app-db , you'd replace reg-event-db and reg-event-fx with your own registration functions and have them auto insert the DataScript connection. Testing \u00b6 During testing, you may want to stub out certain coeffects. You may, for example, want to test that an event handler works using a specific now . In your test, you'd mock out the cofx handler: ( reg-cofx :now ( fn [ coeffects _ ] ( assoc coeffects :now ( js/Date. 2016 1 1 ))) ;; then is `:now` If your test does alter registered coeffect handlers, and you are using cljs.test , then you can use a fixture to restore all coeffects at the end of your test: ( defn fixture-re-frame [] ( let [ restore-re-frame ( atom nil )] { :before # ( reset! restore-re-frame ( re-frame.core/make-restore-fn )) :after # ( @ restore-re-frame )})) ( use-fixtures :each ( fixture-re-frame )) re-frame.core/make-restore-fn creates a checkpoint for re-frame state (including registered handlers) to which you can return. The 5 Point Summary \u00b6 In note form: Event handlers should only source data from their arguments We want to \"inject\" required data into the first, cofx argument We use the (inject-cofx :key) interceptor in registration of the event handler It will look up the registered cofx handler for that :key to do the injection We must have previously registered a cofx handler via reg-cofx","title":"Coeffects"},{"location":"Coeffects/#coeffects","text":"This tutorial explains coeffects . It explains what they are, how they can be \"injected\", and how to manage them in tests.","title":"Coeffects"},{"location":"Coeffects/#what-are-they","text":"Event handlers compute how the world should change in response to an event and, to do that, they need to first know the current state of the world. coeffects is the current state of the world, as data, as presented to an event handler. Many event handlers only need application state to do their job - that's as much of \"the world\" as they need to know about. To make this common case easy to program, there's a specific registration function, called reg-event-db , which delivers ONLY the coeffect db to the event handler (and event of course). Such an event handler will have this signature: ( fn [ db event ] ... return updated db ) But event handlers sometimes need to know more about the world OR have more inputs than just application state. Sometimes they need \"inputs\" like a random number, or a GUID, or the current datetime. Perhaps they need access to LocalStore, or Cookies, or a DataScript connection. We refer to these inputs collectively as the event handler's coeffects . When more than application state is needed, we use the registration function reg-event-fx and the event handler has a signature like this: ( fn [ coeffects event ] ;; first arg is often abbreviated to cofx ... return a map of effects ) Notice how previously the first arg was db and now it is coeffects . coeffects is a map, and it contains a :db key which is the current application state. But it can contain other keys holding data about other aspects of the world. So coeffects is a superset of db . It is a bigger world to compute against.","title":"What Are They?"},{"location":"Coeffects/#a-motivating-example","text":"Imagine you had an event handler which needed to \"know\" a value in LocalStore, in order to compute an event's effect. It could be written to access data directly from LocalStore: ( reg-event-db :load-defaults ( fn [ db _ ] ( let [ val ( js->clj ( .getItem js/localStorage \"defaults-key\" ))] ;; <-- Problem ( assoc db :defaults val )))) This works, but there's a cost. Because it has directly accessed LocalStore, this event handler is not pure, and impure functions cause well-documented paper cuts, and paper cuts have a way of accumulating non-linearly.","title":"A Motivating Example"},{"location":"Coeffects/#how-we-want-it","text":"Our goal in this tutorial is to rewrite this event handler so that it only uses data from arguments (coeffects!). This will take a few steps. The first is that we switch to using reg-event-fx (instead of reg-event-db ). Event handlers registered via reg-event-fx are slightly different to those registered via reg-event-db . -fx handlers get two arguments, but the first is not db . Instead it is an argument which we will call cofx (that's a nice distinct name which will aid communication). Previous tutorials showed there's a :db key in cofx . We now want cofx to have other keys and values, like this: ( reg-event-fx ;; note: -fx :load-defaults ( fn [ cofx event ] ;; cofx means coeffects ( let [ val ( :local-store cofx ) ;; <-- get data from cofx db ( :db cofx )] ;; <-- more data from cofx { :db ( assoc db :defaults val )}))) ;; returns an effect Notice how cofx magically contains a :local-store key with the right value. Nice! But how do we make this magic happen?","title":"How We Want It"},{"location":"Coeffects/#abracadabra","text":"Each time an event is \"handled\", a brand new context (map) is created, and within that context is a :coeffects key which is a further map (initially empty). That pristine context value (containing, in turn, a pristine :coeffects map) is threaded through the :before function of each interceptor (in the event handler chain) before it finally reaches the registered event handler, which sits on the end of the chain, itself wrapped up in an interceptor. We know this story well from a previous tutorial. These :before functions have the opportunity to assoc into the :coeffects map (within the context ), cumulatively adding to what it holds. Later, our event handler, which sits on the end of the chain, finds that its first cofx argument contains just the right data, like, for example, a value for the key :local-store . So, it is the event handler's Interceptor chain which can add to the \"world\" eventually \"seen\" by an event handler.","title":"Abracadabra"},{"location":"Coeffects/#which-interceptors","text":"If Interceptors put data in :coeffects , then we'll need to add the right ones when we register our event handler. Something like this (this handler is the same as before, except for one detail): ( reg-event-fx :load-defaults [ ( inject-cofx :local-store \"defaults-key\" ) ] ;; <-- this is new ( fn [ cofx event ] ( let [ val ( :local-store cofx ) db ( :db cofx )] { :db ( assoc db :defaults val )}))) Look at that - my event handler now has a new Interceptor which will inject (assoc) the right key/value pair ( :local-store ) into context's :coeffects , which itself is the map which goes on to be the first argument to our event handler (aka cofx ).","title":"Which Interceptors?"},{"location":"Coeffects/#inject-cofx","text":"inject-cofx is part of the re-frame API. It is a function which returns an Interceptor whose :before function loads a key/value pair into a context's :coeffects map. inject-cofx takes either one or two arguments. The first is always the id of the coeffect required (called a cofx-id ). The 2nd is an optional additional value. So, in the case above, the cofx-id was :local-store and the additional value was \"defaults-key\" which was presumably the LocalStore key.","title":"inject-cofx"},{"location":"Coeffects/#more-inject-cofx","text":"Here's some other usage examples: (inject-cofx :random-int 10) (inject-cofx :guid) (inject-cofx :now) I could create an event handler which has access to 3 coeffects: ( reg-event-fx :some-id [( inject-cofx :random-int 10 ) ( inject-cofx :now ) ( inject-cofx :local-store \"blah\" )] ;; 3 ( fn [ cofx _ ] ... in here I can access cofx 's keys :now :local-store and :random-int )) But that's probably just greedy. And so, to the final piece in the puzzle: how does inject-cofx know what to do when it is given :now or :local-store ? Each cofx-id requires a different action.","title":"More inject-cofx"},{"location":"Coeffects/#meet-reg-cofx","text":"This function is also part of the re-frame API. It allows you to associate a cofx-id (like :now or :local-store ) with a handler function that injects the right key/value pair. The function you register will be passed two arguments: a :coeffects map (to which it should add a key/value pair), and optionally, the additional value supplied to inject-cofx and it is expected to return a modified :coeffects map.","title":"Meet reg-cofx"},{"location":"Coeffects/#example-of-reg-cofx","text":"Above, we wrote an event handler that wanted :now data to be available. Here is how a handler could be registered for :now : ( reg-cofx ;; registration function :now ;; what cofx-id are we registering ( fn [ coeffects _ ] ;; second parameter not used in this case ( assoc coeffects :now ( js.Date. )))) ;; add :now key, with value The outcome is: because that cofx handler above is now registered for :now , I can add an Interceptor to an event handler which looks like (inject-cofx :now) which means within that event handler I can access a :now value from cofx As a result, my event handler is pure.","title":"Example Of reg-cofx"},{"location":"Coeffects/#another-example-of-reg-cofx","text":"This: ( reg-cofx ;; new registration function :local-store ( fn [ coeffects local-store-key ] ( assoc coeffects :local-store ( js->clj ( .getItem js/localStorage local-store-key ))))) With these two registrations in place, I could now use both (inject-cofx :now) and (inject-cofx :local-store \"blah\") in an event handler's interceptor chain. To put this another way: I can't use (inject-cofx :blah) UNLESS I have previously used reg-cofx to register a handler for :blah . Otherwise inject-cofx doesn't know how to inject a :blah .","title":"Another Example Of reg-cofx"},{"location":"Coeffects/#secret-interceptors","text":"In a previous tutorial we learned that reg-events-db and reg-events-fx add default interceptors to the front of the interceptor chain specified during registration. We found they inserted an Interceptor called do-fx . I can now reveal that they also add (inject-cofx :db) at the front of each chain. Guess what that injects into the :coeffects of every event handler? This is how :db is always available to event handlers. Okay, so that was the last surprise. Now you know everything. If ever you wanted to use DataScript, instead of an atom-containing-a-map like app-db , you'd replace reg-event-db and reg-event-fx with your own registration functions and have them auto insert the DataScript connection.","title":"Secret Interceptors"},{"location":"Coeffects/#testing","text":"During testing, you may want to stub out certain coeffects. You may, for example, want to test that an event handler works using a specific now . In your test, you'd mock out the cofx handler: ( reg-cofx :now ( fn [ coeffects _ ] ( assoc coeffects :now ( js/Date. 2016 1 1 ))) ;; then is `:now` If your test does alter registered coeffect handlers, and you are using cljs.test , then you can use a fixture to restore all coeffects at the end of your test: ( defn fixture-re-frame [] ( let [ restore-re-frame ( atom nil )] { :before # ( reset! restore-re-frame ( re-frame.core/make-restore-fn )) :after # ( @ restore-re-frame )})) ( use-fixtures :each ( fixture-re-frame )) re-frame.core/make-restore-fn creates a checkpoint for re-frame state (including registered handlers) to which you can return.","title":"Testing"},{"location":"Coeffects/#the-5-point-summary","text":"In note form: Event handlers should only source data from their arguments We want to \"inject\" required data into the first, cofx argument We use the (inject-cofx :key) interceptor in registration of the event handler It will look up the registered cofx handler for that :key to do the injection We must have previously registered a cofx handler via reg-cofx","title":"The 5 Point Summary"},{"location":"Debugging/","text":"We recomend you use: re-frame-10x or refrisk with clj-devtools This page describes techniques for debugging re-frame's event handlers. Event handlers are quite central to a re-frame app. Only event handlers can update app-db to \"step\" an application \"forward\" from one state to the next. The debug Interceptor \u00b6 You might wonder: is my event handler making the right changes to app-db ? During development, the built-in re-frame.core/debug interceptor can help. It writes to console.log : the event being processed, for example: [:attempt-world-record true] the changes made to db by the handler in processing the event debug uses clojure.data/diff to compare the value of app-db before and after the handler ran, showing what changed. clojure.data/diff returns a triple , the first two entries of which debug will display in console.log (the 3rd says what has not changed and isn't interesting). The output produced by clojure.data/diff can take some getting used to, but you should stick with it -- your effort will be rewarded. Using debug \u00b6 So, you will add this Interceptor like this: ( re-frame.core/reg-event-db :some-id [ re-frame.core/debug ] ;; <---- added here! some-handler-fn ) Except, of course, we need to be more deft - we only want debug in development builds. We don't want the overhead of those clojure.data/diff calculations in production. So, this is better: ( re-frame.core/reg-event-db :some-id [( when ^ boolean goog.DEBUG re-frame.core/debug )] ;; <---- conditional! some-handler-fn ) goog.DEBUG is a compile time constant provided by the Google Closure Compiler . It will be true when the build within project.clj is :optimization :none and false otherwise. Ha! I see a problem, you say. In production, that when is going to leave a nil in the interceptor vector. So the Interceptor vector will be [nil] . Surely that's a problem? Well, actually, no it isn't. re-frame filters out any nil from interceptor vectors. Too Much Repetition - Part 1 \u00b6 Each event handler has its own interceptor stack. That might be all very flexible, but does that mean we have to put this debug business on every single handler? That would be very repetitive. Yes, you will have to put it on each handler. And, yes, that could be repetitive, unless you take some steps. One thing you can do is to define standard interceptors at the top of the event.cljs namespace: ( def standard-interceptors [( when ^ boolean goog.DEBUG debug ) another-interceptor ]) And then, for any one event handler, the code would look like: ( re-frame.core/reg-event-db :some-id standard-interceptors ;; <--- use the common definition some-handler-fn ) or perhaps: ( re-frame.core/reg-event-db :some-id [ standard-interceptors specific-interceptor ] ;; mix with something specific some-handler-fn ) So that specific-interceptor could be something required for just this one event handler, and it can be combined with the standard ones. Wait on! \"I see a problem\", you say. standard-interceptors is a vector , and it is within another vector along side specific-interceptor - so that's nested vectors of interceptors! No problem, re-frame uses flatten to take out all the nesting - the result is a simple chain of interceptors. And, as we have discussed, nil s are removed. 3. Checking DB Integrity \u00b6 Always have a detailed schema for the data in app-db ! Why? First , schemas serve as invaluable documentation. When I come to a new app, the first thing I want to look at is the underlying information model - the schema of the data. I hope it is well commented and I expect it to be rigorous and complete, using Clojure spec or, perhaps, a Prismatic Schema . Second a good spec allows you to assert the integrity and correctness of the data in app-db . Because all the data is in one place, that means you are asserting the integrity of ALL the data in your app, at one time. All of it. When should we do this? Ideally, every time a change is made! Well, it turns out that only event handlers can change the value in app-db , so only an event handler could corrupt it. So, we'd like to recheck the integrity of app-db immediately after every event handler has run . All of it, every time. This allows us to catch any errors very early, easily assigning blame (to the rogue event handler). Schemas are typically put into db.cljs (see the todomvc example in the re-frame repo). Here's an example using Prismatic Schema (although a more modern choice would be to use Clojure spec ): ( ns my.namespace.db ( :require [ schema.core :as s ])) ;; As exactly as possible, describe the correct shape of app-db ;; Add a lot of helpful comments. This will be an important resource ;; for someone looking at your code for the first time. ( def schema { :a { :b s/Str :c s/Int } :d [{ :e s/Keyword :f [ s/Num ]}]}) And a function which will check a db value against that schema: ( defn valid-schema? \"validate the given db, writing any problems to console.error\" [ db ] ( let [ res ( s/check schema db )] ( if ( some? res ) ( .error js/console ( str \"schema problem: \" res ))))) Now, let's organise for valid-schema? to be run after every handler. We'll use the built-in after Interceptor factory function: ( def standard-interceptors [( when ^ boolean goog.DEBUG debug ) ( when ^ boolean goog.DEBUG ( after db/valid-schema? ))]) ;; <-- new Now, the instant a handler messes up the structure of app-db you'll be alerted. But this overhead won't be there in production. Too Much Repetition - Part 2 \u00b6 Above, we discussed a way of \"factoring out\" common interceptors into standard-interceptors . There's an additional technique we can use to ensure that all event handlers get certain Interceptors: you write a custom registration function -- a replacement for reg-event-db -- like this: ( defn my-reg-event-db ;; alternative to reg-event-db ([ id handler-fn ] ( re-frame.core/reg-event-db id standard-interceptors handler-fn )) ([ id interceptors handler-fn ] ( re-frame.core/reg-event-db id [ standard-interceptors interceptors ] handler-fn ))) Notice how this registration function inserts our standard interceptors every time. From now on, you can register your event handlers like this and know that the two standard Interceptors have been inserted: ( my-reg-event-db ;; <-- adds std interceptors automatically :some-id some-handler-fn ) What about the -fx variation? \u00b6 Above we created my-reg-event-db as a new registration function for -db handlers. Now, -db handlers take db and event arguments, and return a new db . So, they MUST return a new db value. But what if we tried to do the same for -fx handlers which, instead, return an effects map which may, or may not, contain a :db ? Our solution would have to allow for the absence of a new db value (by doing no validity check, because nothing was being changed). ( def debug? ^ boolean goog.DEBUG ) ( def standard-interceptors-fx [( when debug? debug ) ;; as before ( when debug? ( after # ( if % ( db/valid-schema? % )))]) ;; <-- different after and then: ( defn my-reg-event-fx ;; alternative to reg-event-db ([ id handler-fn ] ( re-frame.core/reg-event-fx id standard-interceptors-fx handler-fn )) ([ id interceptors handler-fn ] ( re-frame.core/reg-event-fx id [ standard-interceptors-fx interceptors ] handler-fn )))","title":"Debugging"},{"location":"Debugging/#the-debug-interceptor","text":"You might wonder: is my event handler making the right changes to app-db ? During development, the built-in re-frame.core/debug interceptor can help. It writes to console.log : the event being processed, for example: [:attempt-world-record true] the changes made to db by the handler in processing the event debug uses clojure.data/diff to compare the value of app-db before and after the handler ran, showing what changed. clojure.data/diff returns a triple , the first two entries of which debug will display in console.log (the 3rd says what has not changed and isn't interesting). The output produced by clojure.data/diff can take some getting used to, but you should stick with it -- your effort will be rewarded.","title":"The debug Interceptor"},{"location":"Debugging/#using-debug","text":"So, you will add this Interceptor like this: ( re-frame.core/reg-event-db :some-id [ re-frame.core/debug ] ;; <---- added here! some-handler-fn ) Except, of course, we need to be more deft - we only want debug in development builds. We don't want the overhead of those clojure.data/diff calculations in production. So, this is better: ( re-frame.core/reg-event-db :some-id [( when ^ boolean goog.DEBUG re-frame.core/debug )] ;; <---- conditional! some-handler-fn ) goog.DEBUG is a compile time constant provided by the Google Closure Compiler . It will be true when the build within project.clj is :optimization :none and false otherwise. Ha! I see a problem, you say. In production, that when is going to leave a nil in the interceptor vector. So the Interceptor vector will be [nil] . Surely that's a problem? Well, actually, no it isn't. re-frame filters out any nil from interceptor vectors.","title":"Using debug"},{"location":"Debugging/#too-much-repetition-part-1","text":"Each event handler has its own interceptor stack. That might be all very flexible, but does that mean we have to put this debug business on every single handler? That would be very repetitive. Yes, you will have to put it on each handler. And, yes, that could be repetitive, unless you take some steps. One thing you can do is to define standard interceptors at the top of the event.cljs namespace: ( def standard-interceptors [( when ^ boolean goog.DEBUG debug ) another-interceptor ]) And then, for any one event handler, the code would look like: ( re-frame.core/reg-event-db :some-id standard-interceptors ;; <--- use the common definition some-handler-fn ) or perhaps: ( re-frame.core/reg-event-db :some-id [ standard-interceptors specific-interceptor ] ;; mix with something specific some-handler-fn ) So that specific-interceptor could be something required for just this one event handler, and it can be combined with the standard ones. Wait on! \"I see a problem\", you say. standard-interceptors is a vector , and it is within another vector along side specific-interceptor - so that's nested vectors of interceptors! No problem, re-frame uses flatten to take out all the nesting - the result is a simple chain of interceptors. And, as we have discussed, nil s are removed.","title":"Too Much Repetition - Part 1"},{"location":"Debugging/#3-checking-db-integrity","text":"Always have a detailed schema for the data in app-db ! Why? First , schemas serve as invaluable documentation. When I come to a new app, the first thing I want to look at is the underlying information model - the schema of the data. I hope it is well commented and I expect it to be rigorous and complete, using Clojure spec or, perhaps, a Prismatic Schema . Second a good spec allows you to assert the integrity and correctness of the data in app-db . Because all the data is in one place, that means you are asserting the integrity of ALL the data in your app, at one time. All of it. When should we do this? Ideally, every time a change is made! Well, it turns out that only event handlers can change the value in app-db , so only an event handler could corrupt it. So, we'd like to recheck the integrity of app-db immediately after every event handler has run . All of it, every time. This allows us to catch any errors very early, easily assigning blame (to the rogue event handler). Schemas are typically put into db.cljs (see the todomvc example in the re-frame repo). Here's an example using Prismatic Schema (although a more modern choice would be to use Clojure spec ): ( ns my.namespace.db ( :require [ schema.core :as s ])) ;; As exactly as possible, describe the correct shape of app-db ;; Add a lot of helpful comments. This will be an important resource ;; for someone looking at your code for the first time. ( def schema { :a { :b s/Str :c s/Int } :d [{ :e s/Keyword :f [ s/Num ]}]}) And a function which will check a db value against that schema: ( defn valid-schema? \"validate the given db, writing any problems to console.error\" [ db ] ( let [ res ( s/check schema db )] ( if ( some? res ) ( .error js/console ( str \"schema problem: \" res ))))) Now, let's organise for valid-schema? to be run after every handler. We'll use the built-in after Interceptor factory function: ( def standard-interceptors [( when ^ boolean goog.DEBUG debug ) ( when ^ boolean goog.DEBUG ( after db/valid-schema? ))]) ;; <-- new Now, the instant a handler messes up the structure of app-db you'll be alerted. But this overhead won't be there in production.","title":"3. Checking DB Integrity"},{"location":"Debugging/#too-much-repetition-part-2","text":"Above, we discussed a way of \"factoring out\" common interceptors into standard-interceptors . There's an additional technique we can use to ensure that all event handlers get certain Interceptors: you write a custom registration function -- a replacement for reg-event-db -- like this: ( defn my-reg-event-db ;; alternative to reg-event-db ([ id handler-fn ] ( re-frame.core/reg-event-db id standard-interceptors handler-fn )) ([ id interceptors handler-fn ] ( re-frame.core/reg-event-db id [ standard-interceptors interceptors ] handler-fn ))) Notice how this registration function inserts our standard interceptors every time. From now on, you can register your event handlers like this and know that the two standard Interceptors have been inserted: ( my-reg-event-db ;; <-- adds std interceptors automatically :some-id some-handler-fn )","title":"Too Much Repetition - Part 2"},{"location":"Debugging/#what-about-the-fx-variation","text":"Above we created my-reg-event-db as a new registration function for -db handlers. Now, -db handlers take db and event arguments, and return a new db . So, they MUST return a new db value. But what if we tried to do the same for -fx handlers which, instead, return an effects map which may, or may not, contain a :db ? Our solution would have to allow for the absence of a new db value (by doing no validity check, because nothing was being changed). ( def debug? ^ boolean goog.DEBUG ) ( def standard-interceptors-fx [( when debug? debug ) ;; as before ( when debug? ( after # ( if % ( db/valid-schema? % )))]) ;; <-- different after and then: ( defn my-reg-event-fx ;; alternative to reg-event-db ([ id handler-fn ] ( re-frame.core/reg-event-fx id standard-interceptors-fx handler-fn )) ([ id interceptors handler-fn ] ( re-frame.core/reg-event-fx id [ standard-interceptors-fx interceptors ] handler-fn )))","title":"What about the -fx variation?"},{"location":"EffectfulHandlers/","text":"This tutorial shows you how to implement pure event handlers that side-effect. Yes, a surprising claim. Events Happen \u00b6 Events \"happen\" when they are dispatched. So, this makes an event happen: ( dispatch [ :repair-ming-vase true ]) Events are normally triggered by an external agent: the user clicks a button, or a server-pushed message arrives on a websocket. Handling The Happening \u00b6 Once dispatched, an event must be \"handled\" - which means it must be processed or actioned. Events are mutative by nature. If your application is in one state before an event is processed, it will be in a different state afterwards. And that state change is very desirable. Without the state change our application can't incorporate that button click, or the newly arrived websocket message. Without mutation, an app would just sit there, stuck. State change is how an application \"moves forward\" - how it does its job. Useful! On the other hand, control logic and state mutation tend to be the most complex and error prone part of an app. Your Handling \u00b6 To help wrangle this potential complexity, re-frame's introduction provided you with a simple programming model. It said you should call reg-event-db to associate an event id, with a function to do the handling: ( re-frame.core/reg-event-db ;; <-- call this to register a handler :set-flag ;; this is an event id ( fn [ db [ _ new-value ]] ;; this function does the handling ( assoc db :flag new-value ))) The function you register, handles events with a given id . And that handler fn is expected to be pure. Given the value in app-db as the first argument, and the event (vector) as the second argument, it is expected to provide a new value for app-db . Data in, a computation and data out. Pure. 90% Solution \u00b6 This paradigm provides a lovely solution 90% of the time, but there are times when it isn't enough. Here's an example from the messy 10%. To get its job done, this handler has to side effect: ( reg-event-db :my-event ( fn [ db [ _ bool ]] ( dispatch [ :do-something-else 3 ]) ;; oops, side-effect ( assoc db :send-spam new-val ))) That dispatch queues up another event to be processed. It changes the world. Just to be clear, this code works. The handler returns a new version of db , so tick, and that dispatch will itself be \"handled\" asynchronously very shortly after this handler finishes, double tick. So, you can \"get away with it\". But it ain't pure. And here's more carnage: ( reg-event-db :my-event ( fn [ db [ _ a ]] ( GET \"http://json.my-endpoint.com/blah\" ;; dirty great big side-effect { :handler # ( dispatch [ :process-response %1 ]) :error-handler # ( dispatch [ :bad-response %1 ])}) ( assoc db :flag true ))) Again, this approach will work. But that dirty great big side-effect doesn't come for free. It's like a muddy monster truck has shown up in our field of white tulips. Bad, Why? \u00b6 The moment we stop writing pure functions there are well documented consequences: Cognitive load for the function's later readers goes up because they can no longer reason locally. Testing becomes more difficult and involves \"mocking\". How do we test that the http GET above is using the right URL? \"mocking\" should be mocked. It is a bad omen. And event replay-ability is lost. Regarding the 3rd point above, a re-frame application proceeds step by step, like a reduce. From the README: at any one time, the value in app-db is the result of performing a reduce over the entire collection of events dispatched in the app up until that time. The combining function for this reduce is the set of registered event handlers. Such a collection of events is replay-able which is a dream for debugging and testing. But only when all the handlers are pure. Handlers with side-effects (like that HTTP GET, or the dispatch ) pollute the replay, inserting extra events into it, etc., which ruins the process. The 2nd Kind Of Problem \u00b6 And there's the other kind of purity problem: ( reg-event-db :load-localstore ( fn [ db _ ] ( let [ val ( js->clj ( .getItem js/localStorage \"defaults-key\" ))] ;; <-- Problem ( assoc db :defaults val )))) You'll notice the event handler obtains data from LocalStore. Although this handler has no side effect - it doesn't need to change the world - that action of obtaining data from somewhere other than its arguments, means it isn't pure. Effects And Coeffects \u00b6 When striving for pure event handlers there are two considerations : Effects - what your event handler does to the world (aka side-effects) Coeffects - the data your event handler requires from the world in order to do its computation (aka side-causes ) We'll need a solution for both. Why Does This Happen? \u00b6 It is inevitable that, say, 10% of your event handlers have effects and coeffects. They have to implement the control logic of your re-frame app, which means dealing with the outside, mutative world of servers, databases, window.location, LocalStore, cookies, etc. There's just no getting away from living in a mutative world, which sounds pretty ominous. Is that it? Are we doomed to impurity? Well, luckily a small twist in the tale makes a profound difference. We will look at side-effects first. Instead of creating event handlers which do side-effects , we'll instead get them to cause side-effects . Doing vs Causing \u00b6 I proudly claim that this event handler is pure: ( reg-event-db :my-event ( fn [ db _ ] ( assoc db :flag true ))) Takes a db value, computes and returns a db value. No coeffects or effects. Yep, that's Pure! Yes, all true, but ... this purity is only possible because re-frame is doing the necessary side-effecting. Wait on. What \"necessary side-effecting\"? Well, application state is stored in app-db , right? And it is a ratom. And after each event handler runs, it must be reset! to the newly returned value. Notice reset! . That, right there, is the \"necessary side effecting\". We get to live in our ascetic functional world because re-frame is looking after the \"necessary side-effects\" on app-db . Et tu, React? \u00b6 Turns out it's the same pattern with Reagent/React. We get to write a nice pure component, like: ( defn say-hi [ name ] [ :div \"Hello \" name ]) and Reagent/React mutates the DOM for us. The framework is looking after the \"necessary side-effects\". Pattern Structure \u00b6 Pause and look back at say-hi . I'd like you to view it through the following lens: it is a pure function which returns a description of the side-effects required . It says: add a div element to the DOM. Notice that the description is declarative. We don't tell React how to do it. Notice also that it is data. Hiccup is just vectors and maps. This is a big, important concept. While we can't get away from certain side-effects, we can program using pure functions which describe side-effects, declaratively, in data and let the backing framework look after the \"doing\" of them. Efficiently. Discreetly. Let's use this pattern to solve the side-effecting event-handler problem. Effects: The Two Step Plan \u00b6 From here, two steps: Work out how event handlers can declaratively describe side-effects, in data. Work out how re-frame can do the \"necessary side-effecting\". Efficiently and discreetly. Step 1 Of Plan \u00b6 So, how would it look if event handlers returned side-effects, declaratively, in data? Here is an impure, side effecting handler: ( reg-event-db :my-event ( fn [ db [ _ a ]] ( dispatch [ :do-something-else 3 ]) ;; <-- Eeek, side-effect ( assoc db :flag true ))) Here it is re-written so as to be pure: ( reg-event-fx ;; <1> :my-event ( fn [{ :keys [ db ]} [ _ a ]] ;; <2> { :db ( assoc db :flag true ) ;; <3> :dispatch [ :do-something-else 3 ]})) Notes: <1> we're using reg-event-fx instead of reg-event-db to register (that's -db vs -fx ) <2> the first parameter is no longer just db . It is a map from which we are destructuring db , i.e. it is a map which contains a :db key. <3> The handler is returning a data structure (map) which describes two side-effects: a change to application state, via the :db key a further event, via the :dispatch key Above, the impure handler did a dispatch side-effect, while the pure handler described a dispatch side-effect. Another Example \u00b6 The impure way: ( reg-event-db :my-event ( fn [ db [ _ a ]] ( GET \"http://json.my-endpoint.com/blah\" ;; dirty great big side-effect { :handler # ( dispatch [ :process-response %1 ]) :error-handler # ( dispatch [ :bad-response %1 ])}) ( assoc db :flag true ))) the pure, descriptive alternative: ( reg-event-fx :my-event ( fn [{ :keys [ db ]} [ _ a ]] { :http { :method :get :url \"http://json.my-endpoint.com/blah\" :on-success [ :process-blah-response ] :on-fail [ :failed-blah ]} :db ( assoc db :flag true )})) Again, the old way did a side-effect (Booo!) and the new way describes , declaratively, in data, the side-effects required (Yaaa!). More on side effects in a minute, but let's double back to coeffects. The Coeffects \u00b6 So far we've written our new style -fx handlers like this: ( reg-event-fx :my-event ( fn [{ :keys [ db ]} event ] ;; <-- destructuring to get db { ... })) It is now time to name that first argument: ( reg-event-fx :my-event ( fn [ cofx event ] ;; <--- thy name be cofx { ... })) When you use the -fx form of registration, the first argument of your handler will be a map of coeffects which we name cofx . In that map will be the complete set of \"inputs\" required by your function. The complete set of computational resources (data) needed to perform its computation. But how? This will be explained in an upcoming tutorial, I promise, but for the moment, take it as a magical given. One of the keys in cofx will likely be :db and that will be the value of app-db . Remember this impure handler from before: ( reg-event-db ;; a -db registration :load-localstore ( fn [ db _ ] ;; db first argument ( let [ defaults ( js->clj ( .getItem js/localStorage \"defaults-key\" ))] ;; <-- Eeek!! ( assoc db :defaults defaults )))) It was impure because it obtained an input from other than its arguments. We'd now rewrite it as a pure handler, like this: ( reg-event-fx ;; notice the -fx :load-localstore ( fn [ cofx _ ] ;; cofx is a map containing inputs ( let [ defaults ( :local-store cofx )] ;; <-- use it here { :db ( assoc ( :db cofx ) :defaults defaults )}))) ;; returns effects map So, by some magic, not yet revealed, LocalStore will be queried before this handler runs and the required value from it will be placed into cofx under the key :local-store for the handler to use. That process leaves the handler itself pure because it only sources data from arguments. Variations On A Theme \u00b6 -db handlers and -fx handlers are conceptually the same. They only differ numerically. -db handlers take one coeffect called db , and they return only one effect (db again). Whereas -fx handlers take potentially many coeffects (a map of them) and they return potentially many effects (a map of them). So, One vs Many. Just to be clear, the following two handlers achieve the same thing: ( reg-event-db :set-flag ( fn [ db [ _ new-value ]] ( assoc db :flag new-value ))) vs ( reg-event-fx :set-flag ( fn [ cofx [ _ new-value ]] { :db ( assoc ( :db cofx ) :flag new-value )})) Obviously the -db variation is simpler and you'd use it whenever you can. The -fx version is more flexible, so it will sometimes have its place. Summary \u00b6 90% of the time, simple -db handlers are the right tool to use. But about 10% of the time, our handlers need additional inputs (coeffects) or they need to cause additional side-effects (effects). That's when you reach for -fx handlers. -fx handlers allow us to return effects, declaratively in data. In the next tutorial, we'll shine a light on interceptors which are the mechanism by which event handlers are executed. That knowledge will give us a springboard to then, as a next step, better understand coeffects and effects. We'll soon be writing our own.","title":"Effectful Handlers"},{"location":"EffectfulHandlers/#events-happen","text":"Events \"happen\" when they are dispatched. So, this makes an event happen: ( dispatch [ :repair-ming-vase true ]) Events are normally triggered by an external agent: the user clicks a button, or a server-pushed message arrives on a websocket.","title":"Events Happen"},{"location":"EffectfulHandlers/#handling-the-happening","text":"Once dispatched, an event must be \"handled\" - which means it must be processed or actioned. Events are mutative by nature. If your application is in one state before an event is processed, it will be in a different state afterwards. And that state change is very desirable. Without the state change our application can't incorporate that button click, or the newly arrived websocket message. Without mutation, an app would just sit there, stuck. State change is how an application \"moves forward\" - how it does its job. Useful! On the other hand, control logic and state mutation tend to be the most complex and error prone part of an app.","title":"Handling The Happening"},{"location":"EffectfulHandlers/#your-handling","text":"To help wrangle this potential complexity, re-frame's introduction provided you with a simple programming model. It said you should call reg-event-db to associate an event id, with a function to do the handling: ( re-frame.core/reg-event-db ;; <-- call this to register a handler :set-flag ;; this is an event id ( fn [ db [ _ new-value ]] ;; this function does the handling ( assoc db :flag new-value ))) The function you register, handles events with a given id . And that handler fn is expected to be pure. Given the value in app-db as the first argument, and the event (vector) as the second argument, it is expected to provide a new value for app-db . Data in, a computation and data out. Pure.","title":"Your Handling"},{"location":"EffectfulHandlers/#90-solution","text":"This paradigm provides a lovely solution 90% of the time, but there are times when it isn't enough. Here's an example from the messy 10%. To get its job done, this handler has to side effect: ( reg-event-db :my-event ( fn [ db [ _ bool ]] ( dispatch [ :do-something-else 3 ]) ;; oops, side-effect ( assoc db :send-spam new-val ))) That dispatch queues up another event to be processed. It changes the world. Just to be clear, this code works. The handler returns a new version of db , so tick, and that dispatch will itself be \"handled\" asynchronously very shortly after this handler finishes, double tick. So, you can \"get away with it\". But it ain't pure. And here's more carnage: ( reg-event-db :my-event ( fn [ db [ _ a ]] ( GET \"http://json.my-endpoint.com/blah\" ;; dirty great big side-effect { :handler # ( dispatch [ :process-response %1 ]) :error-handler # ( dispatch [ :bad-response %1 ])}) ( assoc db :flag true ))) Again, this approach will work. But that dirty great big side-effect doesn't come for free. It's like a muddy monster truck has shown up in our field of white tulips.","title":"90% Solution"},{"location":"EffectfulHandlers/#bad-why","text":"The moment we stop writing pure functions there are well documented consequences: Cognitive load for the function's later readers goes up because they can no longer reason locally. Testing becomes more difficult and involves \"mocking\". How do we test that the http GET above is using the right URL? \"mocking\" should be mocked. It is a bad omen. And event replay-ability is lost. Regarding the 3rd point above, a re-frame application proceeds step by step, like a reduce. From the README: at any one time, the value in app-db is the result of performing a reduce over the entire collection of events dispatched in the app up until that time. The combining function for this reduce is the set of registered event handlers. Such a collection of events is replay-able which is a dream for debugging and testing. But only when all the handlers are pure. Handlers with side-effects (like that HTTP GET, or the dispatch ) pollute the replay, inserting extra events into it, etc., which ruins the process.","title":"Bad, Why?"},{"location":"EffectfulHandlers/#the-2nd-kind-of-problem","text":"And there's the other kind of purity problem: ( reg-event-db :load-localstore ( fn [ db _ ] ( let [ val ( js->clj ( .getItem js/localStorage \"defaults-key\" ))] ;; <-- Problem ( assoc db :defaults val )))) You'll notice the event handler obtains data from LocalStore. Although this handler has no side effect - it doesn't need to change the world - that action of obtaining data from somewhere other than its arguments, means it isn't pure.","title":"The 2nd Kind Of Problem"},{"location":"EffectfulHandlers/#effects-and-coeffects","text":"When striving for pure event handlers there are two considerations : Effects - what your event handler does to the world (aka side-effects) Coeffects - the data your event handler requires from the world in order to do its computation (aka side-causes ) We'll need a solution for both.","title":"Effects And Coeffects"},{"location":"EffectfulHandlers/#why-does-this-happen","text":"It is inevitable that, say, 10% of your event handlers have effects and coeffects. They have to implement the control logic of your re-frame app, which means dealing with the outside, mutative world of servers, databases, window.location, LocalStore, cookies, etc. There's just no getting away from living in a mutative world, which sounds pretty ominous. Is that it? Are we doomed to impurity? Well, luckily a small twist in the tale makes a profound difference. We will look at side-effects first. Instead of creating event handlers which do side-effects , we'll instead get them to cause side-effects .","title":"Why Does This Happen?"},{"location":"EffectfulHandlers/#doing-vs-causing","text":"I proudly claim that this event handler is pure: ( reg-event-db :my-event ( fn [ db _ ] ( assoc db :flag true ))) Takes a db value, computes and returns a db value. No coeffects or effects. Yep, that's Pure! Yes, all true, but ... this purity is only possible because re-frame is doing the necessary side-effecting. Wait on. What \"necessary side-effecting\"? Well, application state is stored in app-db , right? And it is a ratom. And after each event handler runs, it must be reset! to the newly returned value. Notice reset! . That, right there, is the \"necessary side effecting\". We get to live in our ascetic functional world because re-frame is looking after the \"necessary side-effects\" on app-db .","title":"Doing vs Causing"},{"location":"EffectfulHandlers/#et-tu-react","text":"Turns out it's the same pattern with Reagent/React. We get to write a nice pure component, like: ( defn say-hi [ name ] [ :div \"Hello \" name ]) and Reagent/React mutates the DOM for us. The framework is looking after the \"necessary side-effects\".","title":"Et tu, React?"},{"location":"EffectfulHandlers/#pattern-structure","text":"Pause and look back at say-hi . I'd like you to view it through the following lens: it is a pure function which returns a description of the side-effects required . It says: add a div element to the DOM. Notice that the description is declarative. We don't tell React how to do it. Notice also that it is data. Hiccup is just vectors and maps. This is a big, important concept. While we can't get away from certain side-effects, we can program using pure functions which describe side-effects, declaratively, in data and let the backing framework look after the \"doing\" of them. Efficiently. Discreetly. Let's use this pattern to solve the side-effecting event-handler problem.","title":"Pattern Structure"},{"location":"EffectfulHandlers/#effects-the-two-step-plan","text":"From here, two steps: Work out how event handlers can declaratively describe side-effects, in data. Work out how re-frame can do the \"necessary side-effecting\". Efficiently and discreetly.","title":"Effects: The Two Step Plan"},{"location":"EffectfulHandlers/#step-1-of-plan","text":"So, how would it look if event handlers returned side-effects, declaratively, in data? Here is an impure, side effecting handler: ( reg-event-db :my-event ( fn [ db [ _ a ]] ( dispatch [ :do-something-else 3 ]) ;; <-- Eeek, side-effect ( assoc db :flag true ))) Here it is re-written so as to be pure: ( reg-event-fx ;; <1> :my-event ( fn [{ :keys [ db ]} [ _ a ]] ;; <2> { :db ( assoc db :flag true ) ;; <3> :dispatch [ :do-something-else 3 ]})) Notes: <1> we're using reg-event-fx instead of reg-event-db to register (that's -db vs -fx ) <2> the first parameter is no longer just db . It is a map from which we are destructuring db , i.e. it is a map which contains a :db key. <3> The handler is returning a data structure (map) which describes two side-effects: a change to application state, via the :db key a further event, via the :dispatch key Above, the impure handler did a dispatch side-effect, while the pure handler described a dispatch side-effect.","title":"Step 1 Of Plan"},{"location":"EffectfulHandlers/#another-example","text":"The impure way: ( reg-event-db :my-event ( fn [ db [ _ a ]] ( GET \"http://json.my-endpoint.com/blah\" ;; dirty great big side-effect { :handler # ( dispatch [ :process-response %1 ]) :error-handler # ( dispatch [ :bad-response %1 ])}) ( assoc db :flag true ))) the pure, descriptive alternative: ( reg-event-fx :my-event ( fn [{ :keys [ db ]} [ _ a ]] { :http { :method :get :url \"http://json.my-endpoint.com/blah\" :on-success [ :process-blah-response ] :on-fail [ :failed-blah ]} :db ( assoc db :flag true )})) Again, the old way did a side-effect (Booo!) and the new way describes , declaratively, in data, the side-effects required (Yaaa!). More on side effects in a minute, but let's double back to coeffects.","title":"Another Example"},{"location":"EffectfulHandlers/#the-coeffects","text":"So far we've written our new style -fx handlers like this: ( reg-event-fx :my-event ( fn [{ :keys [ db ]} event ] ;; <-- destructuring to get db { ... })) It is now time to name that first argument: ( reg-event-fx :my-event ( fn [ cofx event ] ;; <--- thy name be cofx { ... })) When you use the -fx form of registration, the first argument of your handler will be a map of coeffects which we name cofx . In that map will be the complete set of \"inputs\" required by your function. The complete set of computational resources (data) needed to perform its computation. But how? This will be explained in an upcoming tutorial, I promise, but for the moment, take it as a magical given. One of the keys in cofx will likely be :db and that will be the value of app-db . Remember this impure handler from before: ( reg-event-db ;; a -db registration :load-localstore ( fn [ db _ ] ;; db first argument ( let [ defaults ( js->clj ( .getItem js/localStorage \"defaults-key\" ))] ;; <-- Eeek!! ( assoc db :defaults defaults )))) It was impure because it obtained an input from other than its arguments. We'd now rewrite it as a pure handler, like this: ( reg-event-fx ;; notice the -fx :load-localstore ( fn [ cofx _ ] ;; cofx is a map containing inputs ( let [ defaults ( :local-store cofx )] ;; <-- use it here { :db ( assoc ( :db cofx ) :defaults defaults )}))) ;; returns effects map So, by some magic, not yet revealed, LocalStore will be queried before this handler runs and the required value from it will be placed into cofx under the key :local-store for the handler to use. That process leaves the handler itself pure because it only sources data from arguments.","title":"The Coeffects"},{"location":"EffectfulHandlers/#variations-on-a-theme","text":"-db handlers and -fx handlers are conceptually the same. They only differ numerically. -db handlers take one coeffect called db , and they return only one effect (db again). Whereas -fx handlers take potentially many coeffects (a map of them) and they return potentially many effects (a map of them). So, One vs Many. Just to be clear, the following two handlers achieve the same thing: ( reg-event-db :set-flag ( fn [ db [ _ new-value ]] ( assoc db :flag new-value ))) vs ( reg-event-fx :set-flag ( fn [ cofx [ _ new-value ]] { :db ( assoc ( :db cofx ) :flag new-value )})) Obviously the -db variation is simpler and you'd use it whenever you can. The -fx version is more flexible, so it will sometimes have its place.","title":"Variations On A Theme"},{"location":"EffectfulHandlers/#summary","text":"90% of the time, simple -db handlers are the right tool to use. But about 10% of the time, our handlers need additional inputs (coeffects) or they need to cause additional side-effects (effects). That's when you reach for -fx handlers. -fx handlers allow us to return effects, declaratively in data. In the next tutorial, we'll shine a light on interceptors which are the mechanism by which event handlers are executed. That knowledge will give us a springboard to then, as a next step, better understand coeffects and effects. We'll soon be writing our own.","title":"Summary"},{"location":"Effects/","text":"Maybe 20% of the time, event handlers need to cause side effects. This tutorial explains how side effects are actioned, how you can create your own side effects, and how you can make side effects a noop in testing and event replays. Where Effects Come From \u00b6 When an event handler is registered via reg-event-fx , it must return effects. Like this: ( reg-event-fx ;; -fx registration, not -db registration :my-event ( fn [ cofx [ _ a ]] ;; 1st argument is coeffects, instead of db { :db ( assoc ( :db cofx ) :flag a ) :fx [[ :dispatch [ :do-something-else 3 ]]]})) ;; return effects -fx handlers return a description of the side-effects required, and that description is a map. The Effects Map \u00b6 An effects map contains instructions. Each key/value pair in the map is one instruction - the key uniquely identifies the particular side effect required, and the value for that key provides further data. The type of value depends on the specific side-effect. Here's the two instructions from the example above: { :db ( assoc db :flag a ) ;; side effect on app-db :fx [[ :dispatch [ :do-something-else 3 ]]]} ;; dispatch this event The :db key instructs that \"app-db\" should be reset! to the value supplied. And the :fx key instructs that an ordered list of other effects should be executed. In this case a :dispatch key instructs that an event should be dispatched. The value is the vector to dispatch. There are many other possible effects, like for example :dispatch-later , dispatch-n , :set-local-store , etc. And so on. And so on. Which brings us to a problem. Infinite Effects \u00b6 Although re-frame supplies a number of built-in effect handlers, the set of possible effects is open ended. What if you use PostgreSQL and want an effect which issues mutating queries? Or what if you want to send logs to Logentries or metrics to DataDog. Or write values to windows.location . Or save cookies. The list of effects is long and varied, with everyone needing to use a different combination. So effect handling has to be extensible. You need a way to define your own side effects. Extensible Side Effects \u00b6 re-frame provides a function reg-fx through which you can register your own Effect Handlers . Use it like this: ( reg-fx ;; <-- registration function :butterfly ;; <1> effect key ( fn [ value ] ;; <2> effect handler ... )) <1> Effect Key Later, when an effects map contains the key :butterfly , the function we are registering will be used to action it. <2> Effect handler The function which actions the side effect. Later, it will be called with one argument - the value associated with the key in the effects map. So, if an event handler returned these two effects: { :dispatch [ :save-maiden 42 ] :butterfly \"Flapping\" } ;; butterfly effect, but no chaos !! Then the function we registered for :butterfly would be called to handle that effect. And it would be called with the parameter \"Flapping\". So, terminology: :butterfly is an \"effect key\" and the function registered is an \"effect handler\". So re-frame has both event handlers and effect handlers and they are different, despite them both starting with e and ending in t !! Writing An Effect Handler \u00b6 A word of advice - make them as simple as possible, and then simplify them further. You don't want them containing any fancy logic. Why? Well, because they are all side-effecty they will be a pain to test rigorously. And the combination of fancy logic and limited testing always ends in tears. If not now, later. A second word of advice - when you create an effect handler, you also have to design (and document!) the structure of the value expected. When you do, realise that you are designing a nano DSL for value and try to make that design simple too. If you resist being terse and smart, and instead, favor slightly verbose and obvious, your future self will thank you. Create as little cognitive overhead as possible for the eventual readers of your effectful code. Right. So, this advice coming from the guy who named effects fx ... Oh, the hypocrisy. In my defence, here's the built-in effect handler for :db : ( reg-fx :db ( fn [ value ] ( reset! re-frame.db/app-db value ))) So, yeah, simple ... and, because of it, I can almost guarantee there's no bug in ... bang, crash, smoke, flames. Note The return value of an effect handler is ignored. :db Not Always Needed \u00b6 An effects map does not need to include the effect key :db . It is perfectly valid for an event handler to not change app-db . In fact, it is perfectly valid for an event handler to return an effects map of {} . Slightly puzzling, but not a problem. What Makes This Work? \u00b6 A silently inserted interceptor. Whenever you register an event handler via either reg-event-db or reg-event-fx , an interceptor, cunningly named do-fx , is inserted at the beginning of the chain. Example: if your event handler registration looked like this: ( reg-event-fx :some-id [ debug ( path :right )] ;; <-- two interceptors, apparently ( fn [ cofx _ ] {}) ;; <-- imagine returned effects here While it might look like you have registered with 2 interceptors, reg-event-fx will make it 3: [ do-fx debug ( path :right )] It silently inserts do-fx at the front, and this is a good thing. The placement of do-fx at the beginning of the interceptor chain means its :after function would be the final act when the chain is executed (forwards and then backwards, as described in the Interceptor Tutorial). In this final act, the :after function extracts :effects from context and simply iterates across the key/value pairs it contains, calling the registered \"effect handlers\" for each. For the record The FISA Court requires that we deny all claims that do-fx is secretly injected NSA surveillance-ware. We also note that you've been sloppy with your personal grooming again, including, but not limited to, forgetting to clean your teeth on one occassion last week. If ever you want to take control of the way effect handling is done, create your own alternative to reg-event-fx and, in it, inject your own version of the do-fx interceptor at the front of the interceptor chain. It is only a few lines of code. Order Of Effects? \u00b6 Prior to v1.1.0 , the answer is: no guarantees were provided about ordering. Actual order is an implementation detail upon which you should not rely. From v1.1.0 onwards , two things changed: re-frame guaranteed that the :db effect will always be actioned first, if present. But other than that, no guarantee is given for the other effects. a new effect called :fx was added, and it provides a way for effects to be ordered. In fact, with v1.1.0 best practice changed to event handlers should only return two effects :db and :fx , in which case :db was always done first and then :fx , and within :fx the ordering is sequential. This new approach is more about making it easier to compose event handlers from many smaller functions, but more specificity around ordering was a consequence. Effects With No Data \u00b6 Some effects have no associated data: ( reg-event-fx :some-id ( fn [ coeffect _ ] { :exit-fullscreen nil })) ;; <--- no data, use a nil In these cases, although it looks odd, just supply nil as the value for this key. The associated effect handler would look like: ( reg-fx :exit-fullscreen ( fn [ _ ] ;; we don't bother with that nil value ( .exitFullscreen js/document ))) Testing And Noops \u00b6 When you are running tests or replaying events, it is sometimes useful to stub out effects. This is easily done - you simply register a noop effect handler. Want to stub out the :dispatch effect? Do this: ( reg-fx :dispatch ( fn [ _ ] )) ;; a noop If your test does alter registered effect handlers, and you are using cljs.test , then you can use a fixture to restore all effect handlers at the end of your test: ( defn fixture-re-frame [] ( let [ restore-re-frame ( atom nil )] { :before # ( reset! restore-re-frame ( re-frame.core/make-restore-fn )) :after # ( @ restore-re-frame )})) ( use-fixtures :each ( fixture-re-frame )) re-frame.core/make-restore-fn creates a checkpoint for re-frame state (including registered handlers) to which you can return. Existing Effect Handlers \u00b6 re-frame's built-in effect handlers, like dispatch-n and dispatch-later , are detailed in the API document. And please review the External-Resources document for a list of 3rd party Effect Handlers. Summary \u00b6 The 4 Point Summary in note form: Event handlers should only return a description of required effects They return a map like {:effect1 value1 :effect2 value2} Keys of this map can refer to builtin effect handlers (see below) or custom ones We use reg-fx to register our own effect handlers, built-in ones are already registered","title":"Effects"},{"location":"Effects/#where-effects-come-from","text":"When an event handler is registered via reg-event-fx , it must return effects. Like this: ( reg-event-fx ;; -fx registration, not -db registration :my-event ( fn [ cofx [ _ a ]] ;; 1st argument is coeffects, instead of db { :db ( assoc ( :db cofx ) :flag a ) :fx [[ :dispatch [ :do-something-else 3 ]]]})) ;; return effects -fx handlers return a description of the side-effects required, and that description is a map.","title":"Where Effects Come From"},{"location":"Effects/#the-effects-map","text":"An effects map contains instructions. Each key/value pair in the map is one instruction - the key uniquely identifies the particular side effect required, and the value for that key provides further data. The type of value depends on the specific side-effect. Here's the two instructions from the example above: { :db ( assoc db :flag a ) ;; side effect on app-db :fx [[ :dispatch [ :do-something-else 3 ]]]} ;; dispatch this event The :db key instructs that \"app-db\" should be reset! to the value supplied. And the :fx key instructs that an ordered list of other effects should be executed. In this case a :dispatch key instructs that an event should be dispatched. The value is the vector to dispatch. There are many other possible effects, like for example :dispatch-later , dispatch-n , :set-local-store , etc. And so on. And so on. Which brings us to a problem.","title":"The Effects Map"},{"location":"Effects/#infinite-effects","text":"Although re-frame supplies a number of built-in effect handlers, the set of possible effects is open ended. What if you use PostgreSQL and want an effect which issues mutating queries? Or what if you want to send logs to Logentries or metrics to DataDog. Or write values to windows.location . Or save cookies. The list of effects is long and varied, with everyone needing to use a different combination. So effect handling has to be extensible. You need a way to define your own side effects.","title":"Infinite Effects"},{"location":"Effects/#extensible-side-effects","text":"re-frame provides a function reg-fx through which you can register your own Effect Handlers . Use it like this: ( reg-fx ;; <-- registration function :butterfly ;; <1> effect key ( fn [ value ] ;; <2> effect handler ... )) <1> Effect Key Later, when an effects map contains the key :butterfly , the function we are registering will be used to action it. <2> Effect handler The function which actions the side effect. Later, it will be called with one argument - the value associated with the key in the effects map. So, if an event handler returned these two effects: { :dispatch [ :save-maiden 42 ] :butterfly \"Flapping\" } ;; butterfly effect, but no chaos !! Then the function we registered for :butterfly would be called to handle that effect. And it would be called with the parameter \"Flapping\". So, terminology: :butterfly is an \"effect key\" and the function registered is an \"effect handler\". So re-frame has both event handlers and effect handlers and they are different, despite them both starting with e and ending in t !!","title":"Extensible Side Effects"},{"location":"Effects/#writing-an-effect-handler","text":"A word of advice - make them as simple as possible, and then simplify them further. You don't want them containing any fancy logic. Why? Well, because they are all side-effecty they will be a pain to test rigorously. And the combination of fancy logic and limited testing always ends in tears. If not now, later. A second word of advice - when you create an effect handler, you also have to design (and document!) the structure of the value expected. When you do, realise that you are designing a nano DSL for value and try to make that design simple too. If you resist being terse and smart, and instead, favor slightly verbose and obvious, your future self will thank you. Create as little cognitive overhead as possible for the eventual readers of your effectful code. Right. So, this advice coming from the guy who named effects fx ... Oh, the hypocrisy. In my defence, here's the built-in effect handler for :db : ( reg-fx :db ( fn [ value ] ( reset! re-frame.db/app-db value ))) So, yeah, simple ... and, because of it, I can almost guarantee there's no bug in ... bang, crash, smoke, flames. Note The return value of an effect handler is ignored.","title":"Writing An Effect Handler"},{"location":"Effects/#db-not-always-needed","text":"An effects map does not need to include the effect key :db . It is perfectly valid for an event handler to not change app-db . In fact, it is perfectly valid for an event handler to return an effects map of {} . Slightly puzzling, but not a problem.","title":":db Not Always Needed"},{"location":"Effects/#what-makes-this-work","text":"A silently inserted interceptor. Whenever you register an event handler via either reg-event-db or reg-event-fx , an interceptor, cunningly named do-fx , is inserted at the beginning of the chain. Example: if your event handler registration looked like this: ( reg-event-fx :some-id [ debug ( path :right )] ;; <-- two interceptors, apparently ( fn [ cofx _ ] {}) ;; <-- imagine returned effects here While it might look like you have registered with 2 interceptors, reg-event-fx will make it 3: [ do-fx debug ( path :right )] It silently inserts do-fx at the front, and this is a good thing. The placement of do-fx at the beginning of the interceptor chain means its :after function would be the final act when the chain is executed (forwards and then backwards, as described in the Interceptor Tutorial). In this final act, the :after function extracts :effects from context and simply iterates across the key/value pairs it contains, calling the registered \"effect handlers\" for each. For the record The FISA Court requires that we deny all claims that do-fx is secretly injected NSA surveillance-ware. We also note that you've been sloppy with your personal grooming again, including, but not limited to, forgetting to clean your teeth on one occassion last week. If ever you want to take control of the way effect handling is done, create your own alternative to reg-event-fx and, in it, inject your own version of the do-fx interceptor at the front of the interceptor chain. It is only a few lines of code.","title":"What Makes This Work?"},{"location":"Effects/#order-of-effects","text":"Prior to v1.1.0 , the answer is: no guarantees were provided about ordering. Actual order is an implementation detail upon which you should not rely. From v1.1.0 onwards , two things changed: re-frame guaranteed that the :db effect will always be actioned first, if present. But other than that, no guarantee is given for the other effects. a new effect called :fx was added, and it provides a way for effects to be ordered. In fact, with v1.1.0 best practice changed to event handlers should only return two effects :db and :fx , in which case :db was always done first and then :fx , and within :fx the ordering is sequential. This new approach is more about making it easier to compose event handlers from many smaller functions, but more specificity around ordering was a consequence.","title":"Order Of Effects?"},{"location":"Effects/#effects-with-no-data","text":"Some effects have no associated data: ( reg-event-fx :some-id ( fn [ coeffect _ ] { :exit-fullscreen nil })) ;; <--- no data, use a nil In these cases, although it looks odd, just supply nil as the value for this key. The associated effect handler would look like: ( reg-fx :exit-fullscreen ( fn [ _ ] ;; we don't bother with that nil value ( .exitFullscreen js/document )))","title":"Effects With No Data"},{"location":"Effects/#testing-and-noops","text":"When you are running tests or replaying events, it is sometimes useful to stub out effects. This is easily done - you simply register a noop effect handler. Want to stub out the :dispatch effect? Do this: ( reg-fx :dispatch ( fn [ _ ] )) ;; a noop If your test does alter registered effect handlers, and you are using cljs.test , then you can use a fixture to restore all effect handlers at the end of your test: ( defn fixture-re-frame [] ( let [ restore-re-frame ( atom nil )] { :before # ( reset! restore-re-frame ( re-frame.core/make-restore-fn )) :after # ( @ restore-re-frame )})) ( use-fixtures :each ( fixture-re-frame )) re-frame.core/make-restore-fn creates a checkpoint for re-frame state (including registered handlers) to which you can return.","title":"Testing And Noops"},{"location":"Effects/#existing-effect-handlers","text":"re-frame's built-in effect handlers, like dispatch-n and dispatch-later , are detailed in the API document. And please review the External-Resources document for a list of 3rd party Effect Handlers.","title":"Existing Effect Handlers"},{"location":"Effects/#summary","text":"The 4 Point Summary in note form: Event handlers should only return a description of required effects They return a map like {:effect1 value1 :effect2 value2} Keys of this map can refer to builtin effect handlers (see below) or custom ones We use reg-fx to register our own effect handlers, built-in ones are already registered","title":"Summary"},{"location":"External-Resources/","text":"Alternative Explanations \u00b6 An overview of re-frame by purelyfunctional.tv On naming things and app-db structure by purelyfunctional.tv Reagent \u00b6 To get a good grounding in Reagent, please be sure to review the docs: Reagent site Reagent README For inspiration, perhaps look at one of our other projects: re-com . Video Training \u00b6 Commercial grade video training for re-frame and Reagent: Jacek Schae purelyfunctional.tv Lambda Island Videos Clojure Hacker IDE Support \u00b6 Cursive - has direct support for some re-frame features, including keyword sourcing. Emacs support Templates \u00b6 re-frame-template - To generate a client side SPA. Good for getting started. Luminus - Generates an integrated client and server re-natal - React Native apps Debugging re-frame-10x - A debugging dashboard for re-frame re-frisk - A library for visualizing re-frame data and events. Examples and Applications Using re-frame \u00b6 Heardicon - create your own coat of arms The Workshub client is open source and the repo is available here RealWorld - a well commented codebase with CRUD, auth, advanced patterns, etc) that implements to the RealWorld Spec and API . RealWorld - react native version BlueGenes - searching and analysing genomic data, by the University of Cambridge Memento a private note-taking app. Uses compojure-api, PostgreSQL and token auth. How to create decentralised apps with re-frame and Ethereum - Tutorial with links to code and live example. Braid - A new approach to group chat, designed around conversations and tags instead of rooms. Elfeed-cljsrn - A mobile client for Elfeed rss reader, built with React Native. Memory Hole - A small issue tracking app written with Luminus and re-frame. imperimetric - Webapp for converting texts with some system of measurement to another, such as imperial to metric. boodle - A simple SPA for accounting. It uses, among others, re-frame, http-kit, compojure-api and it runs on PostgreSQL. status-react - A mobile OS for Ethereum. Server, SPA + React Native App Catlantis - React Native App about cats Lymchat - React Native App to learn different cultures ventas - Ecommerce platform made with a full-clojure stack ONS Structural Search - Structural search engine for data cubes Life counter - Simple life counter PWA for 2 players Network Token - A basic SPA for the district0x token contribution smart contract on the Ethereum blockchain MemeFactory - A decentralized platform for creating, issuing, and trading verifiably rare digital collectibles on the Ethereum blockchain Name Bazaar - A peer-to-peer marketplace for exchanging names registered through the Ethereum Name Service LIPAS - A full-stack implementation of Finland's national sports facility geographic information system PuppetAPI - An application to create mock APIs and real-time testing Effect and CoEffect Handlers \u00b6 async-flow-fx - manage a boot process dominated by async http-fx - performing HTTP request tasks (via cljs-ajax) fetch-fx - performing HTTP request tasks (via js/fetch ) re-frame-forward-events-fx - slightly exotic cookie-fx - set and get cookies document-fx - set and get on js/document attributes clipboard-fx - write to the system clipboard re-frame-youtube-fx - YouTube iframe API wrapper re-frame-web3-fx - Ethereum Web3 API re-frame-google-analytics-fx - Google Analytics API re-frame-storage - Local Storage based persistence re-frame-storage-fx - Another take on Local Storage persistence re-frame-firebase - Firebase DB API sse-fx - fx/cofx handlers for EventSource and SSE Forms \u00b6 Fork Form Library. Inspired by formik. re-form free-form re-frame-forms Routing \u00b6 Bidirectional using Silk and Pushy Tools, Techniques & Libraries \u00b6 re-fill - routing and more re-frame-undo - An undo library for re-frame re-frame-test - Advanced testing utilities Animation using react-flip-move re-thread - A library for running re-frame applications in Web Workers. re-frame-datatable - DataTable UI component built for use with re-frame. Stately: State Machines also https://www.youtube.com/watch?v=klqorRUPluw re-learn - Data driven tutorials for educating users of your reagent / re-frame app subgraph - Reactive graph database for re-frame re-graph - GraphQL client for re-frame martian - Swagger-compatible API client that abstracts away from HTTP with re-frame bindings re-pressed - A keyboard event library for re-frame re-pollsive - A polling event library for re-frame breaking-point - Quickly define screen breakpoints for re-frame re-frame-flow - A graph based visualization tool for re-frame event chains Suites \u00b6 reflet - Fast multi-model db, mix graph/non-graph data, graph queries/mutations, hierarchical FSMs, JS/DOM interop utils, component APIs, novel visual debugging React Native re-natal : Bootstrap ClojureScript React Native apps cljsrn-re-frame-workers : A library supporting react-native-workers with re-frame for ClojureScript and React Native. re-navigate : Example of React Native Navigation with re-frame/re-natal Other \u00b6 re-posh is re-frame + Datalog Videos \u00b6 A three part video series A Video Tour of the Source Code of Ninja Tools Funding Circle Clojure Meetup: Modular Users Interfaces with Re-frame Build your next single page app in ClojureScript and re-frame Clojurescript re-frame Tutorial Part 1 - Events and Event Handlers From 0 to prototype using ClojureScript, re-frame and friends: Martin Clausen Re-usable GUI Components with Re-frame and Atomic Design - Mark Nutter clojureD 2018: \"Reframing your next Single Page App\" by Kenneth Kalmer Server Side Rendering \u00b6 isomorphic-rendering Prerenderer - Server pre-rendering library using NodeJS that works with re-frame 0.6.0 (later versions untested) Rationale Part 1 Part 2 Part 3 Release Announcement Server Side Rendering with re-frame - Blog post on rendering re-frame views with Clojure. Rendering Reagent on the Server Using Hiccup - Blog post on rendering Reagent with Clojure. Prerendering a re-frame app with Chrome Headless - Blog post on prerendering a re-frame app using etaoin and Chrome Headless.","title":"Resources"},{"location":"External-Resources/#alternative-explanations","text":"An overview of re-frame by purelyfunctional.tv On naming things and app-db structure by purelyfunctional.tv","title":"Alternative Explanations"},{"location":"External-Resources/#reagent","text":"To get a good grounding in Reagent, please be sure to review the docs: Reagent site Reagent README For inspiration, perhaps look at one of our other projects: re-com .","title":"Reagent"},{"location":"External-Resources/#video-training","text":"Commercial grade video training for re-frame and Reagent: Jacek Schae purelyfunctional.tv Lambda Island Videos Clojure Hacker","title":"Video Training"},{"location":"External-Resources/#ide-support","text":"Cursive - has direct support for some re-frame features, including keyword sourcing. Emacs support","title":"IDE Support"},{"location":"External-Resources/#templates","text":"re-frame-template - To generate a client side SPA. Good for getting started. Luminus - Generates an integrated client and server re-natal - React Native apps","title":"Templates"},{"location":"External-Resources/#examples-and-applications-using-re-frame","text":"Heardicon - create your own coat of arms The Workshub client is open source and the repo is available here RealWorld - a well commented codebase with CRUD, auth, advanced patterns, etc) that implements to the RealWorld Spec and API . RealWorld - react native version BlueGenes - searching and analysing genomic data, by the University of Cambridge Memento a private note-taking app. Uses compojure-api, PostgreSQL and token auth. How to create decentralised apps with re-frame and Ethereum - Tutorial with links to code and live example. Braid - A new approach to group chat, designed around conversations and tags instead of rooms. Elfeed-cljsrn - A mobile client for Elfeed rss reader, built with React Native. Memory Hole - A small issue tracking app written with Luminus and re-frame. imperimetric - Webapp for converting texts with some system of measurement to another, such as imperial to metric. boodle - A simple SPA for accounting. It uses, among others, re-frame, http-kit, compojure-api and it runs on PostgreSQL. status-react - A mobile OS for Ethereum. Server, SPA + React Native App Catlantis - React Native App about cats Lymchat - React Native App to learn different cultures ventas - Ecommerce platform made with a full-clojure stack ONS Structural Search - Structural search engine for data cubes Life counter - Simple life counter PWA for 2 players Network Token - A basic SPA for the district0x token contribution smart contract on the Ethereum blockchain MemeFactory - A decentralized platform for creating, issuing, and trading verifiably rare digital collectibles on the Ethereum blockchain Name Bazaar - A peer-to-peer marketplace for exchanging names registered through the Ethereum Name Service LIPAS - A full-stack implementation of Finland's national sports facility geographic information system PuppetAPI - An application to create mock APIs and real-time testing","title":"Examples and Applications Using re-frame"},{"location":"External-Resources/#effect-and-coeffect-handlers","text":"async-flow-fx - manage a boot process dominated by async http-fx - performing HTTP request tasks (via cljs-ajax) fetch-fx - performing HTTP request tasks (via js/fetch ) re-frame-forward-events-fx - slightly exotic cookie-fx - set and get cookies document-fx - set and get on js/document attributes clipboard-fx - write to the system clipboard re-frame-youtube-fx - YouTube iframe API wrapper re-frame-web3-fx - Ethereum Web3 API re-frame-google-analytics-fx - Google Analytics API re-frame-storage - Local Storage based persistence re-frame-storage-fx - Another take on Local Storage persistence re-frame-firebase - Firebase DB API sse-fx - fx/cofx handlers for EventSource and SSE","title":"Effect and CoEffect Handlers"},{"location":"External-Resources/#forms","text":"Fork Form Library. Inspired by formik. re-form free-form re-frame-forms","title":"Forms"},{"location":"External-Resources/#routing","text":"Bidirectional using Silk and Pushy","title":"Routing"},{"location":"External-Resources/#tools-techniques-libraries","text":"re-fill - routing and more re-frame-undo - An undo library for re-frame re-frame-test - Advanced testing utilities Animation using react-flip-move re-thread - A library for running re-frame applications in Web Workers. re-frame-datatable - DataTable UI component built for use with re-frame. Stately: State Machines also https://www.youtube.com/watch?v=klqorRUPluw re-learn - Data driven tutorials for educating users of your reagent / re-frame app subgraph - Reactive graph database for re-frame re-graph - GraphQL client for re-frame martian - Swagger-compatible API client that abstracts away from HTTP with re-frame bindings re-pressed - A keyboard event library for re-frame re-pollsive - A polling event library for re-frame breaking-point - Quickly define screen breakpoints for re-frame re-frame-flow - A graph based visualization tool for re-frame event chains","title":"Tools, Techniques & Libraries"},{"location":"External-Resources/#suites","text":"reflet - Fast multi-model db, mix graph/non-graph data, graph queries/mutations, hierarchical FSMs, JS/DOM interop utils, component APIs, novel visual debugging","title":"Suites"},{"location":"External-Resources/#other","text":"re-posh is re-frame + Datalog","title":"Other"},{"location":"External-Resources/#videos","text":"A three part video series A Video Tour of the Source Code of Ninja Tools Funding Circle Clojure Meetup: Modular Users Interfaces with Re-frame Build your next single page app in ClojureScript and re-frame Clojurescript re-frame Tutorial Part 1 - Events and Event Handlers From 0 to prototype using ClojureScript, re-frame and friends: Martin Clausen Re-usable GUI Components with Re-frame and Atomic Design - Mark Nutter clojureD 2018: \"Reframing your next Single Page App\" by Kenneth Kalmer","title":"Videos"},{"location":"External-Resources/#server-side-rendering","text":"isomorphic-rendering Prerenderer - Server pre-rendering library using NodeJS that works with re-frame 0.6.0 (later versions untested) Rationale Part 1 Part 2 Part 3 Release Announcement Server Side Rendering with re-frame - Blog post on rendering re-frame views with Clojure. Rendering Reagent on the Server Using Hiccup - Blog post on rendering Reagent with Clojure. Prerendering a re-frame app with Chrome Headless - Blog post on prerendering a re-frame app using etaoin and Chrome Headless.","title":"Server Side Rendering"},{"location":"Flows/","text":"This is an experimental, proposed feature for re-frame. We'd love to hear your feedback! Please join our discussions on github and slack . This tutorial introduces Flows , part of Domino 3 (effects). Not to be confused with... re-frame-async-flow-fx . A re-frame/flow is totally sychronous, running on every event. The on-changes interceptor . Flows are an evolution of this idea. domino . Another take on dataflow programming, inspired by re-frame. What are flows? \u00b6 A flow describes how to derive a value from other values. When one part of your app state changes, another part changes in response. More concretely, when the values change at one or more paths within app-db , then the value at another path is \"automatically\" recalculated. Why do we need flows? \u00b6 We turn to flows when we need a dynamic relationship between values - a \"difference which makes a difference\" . For instance, how would you model this problem? a length and a width make an area changing either value changes the area deleting either value deletes the area a bad value invalidates the area leaving the page deletes the area In re-frame, data coordinates functions . Here, we need multiple data sources ( length , width ) to coordinate a single function ( area ). A subscription could do this, but with caveats . We think flows offer a Better Way , both simpler and more practical. The DataFlow Paradigm Dataflow programming emerged in the 1970s, so it is almost as foundational as functional programming. Indeed, reactive programming - so much the rage these days - is simply a subset of dataflow programming. In contrast with imperative building blocks like if/then , next and goto , dataflow programming implements control flow via the propagation of change. Both the functional and dataflow paradigms have profoundly influenced the design of re-frame. Hence, re-frame's tagline: \"derived data, flowing\". A Basic Flow \u00b6 Here's a basic flow . It describes how to derive the area of a room from its dimensions: {:id :room-area :inputs {:w [:room :width] :h [:room :length]} :output (fn calc-area [{:keys [w h] :as inputs}] (* w h)) :path [:room :area]} :id - uniquely identifies this flow. :inputs - a map of app-db paths to observe for change. :output - calculates the new derived value. Takes a map of resolved inputs. Simply takes app-db if there are no inputs. :path - denotes where the derived value should be stored. On every event, when the values at :inputs change, :output is run, and the result is stored in app-db at :path . A Basic Example \u00b6 To show Flows in action, let's do some live coding. First, we add the necessary requires ( reg-flow is still in the alpha namespace): (ns re-frame.example.flows (:require [re-frame.alpha :as rf] [reagent.dom.client :as rdc])) And, here's the code for our app: the user can enter height and width values and, in response, they see area : (rf/reg-sub :width (fn [db [_ room]] (get-in db [room :width]))) (rf/reg-sub :length (fn [db [_ room]] (get-in db [room :length]))) (rf/reg-event-db :inc-w (fn [db [_ room]] (update-in db [room :width] inc))) (rf/reg-event-db :inc-h (fn [db [_ room]] (update-in db [room :length] inc))) (rf/reg-event-db :init (fn [db [_ room]] (-> db (update :kitchen merge {:width 10 :length 15}) (update :garage merge {:width 20 :length 20})))) (def clickable {:cursor \"pointer\" :border \"2px solid grey\" :user-select \"none\"}) (defn room-form [room] [:form [:h4 room \" calculator\"] \"width:\" @(rf/subscribe [:width room]) [:span {:style clickable :on-click #(rf/dispatch [:inc-w room])} \"+\"] [:br] \"length:\" @(rf/subscribe [:length room]) [:span {:style clickable :on-click #(rf/dispatch [:inc-h room])} \"+\"]]) Registering a flow \u00b6 Now the interesting part, we use reg-flow : (rf/reg-flow {:id :garage-area :inputs {:w [:garage :width] :h [:garage :length]} :output (fn [{:keys [w h]}] (* w h)) :path [:garage :area]}) Arity-2 version In addition to (reg-flow flow) , you can also call (reg-flow id flow) . This gives it a signature just like the usual reg-event- and reg-sub calls. Our example would look like (reg-flow :garage-area {...}) . We write a subscription for the flow's output :path : (rf/reg-sub :area (fn [db [_ room]] (get-in db [room :area]))) And, we use this subscription in a view: (defn app-container [& children] (into [:div {:style {:padding \"1rem\" :border \"2px solid grey\"}}] children)) (defn room-calculator [room] [:div [room-form room] \" Area:\" @(rf/subscribe [:area room])]) ;; < --- subscribing (rf/dispatch-sync [:init]) (defonce garage-calculator-root (rdc/create-root (js/document.getElementById \"garage-calculator\"))) (rdc/render garage-calculator-root [app-container [room-calculator :garage]]) Our dataflow model Dataflow is often conceptualized as a graph. Data flows through edges, and transforms through nodes. Here's how our DSL articulates the traditional dataflow model: flow - a map, serving as a node specification :id - uniquely identifies a node :inputs - a set of edges from other nodes reg-flow - creates a running node from a specification Crucially, the name flow isn't exactly short for \"dataflow\". A flow is a static value, specifying one segment of a dataflow graph. Dataflow is a dynamic phenomenon, not a value. Both the data and the graph itself change over time. Changing the graph is a matter of registering and clearing flows. How does it work? \u00b6 event handlers yield effects . Typically, they yield a :db effect, causing a new value of app-db . But first, re-frame updates your :db effect by running each registered flow . Caution: implicit behavior ahead Here, the tradeoff becomes clear. A flow can change app-db implicitly. This means the :db effect which you express in your event handlers may not match the actual app-db you'll get as a result. Re-frame achieves this using an interceptor . Here's what it does: Destructure the current app-db , resolving the paths in :inputs this yields a value like {:w 10 :h 15} . Destructure the previous app-db as well, to see if any of these values have changed. For instance, if it sees {:w 11 :h 24} , that means the inputs have changed. {:w 10 :h 15} would mean no change. If the inputs have changed: Call the :output function, passing it the previous result, and the current :inputs . Store the newly derived value (in this case, 150 ) in app-db , at the :path . Isn't that remarkable? What, you say it's unremarkable? Well, that's even better. Remarks \u00b6 Reality check. Here's why this basic flow might not excite you: Can't I just use events? \u00b6 Re-frame can already set values. Events were the one true way to update app-db . Why invent another mechanism for this? In this sense, they are redundant. Rather than use a flow, you could simply call a derive-area within each relevant event: (defn derive-area [{:keys [width length] :as room}] (assoc room :area (* width length))) (rf/reg-event-db :width (fn [db [_ w]] (-> db (assoc-in [:garage :width] w) (update :garage derive-area)))) This works just fine... or does it ? Actually, we forgot to change the :length event. Our area calculation will be wrong every time the user changes the length! Easy to fix, but the point is that we had to fix it at all. How many events will we need to review? In a mature app, this is not a trivial question. Design is all tradeoffs . Flows allow us to say \"This value simply derives from these inputs. It simply changes when they do.\" We do this at the expense of some \"spooky action at a distance\" - in other words, we accept that no particular event will be responsible for that change. Are flows just reactions? \u00b6 You might notice a similarity with reagent.core/reaction . Both yield an \"automatically\" changing value. Reagent controls when a reaction updates, presumably during the evaluation of a component function. Flows, on the other hand, are controlled by re-frame, running every time an event occurs. When a component derefs a reaction, that component knows to re-render when the value changes. You can't deref a flow directly. It doesn't emit a value directly to any caller. Instead, it emits a new version of app-db . The rest of your app reacts to app-db , not your flow. But really, why do I need flows? \u00b6 Some apps do complex tasks, with deep layers of branching and looping. But most apps do simple things, as well. Many such tasks amount to synchronization - maintaining an invariant within a changing data structure. And of course, a task which seems complex may just be a chain of simple tasks. One relatable example is that of trying to maintain cascading error states. Imagine your UI has a validation rule: start date must be before end date . After the user changes either value, the error state must be calculated. The result indicates whether to enable the submit button or display an error message. Now, imagine your UI has many validation rules, each with its own error state. In this case, the submit button state is a secondary calculation which combines these error states. Cascading, derived values. Data flows from the leaves (what the user entered), through intermediate nodes (error predicate functions), through to the root (submit button state). Both the intermediate values and the root value are important. Is this a rules engine? \u00b6 You might be tempted to view Flows as having something to do with a rules engine, but it absolutely isn't that. It is simply a method for implementing dataflow. Each value is derivative of other values, with multiple levels of that process arranged in a tree structure in which many leaf values contribute to a terminal root value (think submit button state!). Can't I just use subscriptions? \u00b6 You could derive your garage's area with a layer-3 subscription : (rf/reg-sub ::garage-area-sub (fn [_] [(subscribe [:width]) (subscribe [:length])]) (fn [[w h] _] (* w h))) Just like a flow , this subscription's value changes whenever the inputs change, and (obviously) you call subscribe to access that value. A flow stores its :output value in app-db , while subscriptions don't. We designed re-frame on the premise that app-db holds your entire app-state. Arguably, derived values belong there too. We feel there's an inherent reasonability to storing everything in one place. It's also more practical (see Reactive Context . Just like with layered subscriptions, one flow can use the value of another. Remember the :inputs to our first flow? {:inputs {:w [:garage :width] :h [:garage :length]}} Subscribing to flows \u00b6 In our examples so far, we've used a regular subscription, getting our flow's output path. In re-frame.alpha , you can also subscribe to a flow by name. This bypasses the caching behavior of a standard subscription. Here's how you can subscribe to our garage-area flow. The stable way, with a query vector: (re-frame.alpha/subscribe [:flow {:id :garage-area}])` And the experimental way, with a query map: (re-frame.alpha/sub :flow {:id :garage-area}) Layering flows \u00b6 As you can see, vectors stand for paths in app-db . The flow<- function, however, gives us access to other flows . Here's a flow using two other flows as inputs: ::kitchen-area and ::living-room-area . When either input changes value, our flow calls the :output function to recalculate its own value: {:id :main-room-ratio :inputs {:kitchen (rf/flow < - ::kitchen-area) :living-room (rf/flow < - ::living-room-area)} :output (fn [{:keys [kitchen living-room]}] (/ kitchen living-room)) :path [:ratios :main-rooms]} As before, once :output runs, the resulting value is stored at :path . So, the new value of app-db will contain a number at the path [:ratios :main-rooms] For subscriptions, caching can be an issue (see caching ). With flows, the process is simpler. app-db is the cache, since flows always store their output value within it. You, the programmer, define explicitly when to recalculate the output, and when to store the output. To this end, flows provide optional keys: :live? and :cleanup . Let's read on, and discover how these keys work together to fully define the lifecycle and caching behavior of a flow: Living and Dying \u00b6 Between death... and arising... is found an existence\u2014 a \"body\"... that goes to the place of rebirth. This existence between two realms... is called intermediate existence. -- Vasubandhu, on bardos In practice, some flows are too expensive to run all the time. It can still be hard to predict when a flow will run, leading to defensive programming. Sometimes we'd like to simply turn our flow off, so we can stop thinking about it. For this, we use a :live? function. The quote above deals with phenomenal life, but you can also think of :live? as in a tv or internet broadcast. Data flows, but only when the flow itself is live. Let's try it out. For example, here's a barebones tab picker, and something to show us the value of app-db : (def tabs [:kitchen :garage]) (def clickable-tab (into clickable {:padding \"0.5rem\"})) (def active-tab (into clickable-tab {:color \"green\"})) (rf/reg-sub :current-tab :-> :tab) (rf/reg-event-db :change-tab (fn [db [_ tab]] (assoc db :tab tab))) (defn tab [id current?] (let [current-tab (rf/sub :current-tab)] [:span {:style (if (= id @current-tab) active-tab clickable-tab) :on-click #(rf/dispatch [:change-tab id])} (name id)])) (defn tab-picker [] (into [:div] (for [id tabs] [tab id]))) (defn tabbed-app [] (let [current-tab (rf/sub :current-tab)] [:div [tab-picker @current-tab] (case @current-tab :kitchen [room-calculator :kitchen] :garage [room-calculator :garage] nil)])) Live? \u00b6 Here's a more advanced version of our room calculator flow. (rf/reg-flow {:id :kitchen-area :inputs {:w [:kitchen :width] :h [:kitchen :length]} :output (fn [{:keys [w h]}] (* w h)) :path [:kitchen :area] :live-inputs {:tab [:tab]} :live? (fn [{:keys [tab]}] (= tab :kitchen))}) Notice the new :live-inputs and :live? keys. Just like :output , :live:? is a function of the resolved :live-inputs . Re-frame only calculates the :output when the :live? function returns a truthy value. Otherwise, the flow is presumed dead. Let's test it out: (defn debug-app-db [] [:pre {:style {:font-size 12 :margin \"1rem\" :white-space \"pre-wrap\"}} (str @re-frame.db/app-db)]) (rf/dispatch-sync [:init]) (defonce tabbed-app-root (rdc/create-root (js/document.getElementById \"tabbed-app\"))) (rdc/render tabbed-app-root [app-container [debug-app-db] [tabbed-app]]) Try switching tabs. Notice how the path [:kitchen :area] only exists when you're in the room-calculator tab. What's happening here? Lifecycle \u00b6 After handling an event, re-frame runs your flows. First, it evaluates :live? , using the new app-db . Depending on the return value of :live? , re-frame handles one of 4 possible state transitions: transition action From live to live run :output (when :inputs have changed) From dead to live run :output From live to dead run :cleanup From dead to dead do nothing Basically, arising flows get output, living flows get output as needed, and dying flows get cleaned up. Cleanup \u00b6 A :cleanup function takes app-db and the :path , and returns a new app-db . Try adding this :cleanup key into the :kitchen-area flow above (be sure to eval the code block again). :cleanup (fn [db path] (assoc-in db path :unknown!)) By default, :cleanup dissociates the path from app-db . By declaring this :cleanup key in your flow, you override that default function. Now, instead of removing :area , you set it to :unknown! . Now, is this a good idea? After all, we might consider the area known, as long as we know the width and length. Maybe we should do no cleanup, and keep the value, even when :live? returns false. In that case, our :cleanup function would simply be: :cleanup (fn [db _] db) . The point is, you express when the signal lives or dies, not your render tree. Redefining and Undefining \u00b6 Not only do flows have a lifecycle (defined by :live? and :cleanup ), but this lifecycle also includes registration and deregistration. When you call reg-flow , that flow comes alive. :output runs, even if the inputs haven't changed. That's because the flow itself has changed. When you call clear-flow , it dies (running :cleanup ). Re-frame provides :reg-flow and :clear-flow effects for this purpose. Here's another demonstration. Think of it as a stripped-down todomvc. You can add and remove items in a list: (rf/reg-sub :items :-> (comp reverse :items)) (rf/reg-event-db ::add-item (fn [db [_ id]] (update db :items conj id))) (rf/reg-event-db ::delete-item (fn [db [_ id]] (update db :items #(remove #{id} %)))) (defn item [id] [:div \"Item\" id]) (defn items [] (into [:div] (map item) @(rf/subscribe [:items]))) (defn controls [] (let [id (or (apply max @(rf/subscribe [:items])) 0)] [:div [:span {:style clickable :on-click #(rf/dispatch [::add-item (inc id)])} \"Add\"] \" \" [:span {:style clickable :on-click #(rf/dispatch [::delete-item id])} \"Delete\"] \" \"])) (defonce item-counter-basic-root (rdc/create-root (js/document.getElementById \"item-counter-basic\"))) (rdc/render item-counter-basic-root [app-container [controls] [items]]) Now, imagine your business adds some requirements: At least 1 item per person. No more than 3 items per person. First things first, we express these requirements as data: (def base-requirements {:min-items 0 :max-items 3}) Then, we'll use a flow to evaluate which requirements are met. State, not events These requirements aren't about what happens , only what things are . It's your app state that matters, not any particular event or view. Our flow doesn't care how it happened that a requirement was met, nor what to do next. For reasons that will become clear, let's write a factory function for this flow. It builds a flow that validates our item list against the requirements: (defn error-state-flow [{:keys [min-items max-items] :as requirements}] {:id :error-state :path [:error-state] :inputs {:items [:items]} :output (fn [{:keys [items]}] (let [ct (count items)] (cond (> ct max-items) :too-many ( < = ct min-items) :not-enough :else :ok)))}) And register a flow that fits our base requirements: (rf/reg-flow (error-state-flow base-requirements)) Now this flow is calculating an error-state value, and adding it to app-db after every event. This happens as long as the :items have changed... right? Actually, there's another way to make a flow recalculate - we can re-register it. Let's update the app to display our new error state: (defn warning [] (let [error-state (rf/sub :flow {:id :error-state})] [:div {:style {:color \"red\"}} (->> @error-state (get {:too-many \"Too many items. Please remove one.\" :not-enough \"Not enough items. Please add one.\" :ok [:br]}))])) (rf/dispatch-sync [:init]) (defonce item-counter-error-root (rdc/create-root (js/document.getElementById \"item-counter-error\"))) (rdc/render item-counter-error-root [app-container [debug-app-db] [controls] [warning] [items]]) Your app is working fine, until your next design meeting. Now they want a way to change the max item limit. A little contrived, I know. But not uncommon from a programming perspective. Luckily, our flow factory can make a new flow for any requirement. Therefore, putting in this feature is just a matter of triggering the :reg-flow effect. We build a basic form to change the requirement: (defn requirement-picker [] [: < > \"Max items: \" [:input {:style {:background \"lightgrey\"} :type \"number\" :on-change #(rf/dispatch [:change-requirements {:max-items (-> % .-target .-value)}])}]]) And a corresponding event, which triggers our :reg-flow effect: (rf/reg-event-fx :change-requirements (fn [_ [_ new-requirements]] {:fx [[:reg-flow (error-state-flow (merge base-requirements new-requirements))]]})) What happens after :reg-flow runs? Are there now two flows? Actually, no. If you register a new flow with the same :id , it replaces the old one. When we trigger [:reg-flow (error-state-flow ...)] : The old :error-state flow runs :cleanup The new :error-state flow runs :output Not only does changing the inputs lead to new output, but so does changing the flow itself. Let's test it out: (rf/dispatch-sync [:init]) (defonce item-counter-requirements-root (rdc/create-root (js/document.getElementById \"item-counter-requirements\"))) (rdc/render item-counter-requirements-root [app-container [debug-app-db] [controls] [requirement-picker] [warning] [items]])","title":"Flows"},{"location":"Flows/#what-are-flows","text":"A flow describes how to derive a value from other values. When one part of your app state changes, another part changes in response. More concretely, when the values change at one or more paths within app-db , then the value at another path is \"automatically\" recalculated.","title":"What are flows?"},{"location":"Flows/#why-do-we-need-flows","text":"We turn to flows when we need a dynamic relationship between values - a \"difference which makes a difference\" . For instance, how would you model this problem? a length and a width make an area changing either value changes the area deleting either value deletes the area a bad value invalidates the area leaving the page deletes the area In re-frame, data coordinates functions . Here, we need multiple data sources ( length , width ) to coordinate a single function ( area ). A subscription could do this, but with caveats . We think flows offer a Better Way , both simpler and more practical. The DataFlow Paradigm Dataflow programming emerged in the 1970s, so it is almost as foundational as functional programming. Indeed, reactive programming - so much the rage these days - is simply a subset of dataflow programming. In contrast with imperative building blocks like if/then , next and goto , dataflow programming implements control flow via the propagation of change. Both the functional and dataflow paradigms have profoundly influenced the design of re-frame. Hence, re-frame's tagline: \"derived data, flowing\".","title":"Why do we need flows?"},{"location":"Flows/#a-basic-flow","text":"Here's a basic flow . It describes how to derive the area of a room from its dimensions: {:id :room-area :inputs {:w [:room :width] :h [:room :length]} :output (fn calc-area [{:keys [w h] :as inputs}] (* w h)) :path [:room :area]} :id - uniquely identifies this flow. :inputs - a map of app-db paths to observe for change. :output - calculates the new derived value. Takes a map of resolved inputs. Simply takes app-db if there are no inputs. :path - denotes where the derived value should be stored. On every event, when the values at :inputs change, :output is run, and the result is stored in app-db at :path .","title":"A Basic Flow"},{"location":"Flows/#a-basic-example","text":"To show Flows in action, let's do some live coding. First, we add the necessary requires ( reg-flow is still in the alpha namespace): (ns re-frame.example.flows (:require [re-frame.alpha :as rf] [reagent.dom.client :as rdc])) And, here's the code for our app: the user can enter height and width values and, in response, they see area : (rf/reg-sub :width (fn [db [_ room]] (get-in db [room :width]))) (rf/reg-sub :length (fn [db [_ room]] (get-in db [room :length]))) (rf/reg-event-db :inc-w (fn [db [_ room]] (update-in db [room :width] inc))) (rf/reg-event-db :inc-h (fn [db [_ room]] (update-in db [room :length] inc))) (rf/reg-event-db :init (fn [db [_ room]] (-> db (update :kitchen merge {:width 10 :length 15}) (update :garage merge {:width 20 :length 20})))) (def clickable {:cursor \"pointer\" :border \"2px solid grey\" :user-select \"none\"}) (defn room-form [room] [:form [:h4 room \" calculator\"] \"width:\" @(rf/subscribe [:width room]) [:span {:style clickable :on-click #(rf/dispatch [:inc-w room])} \"+\"] [:br] \"length:\" @(rf/subscribe [:length room]) [:span {:style clickable :on-click #(rf/dispatch [:inc-h room])} \"+\"]])","title":"A Basic Example"},{"location":"Flows/#registering-a-flow","text":"Now the interesting part, we use reg-flow : (rf/reg-flow {:id :garage-area :inputs {:w [:garage :width] :h [:garage :length]} :output (fn [{:keys [w h]}] (* w h)) :path [:garage :area]}) Arity-2 version In addition to (reg-flow flow) , you can also call (reg-flow id flow) . This gives it a signature just like the usual reg-event- and reg-sub calls. Our example would look like (reg-flow :garage-area {...}) . We write a subscription for the flow's output :path : (rf/reg-sub :area (fn [db [_ room]] (get-in db [room :area]))) And, we use this subscription in a view: (defn app-container [& children] (into [:div {:style {:padding \"1rem\" :border \"2px solid grey\"}}] children)) (defn room-calculator [room] [:div [room-form room] \" Area:\" @(rf/subscribe [:area room])]) ;; < --- subscribing (rf/dispatch-sync [:init]) (defonce garage-calculator-root (rdc/create-root (js/document.getElementById \"garage-calculator\"))) (rdc/render garage-calculator-root [app-container [room-calculator :garage]]) Our dataflow model Dataflow is often conceptualized as a graph. Data flows through edges, and transforms through nodes. Here's how our DSL articulates the traditional dataflow model: flow - a map, serving as a node specification :id - uniquely identifies a node :inputs - a set of edges from other nodes reg-flow - creates a running node from a specification Crucially, the name flow isn't exactly short for \"dataflow\". A flow is a static value, specifying one segment of a dataflow graph. Dataflow is a dynamic phenomenon, not a value. Both the data and the graph itself change over time. Changing the graph is a matter of registering and clearing flows.","title":"Registering a flow"},{"location":"Flows/#how-does-it-work","text":"event handlers yield effects . Typically, they yield a :db effect, causing a new value of app-db . But first, re-frame updates your :db effect by running each registered flow . Caution: implicit behavior ahead Here, the tradeoff becomes clear. A flow can change app-db implicitly. This means the :db effect which you express in your event handlers may not match the actual app-db you'll get as a result. Re-frame achieves this using an interceptor . Here's what it does: Destructure the current app-db , resolving the paths in :inputs this yields a value like {:w 10 :h 15} . Destructure the previous app-db as well, to see if any of these values have changed. For instance, if it sees {:w 11 :h 24} , that means the inputs have changed. {:w 10 :h 15} would mean no change. If the inputs have changed: Call the :output function, passing it the previous result, and the current :inputs . Store the newly derived value (in this case, 150 ) in app-db , at the :path . Isn't that remarkable? What, you say it's unremarkable? Well, that's even better.","title":"How does it work?"},{"location":"Flows/#remarks","text":"Reality check. Here's why this basic flow might not excite you:","title":"Remarks"},{"location":"Flows/#cant-i-just-use-events","text":"Re-frame can already set values. Events were the one true way to update app-db . Why invent another mechanism for this? In this sense, they are redundant. Rather than use a flow, you could simply call a derive-area within each relevant event: (defn derive-area [{:keys [width length] :as room}] (assoc room :area (* width length))) (rf/reg-event-db :width (fn [db [_ w]] (-> db (assoc-in [:garage :width] w) (update :garage derive-area)))) This works just fine... or does it ? Actually, we forgot to change the :length event. Our area calculation will be wrong every time the user changes the length! Easy to fix, but the point is that we had to fix it at all. How many events will we need to review? In a mature app, this is not a trivial question. Design is all tradeoffs . Flows allow us to say \"This value simply derives from these inputs. It simply changes when they do.\" We do this at the expense of some \"spooky action at a distance\" - in other words, we accept that no particular event will be responsible for that change.","title":"Can't I just use events?"},{"location":"Flows/#are-flows-just-reactions","text":"You might notice a similarity with reagent.core/reaction . Both yield an \"automatically\" changing value. Reagent controls when a reaction updates, presumably during the evaluation of a component function. Flows, on the other hand, are controlled by re-frame, running every time an event occurs. When a component derefs a reaction, that component knows to re-render when the value changes. You can't deref a flow directly. It doesn't emit a value directly to any caller. Instead, it emits a new version of app-db . The rest of your app reacts to app-db , not your flow.","title":"Are flows just reactions?"},{"location":"Flows/#but-really-why-do-i-need-flows","text":"Some apps do complex tasks, with deep layers of branching and looping. But most apps do simple things, as well. Many such tasks amount to synchronization - maintaining an invariant within a changing data structure. And of course, a task which seems complex may just be a chain of simple tasks. One relatable example is that of trying to maintain cascading error states. Imagine your UI has a validation rule: start date must be before end date . After the user changes either value, the error state must be calculated. The result indicates whether to enable the submit button or display an error message. Now, imagine your UI has many validation rules, each with its own error state. In this case, the submit button state is a secondary calculation which combines these error states. Cascading, derived values. Data flows from the leaves (what the user entered), through intermediate nodes (error predicate functions), through to the root (submit button state). Both the intermediate values and the root value are important.","title":"But really, why do I need flows?"},{"location":"Flows/#is-this-a-rules-engine","text":"You might be tempted to view Flows as having something to do with a rules engine, but it absolutely isn't that. It is simply a method for implementing dataflow. Each value is derivative of other values, with multiple levels of that process arranged in a tree structure in which many leaf values contribute to a terminal root value (think submit button state!).","title":"Is this a rules engine?"},{"location":"Flows/#cant-i-just-use-subscriptions","text":"You could derive your garage's area with a layer-3 subscription : (rf/reg-sub ::garage-area-sub (fn [_] [(subscribe [:width]) (subscribe [:length])]) (fn [[w h] _] (* w h))) Just like a flow , this subscription's value changes whenever the inputs change, and (obviously) you call subscribe to access that value. A flow stores its :output value in app-db , while subscriptions don't. We designed re-frame on the premise that app-db holds your entire app-state. Arguably, derived values belong there too. We feel there's an inherent reasonability to storing everything in one place. It's also more practical (see Reactive Context . Just like with layered subscriptions, one flow can use the value of another. Remember the :inputs to our first flow? {:inputs {:w [:garage :width] :h [:garage :length]}}","title":"Can't I just use subscriptions?"},{"location":"Flows/#subscribing-to-flows","text":"In our examples so far, we've used a regular subscription, getting our flow's output path. In re-frame.alpha , you can also subscribe to a flow by name. This bypasses the caching behavior of a standard subscription. Here's how you can subscribe to our garage-area flow. The stable way, with a query vector: (re-frame.alpha/subscribe [:flow {:id :garage-area}])` And the experimental way, with a query map: (re-frame.alpha/sub :flow {:id :garage-area})","title":"Subscribing to flows"},{"location":"Flows/#layering-flows","text":"As you can see, vectors stand for paths in app-db . The flow<- function, however, gives us access to other flows . Here's a flow using two other flows as inputs: ::kitchen-area and ::living-room-area . When either input changes value, our flow calls the :output function to recalculate its own value: {:id :main-room-ratio :inputs {:kitchen (rf/flow < - ::kitchen-area) :living-room (rf/flow < - ::living-room-area)} :output (fn [{:keys [kitchen living-room]}] (/ kitchen living-room)) :path [:ratios :main-rooms]} As before, once :output runs, the resulting value is stored at :path . So, the new value of app-db will contain a number at the path [:ratios :main-rooms] For subscriptions, caching can be an issue (see caching ). With flows, the process is simpler. app-db is the cache, since flows always store their output value within it. You, the programmer, define explicitly when to recalculate the output, and when to store the output. To this end, flows provide optional keys: :live? and :cleanup . Let's read on, and discover how these keys work together to fully define the lifecycle and caching behavior of a flow:","title":"Layering flows"},{"location":"Flows/#living-and-dying","text":"Between death... and arising... is found an existence\u2014 a \"body\"... that goes to the place of rebirth. This existence between two realms... is called intermediate existence. -- Vasubandhu, on bardos In practice, some flows are too expensive to run all the time. It can still be hard to predict when a flow will run, leading to defensive programming. Sometimes we'd like to simply turn our flow off, so we can stop thinking about it. For this, we use a :live? function. The quote above deals with phenomenal life, but you can also think of :live? as in a tv or internet broadcast. Data flows, but only when the flow itself is live. Let's try it out. For example, here's a barebones tab picker, and something to show us the value of app-db : (def tabs [:kitchen :garage]) (def clickable-tab (into clickable {:padding \"0.5rem\"})) (def active-tab (into clickable-tab {:color \"green\"})) (rf/reg-sub :current-tab :-> :tab) (rf/reg-event-db :change-tab (fn [db [_ tab]] (assoc db :tab tab))) (defn tab [id current?] (let [current-tab (rf/sub :current-tab)] [:span {:style (if (= id @current-tab) active-tab clickable-tab) :on-click #(rf/dispatch [:change-tab id])} (name id)])) (defn tab-picker [] (into [:div] (for [id tabs] [tab id]))) (defn tabbed-app [] (let [current-tab (rf/sub :current-tab)] [:div [tab-picker @current-tab] (case @current-tab :kitchen [room-calculator :kitchen] :garage [room-calculator :garage] nil)]))","title":"Living and Dying"},{"location":"Flows/#live","text":"Here's a more advanced version of our room calculator flow. (rf/reg-flow {:id :kitchen-area :inputs {:w [:kitchen :width] :h [:kitchen :length]} :output (fn [{:keys [w h]}] (* w h)) :path [:kitchen :area] :live-inputs {:tab [:tab]} :live? (fn [{:keys [tab]}] (= tab :kitchen))}) Notice the new :live-inputs and :live? keys. Just like :output , :live:? is a function of the resolved :live-inputs . Re-frame only calculates the :output when the :live? function returns a truthy value. Otherwise, the flow is presumed dead. Let's test it out: (defn debug-app-db [] [:pre {:style {:font-size 12 :margin \"1rem\" :white-space \"pre-wrap\"}} (str @re-frame.db/app-db)]) (rf/dispatch-sync [:init]) (defonce tabbed-app-root (rdc/create-root (js/document.getElementById \"tabbed-app\"))) (rdc/render tabbed-app-root [app-container [debug-app-db] [tabbed-app]]) Try switching tabs. Notice how the path [:kitchen :area] only exists when you're in the room-calculator tab. What's happening here?","title":"Live?"},{"location":"Flows/#lifecycle","text":"After handling an event, re-frame runs your flows. First, it evaluates :live? , using the new app-db . Depending on the return value of :live? , re-frame handles one of 4 possible state transitions: transition action From live to live run :output (when :inputs have changed) From dead to live run :output From live to dead run :cleanup From dead to dead do nothing Basically, arising flows get output, living flows get output as needed, and dying flows get cleaned up.","title":"Lifecycle"},{"location":"Flows/#cleanup","text":"A :cleanup function takes app-db and the :path , and returns a new app-db . Try adding this :cleanup key into the :kitchen-area flow above (be sure to eval the code block again). :cleanup (fn [db path] (assoc-in db path :unknown!)) By default, :cleanup dissociates the path from app-db . By declaring this :cleanup key in your flow, you override that default function. Now, instead of removing :area , you set it to :unknown! . Now, is this a good idea? After all, we might consider the area known, as long as we know the width and length. Maybe we should do no cleanup, and keep the value, even when :live? returns false. In that case, our :cleanup function would simply be: :cleanup (fn [db _] db) . The point is, you express when the signal lives or dies, not your render tree.","title":"Cleanup"},{"location":"Flows/#redefining-and-undefining","text":"Not only do flows have a lifecycle (defined by :live? and :cleanup ), but this lifecycle also includes registration and deregistration. When you call reg-flow , that flow comes alive. :output runs, even if the inputs haven't changed. That's because the flow itself has changed. When you call clear-flow , it dies (running :cleanup ). Re-frame provides :reg-flow and :clear-flow effects for this purpose. Here's another demonstration. Think of it as a stripped-down todomvc. You can add and remove items in a list: (rf/reg-sub :items :-> (comp reverse :items)) (rf/reg-event-db ::add-item (fn [db [_ id]] (update db :items conj id))) (rf/reg-event-db ::delete-item (fn [db [_ id]] (update db :items #(remove #{id} %)))) (defn item [id] [:div \"Item\" id]) (defn items [] (into [:div] (map item) @(rf/subscribe [:items]))) (defn controls [] (let [id (or (apply max @(rf/subscribe [:items])) 0)] [:div [:span {:style clickable :on-click #(rf/dispatch [::add-item (inc id)])} \"Add\"] \" \" [:span {:style clickable :on-click #(rf/dispatch [::delete-item id])} \"Delete\"] \" \"])) (defonce item-counter-basic-root (rdc/create-root (js/document.getElementById \"item-counter-basic\"))) (rdc/render item-counter-basic-root [app-container [controls] [items]]) Now, imagine your business adds some requirements: At least 1 item per person. No more than 3 items per person. First things first, we express these requirements as data: (def base-requirements {:min-items 0 :max-items 3}) Then, we'll use a flow to evaluate which requirements are met. State, not events These requirements aren't about what happens , only what things are . It's your app state that matters, not any particular event or view. Our flow doesn't care how it happened that a requirement was met, nor what to do next. For reasons that will become clear, let's write a factory function for this flow. It builds a flow that validates our item list against the requirements: (defn error-state-flow [{:keys [min-items max-items] :as requirements}] {:id :error-state :path [:error-state] :inputs {:items [:items]} :output (fn [{:keys [items]}] (let [ct (count items)] (cond (> ct max-items) :too-many ( < = ct min-items) :not-enough :else :ok)))}) And register a flow that fits our base requirements: (rf/reg-flow (error-state-flow base-requirements)) Now this flow is calculating an error-state value, and adding it to app-db after every event. This happens as long as the :items have changed... right? Actually, there's another way to make a flow recalculate - we can re-register it. Let's update the app to display our new error state: (defn warning [] (let [error-state (rf/sub :flow {:id :error-state})] [:div {:style {:color \"red\"}} (->> @error-state (get {:too-many \"Too many items. Please remove one.\" :not-enough \"Not enough items. Please add one.\" :ok [:br]}))])) (rf/dispatch-sync [:init]) (defonce item-counter-error-root (rdc/create-root (js/document.getElementById \"item-counter-error\"))) (rdc/render item-counter-error-root [app-container [debug-app-db] [controls] [warning] [items]]) Your app is working fine, until your next design meeting. Now they want a way to change the max item limit. A little contrived, I know. But not uncommon from a programming perspective. Luckily, our flow factory can make a new flow for any requirement. Therefore, putting in this feature is just a matter of triggering the :reg-flow effect. We build a basic form to change the requirement: (defn requirement-picker [] [: < > \"Max items: \" [:input {:style {:background \"lightgrey\"} :type \"number\" :on-change #(rf/dispatch [:change-requirements {:max-items (-> % .-target .-value)}])}]]) And a corresponding event, which triggers our :reg-flow effect: (rf/reg-event-fx :change-requirements (fn [_ [_ new-requirements]] {:fx [[:reg-flow (error-state-flow (merge base-requirements new-requirements))]]})) What happens after :reg-flow runs? Are there now two flows? Actually, no. If you register a new flow with the same :id , it replaces the old one. When we trigger [:reg-flow (error-state-flow ...)] : The old :error-state flow runs :cleanup The new :error-state flow runs :output Not only does changing the inputs lead to new output, but so does changing the flow itself. Let's test it out: (rf/dispatch-sync [:init]) (defonce item-counter-requirements-root (rdc/create-root (js/document.getElementById \"item-counter-requirements\"))) (rdc/render item-counter-requirements-root [app-container [debug-app-db] [controls] [requirement-picker] [warning] [items]])","title":"Redefining and Undefining"},{"location":"Interceptors/","text":"This tutorial explains re-frame Interceptors . Until now, they have been a hidden detail but, as we are about to find out, they are both important and useful. Why Interceptors? \u00b6 There's two reasons. We want simple event handlers . Interceptors allow us nicely to look after \"cross-cutting\" concerns like undo, tracing and validation. They help us to factor out commonality, hide complexity and introduce further steps into the \"Derived Data, Flowing\" story promoted by re-frame. So, you'll want to use Interceptors because they solve problems, and help you to write nice code. Under the covers, Interceptors provide the mechanism underneath Domino 2 (event handling) and Domino 3 (effect handling). They are a central concept and understanding them better will serve you well, even if you don't need to directly use them very often. What Do Interceptors Do? \u00b6 They wrap. Specifically, they wrap event handlers. Imagine your event handler is like a piece of ham. An interceptor would be like bread on either side of your ham, which makes a sandwich. And two Interceptors, in a chain, would be like you put another pair of bread slices around the outside of the existing sandwich to make a sandwich of the sandwich. Now it is a very thick sandwich. Interceptors wrap on both sides of an event handler, layer after layer. Wait, I know That Pattern! \u00b6 Interceptors implement middleware , but differently. Traditional middleware - often seen in web servers - creates a data processing pipeline (to process arriving HTTP requests) via the nested composition of higher order functions. The result is a \"stack\" of functions. Data representing a request flows through this pipeline, first forwards from one end to the other, and then backwards (as the response). Interceptors achieve the same outcome by assembling functions, as data, in a collection - a chain of interceptors, rather than a stack of middleware. Data can then be iteratively pipelined, first forwards through the functions in the chain, and then backwards along the same chain. Because the interceptor pipeline is composed via a collection (data!), rather than higher order functions, it is a more flexible arrangement. What's In The Pipeline? \u00b6 Data. It flows through the pipeline being progressively transformed. Fine. But what data? With a web server, the middleware \"stack\" progressively transforms an HTTP request in one direction, and, then in the backwards sweep, it progressively produces a response . In re-frame, the forward sweep progressively creates coeffects (inputs to the event handler that you write), while the backwards sweep processes the effects (outputs from the event handler you write). I'll pause while you read that sentence again. That's the key concept, right there. Show Me \u00b6 At the time when you register an event handler, you can provide a chain of interceptors too. Using a 3-arity registration function: ( reg-event-db :some-id [ in1 in2 ] ;; <-- a chain of 2 interceptors (a vector of 2 interceptors) ( fn [ db v ] ;; <-- the handler here, as before .... ))) Each Event Handler can have its own tailored interceptor chain, provided at registration-time. Handlers Are Interceptors Too \u00b6 You could see that registration above as associating :some-id with two things: a chain of 2 interceptors [in1 in2] an event handler . Except, the event handler is turned into an interceptor too (we'll see how shortly). So, actually , :some-id is only associated with one thing: a 3-chain of interceptors, with the event handler wrapped in an interceptor, called say ih , and put on the end of the other two, forming a vector of three interceptors: [in1 in2 ih] . But wait, there's more. The registration function itself, reg-event-db , actually takes this 3-chain and inserts its own standard interceptors, called say std1 and std2 (which do useful things, again more soon) at the front, so ACTUALLY , there's about 5 interceptors in the chain: [std1 std2 in1 in2 ih] So, ultimately, that event registration associates the event id :some-id with just a chain of interceptors. Nothing more. Later, when a (dispatch [:some-id ...]) happens, that 5-chain of interceptors will be \"executed\". And that's how an event gets handled. The Links Of The Chain \u00b6 Each interceptor has this form: { :id :something ;; decorative only - can be ignored :comment { ... } ;; also decorative, optional :before ( fn [ context ] ... ) ;; returns a possibly modified `context` :after ( fn [ context ] ... )} ;; returns a possibly modified `context` That's essentially a map of two functions (a before function and an after function). Now imagine a vector of these maps - that's an interceptor chain. Above we imagined an interceptor chain of [std1 std2 in1 in2 ih] . Now we know that this is really a vector of 5 maps: [{...} {...} {...} {...} {...}] where each of the 5 maps have a :before and :after fn. Sometimes, the :before and :after functions are noops - they take a context and return that context unchanged - think identity . To \"execute\" an interceptor chain: create a context (which is a map with a certain structure, described below) iterate forwards over the chain, calling the :before function on each interceptor, threading context through each call. iterate over the chain in the opposite (backwards) direction calling the :after function on each interceptor and threading context through all the calls Remember that the last interceptor in the chain is the event handler itself (wrapped up to be the :before ). That's it. That's how an event gets handled. This is how Dominoes 2 and 3 happen. What Is Context? \u00b6 Some data called a context is threaded through all the calls. This value is passed as the argument to every :before and :after function and it is returned by each function, possibly modified. A context is a map with this structure: { :coeffects { :event [ :some-id :some-param ] :db } :effects { :db :dispatch [ :an-event-id :param1 ]} :queue :stack } context has a :coeffects key and an :effects key which, if this was a web server, would be somewhat analogous to request and response respectively. :coeffects will contain the inputs required by the event handler (sitting presumably on the end of the chain). So that's data like the :event being processed, and the initial state of db . The handler-returned side effects are put into :effects including, but not limited to, a new value for app-db . The first few interceptors in a chain (the ones inserted by reg-event-db ) have :before functions which prime the :coeffects by adding in :event , and :db . Of course, other interceptors can add further to :coeffects . Perhaps the event handler needs data from localstore, or a random number, or a DataScript connection. Interceptors can accumulate interesting information into :coeffects , via their :before function. Equally, some interceptors in the chain will have an :after function which processes the side effects accumulated into :effects including, but not limited to, updates to app-db . Threading the Context \u00b6 Above, we imagined an interceptor chain like: [std1 std2 in1 in2 ih] . One way to imagine the whole event handling process would be to see it written like this: ;; start by creating a context map ( let [ context { :coeffects {} :effects {} ... }] ( -> context ;; Thread `context` through all the `:before` functions. ;; This phase is usually concerned with building up `:coeffects` (( :before std1 ) ) ;; noop (( :before std2 ) ) ;; adds `:event` and `:db` to `:coeffects` (( :before in1 ) ) (( :before in2 ) ) (( :before ih ) ) ;; Domino 2 - handler called & return value put into `:effects` ;; Now backwards through the `:after` functions ;; This phase is usually concerned with building up or processing `:effects` ;; But could involve side effects like logging, or undo/redo state actions, etc (( :after ih ) ) ;; noop (( :after in2 ) ) (( :after in1 ) ) (( :after std2 ) ) ;; noop (( :after std1 ) ) ;; Domino 3 - all the `:effects` are processed Infographics \u00b6 Self Modifying \u00b6 There's something not shown in the above schematic. Through both stages (the :before sweep and the :after sweep), context also contains a :queue key which is the queue interceptors yet to be processed, and a :stack key which is vector of of the interceptors already done. In advanced cases, these two values, within a context , can be modified by the :before and :after functions through which the context is threaded. So interceptors can be dynamically added and removed from :queue and :stack by Interceptors already in the chain. Self Documenting \u00b6 An interceptor has a required :id key, and an optional :comment key. Re-frame itself does not take any special action in response to these keys. Instead, they can offer situational awareness to you or your tools. For instance, the standard interceptor path adds a :comment describing which path it goes to. Credit \u00b6 All truths are easy to understand once they are discovered -- Galileo Galilei This elegant and flexible arrangement was originally designed by the Pedestal Team . Thanks! Let's Write An Interceptor \u00b6 Dunno about you, but I'm easily offended by underscores. Imagine we had a view which did this: ( dispatch [ :delete-item 42 ]) We'd have to write this event handler: ( reg-event-db :delete-item ( fn [ db [ _ key-to-delete ]] ;; <---- Arrgggghhh underscore ( dissoc db key-to-delete ))) Do you see it there? That _ in the event destructuring!!! Almost mocking us with that passive aggressive, understated thing it has going on!! Co-workers have said I'm \"being overly sensitive\", perhaps even pixel-ist, but you can see it too, right? Of course you can. What a relief it would be to not have it there, but how? We'll write an interceptor: trim-event Once we have written trim-event , our registration will change to look like this: ( reg-event-db :delete-item [ trim-event ] ;; <--- interceptor added ( fn [ db [ key-to-delete ]] ;; <---yaaah! no leading underscore ( dissoc db key-to-delete ))) trim-event will need to change the :coeffects map (within context ). Specifically, it will be changing the :event value within the :coeffects . :event will start off as [:delete-item 42] , but will end up [42] by the time it is supplied to the handler. trim-event will remove that leading :delete-item because, by the time the event is being processed, we already know what id it has. And, so here it is: ( def trim-event ( re-frame.core/->interceptor :id :trim-event :before ( fn [ context ] ( let [ trim-fn ( fn [ event ] ( -> event rest vec ))] ( update-in context [ :coeffects :event ] trim-fn ))))) As you read this, look back to what a context looks like. Notes: We use the API function ->interceptor to create an interceptor (which is just a map) Our interceptor only has a :before function Our :before is given context . It modifies it and returns it. There is no :after for this Interceptor. It has nothing to do with the backwards processing flow of :effects . It is concerned only with :coeffects in the forward flow. Wrapping Handlers \u00b6 We're going well. Let's do an advanced wrapping. Earlier, in the \"Handlers Are Interceptors Too\" section, I explained that event handlers are wrapped in an Interceptor and placed on the end of an Interceptor chain. Remember the whole [std1 std2 in1 in2 ih] thing? We'll now look at the ih bit. How does an event handler get wrapped to be an Interceptor? Reminder - there's two kinds of event handler: the -db variety registered by reg-event-db the -fx variety registered by reg-event-fx I'll now show how to wrap the -db variety. Reminder: here's what a -db handler looks like: ( fn [ db event ] ;; takes two params ( assoc db :flag true )) ;; returns a new db So, we'll be writing a function which takes a -db handler as an argument, and returns an Interceptor which wraps that handler: ( defn db-handler->interceptor [ db-handler-fn ] ( re-frame.core/->interceptor ;; an API function supplied by re-frame :id :db-handler ;; ids are decorative only :before ( fn [ context ] ;; this interceptor only has a `:before ( let [{ :keys [ db event ]} ( :coeffects context ) ;; extract db and event from coeffects new-db ( db-handler-fn db event )] ;; call the event handler ( assoc-in context [ :effects :db ] new-db )))))) ;; put db back into :effects, as `:db` effect Notes: Notice how this wrapper extracts data from the context's :coeffects and then calls the handler with that data (a handler must be called with two args: db and event ) Equally notice how this wrapping takes the return value from db-handler-fn handler and puts it into context's :effects The modified context (it has a new :effects ) is returned This is all done in :before . There is no :after (it is a noop). But this could have been reversed with the work happening in :after and :before a noop. Shrug. Remember that this Interceptor will be on the end of a chain. Feeling confident? Try writing the wrapper for -fx handlers - it is just a small variation. Summary \u00b6 In this tutorial, we've learned: 1. When you register an event handler, you can supply a collection of Interceptors : ( reg-event-db :some-id [ in1 in2 ] ;; <-- a chain of 2 interceptors ( fn [ db v ] ;; <-- real handler here .... ))) 2. When you are registering an event handler, you are associating an event id with a chain of interceptors including: the ones you supply (optional) in1 and in2 an extra one on the end, which wraps the event handler itself (we called it ih ) a couple at the beginning of the chain std1 & std2 , put there by the reg-event-db or reg-event-fx . the entire interceptor chain might end up a vector of 5 - [std1 std2 in1 in2 ih] 3. An Interceptor Chain is executed in two stages. First a forwards sweep in which all :before functions are called, and then second, a backwards sweep in which the :after functions are called. A context map will be threaded through all these calls. An Interceptor chain is a reified \"call stack\". 4. Interceptors do interesting things to context : add to :coeffects (data inputs to the handler) process side :effects (returned by a handler) produce logs further process In the next Tutorial, we'll look at (side) Effects in more depth. Later again, we'll look at Coeffects. Appendix - Built-in Interceptors \u00b6 re-frame comes with some built-in Interceptors: debug : log each event as it is processed. Shows incremental clojure.data/diff reports. trim-v : a convenience. More readable handlers. And some Interceptor factories (functions that return Interceptors): enrich : perform additional computations (validations?), after the handler has run. More derived data flowing. after : perform side effects, after a handler has run. Eg: use it to report if the data in app-db matches a schema. path : a convenience. Simplifies our handlers. Acts almost like update-in , to get and set a subtree of the app-db. Stores the path of the subtree in its :comment . In addition, a Library like re-frame-undo provides an Interceptor factory called undoable which checkpoints app state. To use them, first require them: ( ns my.core ( :require [ re-frame.core :refer [ debug path ]])","title":"Interceptors"},{"location":"Interceptors/#why-interceptors","text":"There's two reasons. We want simple event handlers . Interceptors allow us nicely to look after \"cross-cutting\" concerns like undo, tracing and validation. They help us to factor out commonality, hide complexity and introduce further steps into the \"Derived Data, Flowing\" story promoted by re-frame. So, you'll want to use Interceptors because they solve problems, and help you to write nice code. Under the covers, Interceptors provide the mechanism underneath Domino 2 (event handling) and Domino 3 (effect handling). They are a central concept and understanding them better will serve you well, even if you don't need to directly use them very often.","title":"Why Interceptors?"},{"location":"Interceptors/#what-do-interceptors-do","text":"They wrap. Specifically, they wrap event handlers. Imagine your event handler is like a piece of ham. An interceptor would be like bread on either side of your ham, which makes a sandwich. And two Interceptors, in a chain, would be like you put another pair of bread slices around the outside of the existing sandwich to make a sandwich of the sandwich. Now it is a very thick sandwich. Interceptors wrap on both sides of an event handler, layer after layer.","title":"What Do Interceptors Do?"},{"location":"Interceptors/#wait-i-know-that-pattern","text":"Interceptors implement middleware , but differently. Traditional middleware - often seen in web servers - creates a data processing pipeline (to process arriving HTTP requests) via the nested composition of higher order functions. The result is a \"stack\" of functions. Data representing a request flows through this pipeline, first forwards from one end to the other, and then backwards (as the response). Interceptors achieve the same outcome by assembling functions, as data, in a collection - a chain of interceptors, rather than a stack of middleware. Data can then be iteratively pipelined, first forwards through the functions in the chain, and then backwards along the same chain. Because the interceptor pipeline is composed via a collection (data!), rather than higher order functions, it is a more flexible arrangement.","title":"Wait, I know That Pattern!"},{"location":"Interceptors/#whats-in-the-pipeline","text":"Data. It flows through the pipeline being progressively transformed. Fine. But what data? With a web server, the middleware \"stack\" progressively transforms an HTTP request in one direction, and, then in the backwards sweep, it progressively produces a response . In re-frame, the forward sweep progressively creates coeffects (inputs to the event handler that you write), while the backwards sweep processes the effects (outputs from the event handler you write). I'll pause while you read that sentence again. That's the key concept, right there.","title":"What's In The Pipeline?"},{"location":"Interceptors/#show-me","text":"At the time when you register an event handler, you can provide a chain of interceptors too. Using a 3-arity registration function: ( reg-event-db :some-id [ in1 in2 ] ;; <-- a chain of 2 interceptors (a vector of 2 interceptors) ( fn [ db v ] ;; <-- the handler here, as before .... ))) Each Event Handler can have its own tailored interceptor chain, provided at registration-time.","title":"Show Me"},{"location":"Interceptors/#handlers-are-interceptors-too","text":"You could see that registration above as associating :some-id with two things: a chain of 2 interceptors [in1 in2] an event handler . Except, the event handler is turned into an interceptor too (we'll see how shortly). So, actually , :some-id is only associated with one thing: a 3-chain of interceptors, with the event handler wrapped in an interceptor, called say ih , and put on the end of the other two, forming a vector of three interceptors: [in1 in2 ih] . But wait, there's more. The registration function itself, reg-event-db , actually takes this 3-chain and inserts its own standard interceptors, called say std1 and std2 (which do useful things, again more soon) at the front, so ACTUALLY , there's about 5 interceptors in the chain: [std1 std2 in1 in2 ih] So, ultimately, that event registration associates the event id :some-id with just a chain of interceptors. Nothing more. Later, when a (dispatch [:some-id ...]) happens, that 5-chain of interceptors will be \"executed\". And that's how an event gets handled.","title":"Handlers Are Interceptors Too"},{"location":"Interceptors/#the-links-of-the-chain","text":"Each interceptor has this form: { :id :something ;; decorative only - can be ignored :comment { ... } ;; also decorative, optional :before ( fn [ context ] ... ) ;; returns a possibly modified `context` :after ( fn [ context ] ... )} ;; returns a possibly modified `context` That's essentially a map of two functions (a before function and an after function). Now imagine a vector of these maps - that's an interceptor chain. Above we imagined an interceptor chain of [std1 std2 in1 in2 ih] . Now we know that this is really a vector of 5 maps: [{...} {...} {...} {...} {...}] where each of the 5 maps have a :before and :after fn. Sometimes, the :before and :after functions are noops - they take a context and return that context unchanged - think identity . To \"execute\" an interceptor chain: create a context (which is a map with a certain structure, described below) iterate forwards over the chain, calling the :before function on each interceptor, threading context through each call. iterate over the chain in the opposite (backwards) direction calling the :after function on each interceptor and threading context through all the calls Remember that the last interceptor in the chain is the event handler itself (wrapped up to be the :before ). That's it. That's how an event gets handled. This is how Dominoes 2 and 3 happen.","title":"The Links Of The Chain"},{"location":"Interceptors/#what-is-context","text":"Some data called a context is threaded through all the calls. This value is passed as the argument to every :before and :after function and it is returned by each function, possibly modified. A context is a map with this structure: { :coeffects { :event [ :some-id :some-param ] :db } :effects { :db :dispatch [ :an-event-id :param1 ]} :queue :stack } context has a :coeffects key and an :effects key which, if this was a web server, would be somewhat analogous to request and response respectively. :coeffects will contain the inputs required by the event handler (sitting presumably on the end of the chain). So that's data like the :event being processed, and the initial state of db . The handler-returned side effects are put into :effects including, but not limited to, a new value for app-db . The first few interceptors in a chain (the ones inserted by reg-event-db ) have :before functions which prime the :coeffects by adding in :event , and :db . Of course, other interceptors can add further to :coeffects . Perhaps the event handler needs data from localstore, or a random number, or a DataScript connection. Interceptors can accumulate interesting information into :coeffects , via their :before function. Equally, some interceptors in the chain will have an :after function which processes the side effects accumulated into :effects including, but not limited to, updates to app-db .","title":"What Is Context?"},{"location":"Interceptors/#threading-the-context","text":"Above, we imagined an interceptor chain like: [std1 std2 in1 in2 ih] . One way to imagine the whole event handling process would be to see it written like this: ;; start by creating a context map ( let [ context { :coeffects {} :effects {} ... }] ( -> context ;; Thread `context` through all the `:before` functions. ;; This phase is usually concerned with building up `:coeffects` (( :before std1 ) ) ;; noop (( :before std2 ) ) ;; adds `:event` and `:db` to `:coeffects` (( :before in1 ) ) (( :before in2 ) ) (( :before ih ) ) ;; Domino 2 - handler called & return value put into `:effects` ;; Now backwards through the `:after` functions ;; This phase is usually concerned with building up or processing `:effects` ;; But could involve side effects like logging, or undo/redo state actions, etc (( :after ih ) ) ;; noop (( :after in2 ) ) (( :after in1 ) ) (( :after std2 ) ) ;; noop (( :after std1 ) ) ;; Domino 3 - all the `:effects` are processed","title":"Threading the Context"},{"location":"Interceptors/#infographics","text":"","title":"Infographics"},{"location":"Interceptors/#self-modifying","text":"There's something not shown in the above schematic. Through both stages (the :before sweep and the :after sweep), context also contains a :queue key which is the queue interceptors yet to be processed, and a :stack key which is vector of of the interceptors already done. In advanced cases, these two values, within a context , can be modified by the :before and :after functions through which the context is threaded. So interceptors can be dynamically added and removed from :queue and :stack by Interceptors already in the chain.","title":"Self Modifying"},{"location":"Interceptors/#self-documenting","text":"An interceptor has a required :id key, and an optional :comment key. Re-frame itself does not take any special action in response to these keys. Instead, they can offer situational awareness to you or your tools. For instance, the standard interceptor path adds a :comment describing which path it goes to.","title":"Self Documenting"},{"location":"Interceptors/#credit","text":"All truths are easy to understand once they are discovered -- Galileo Galilei This elegant and flexible arrangement was originally designed by the Pedestal Team . Thanks!","title":"Credit"},{"location":"Interceptors/#lets-write-an-interceptor","text":"Dunno about you, but I'm easily offended by underscores. Imagine we had a view which did this: ( dispatch [ :delete-item 42 ]) We'd have to write this event handler: ( reg-event-db :delete-item ( fn [ db [ _ key-to-delete ]] ;; <---- Arrgggghhh underscore ( dissoc db key-to-delete ))) Do you see it there? That _ in the event destructuring!!! Almost mocking us with that passive aggressive, understated thing it has going on!! Co-workers have said I'm \"being overly sensitive\", perhaps even pixel-ist, but you can see it too, right? Of course you can. What a relief it would be to not have it there, but how? We'll write an interceptor: trim-event Once we have written trim-event , our registration will change to look like this: ( reg-event-db :delete-item [ trim-event ] ;; <--- interceptor added ( fn [ db [ key-to-delete ]] ;; <---yaaah! no leading underscore ( dissoc db key-to-delete ))) trim-event will need to change the :coeffects map (within context ). Specifically, it will be changing the :event value within the :coeffects . :event will start off as [:delete-item 42] , but will end up [42] by the time it is supplied to the handler. trim-event will remove that leading :delete-item because, by the time the event is being processed, we already know what id it has. And, so here it is: ( def trim-event ( re-frame.core/->interceptor :id :trim-event :before ( fn [ context ] ( let [ trim-fn ( fn [ event ] ( -> event rest vec ))] ( update-in context [ :coeffects :event ] trim-fn ))))) As you read this, look back to what a context looks like. Notes: We use the API function ->interceptor to create an interceptor (which is just a map) Our interceptor only has a :before function Our :before is given context . It modifies it and returns it. There is no :after for this Interceptor. It has nothing to do with the backwards processing flow of :effects . It is concerned only with :coeffects in the forward flow.","title":"Let's Write An Interceptor"},{"location":"Interceptors/#wrapping-handlers","text":"We're going well. Let's do an advanced wrapping. Earlier, in the \"Handlers Are Interceptors Too\" section, I explained that event handlers are wrapped in an Interceptor and placed on the end of an Interceptor chain. Remember the whole [std1 std2 in1 in2 ih] thing? We'll now look at the ih bit. How does an event handler get wrapped to be an Interceptor? Reminder - there's two kinds of event handler: the -db variety registered by reg-event-db the -fx variety registered by reg-event-fx I'll now show how to wrap the -db variety. Reminder: here's what a -db handler looks like: ( fn [ db event ] ;; takes two params ( assoc db :flag true )) ;; returns a new db So, we'll be writing a function which takes a -db handler as an argument, and returns an Interceptor which wraps that handler: ( defn db-handler->interceptor [ db-handler-fn ] ( re-frame.core/->interceptor ;; an API function supplied by re-frame :id :db-handler ;; ids are decorative only :before ( fn [ context ] ;; this interceptor only has a `:before ( let [{ :keys [ db event ]} ( :coeffects context ) ;; extract db and event from coeffects new-db ( db-handler-fn db event )] ;; call the event handler ( assoc-in context [ :effects :db ] new-db )))))) ;; put db back into :effects, as `:db` effect Notes: Notice how this wrapper extracts data from the context's :coeffects and then calls the handler with that data (a handler must be called with two args: db and event ) Equally notice how this wrapping takes the return value from db-handler-fn handler and puts it into context's :effects The modified context (it has a new :effects ) is returned This is all done in :before . There is no :after (it is a noop). But this could have been reversed with the work happening in :after and :before a noop. Shrug. Remember that this Interceptor will be on the end of a chain. Feeling confident? Try writing the wrapper for -fx handlers - it is just a small variation.","title":"Wrapping Handlers"},{"location":"Interceptors/#summary","text":"In this tutorial, we've learned: 1. When you register an event handler, you can supply a collection of Interceptors : ( reg-event-db :some-id [ in1 in2 ] ;; <-- a chain of 2 interceptors ( fn [ db v ] ;; <-- real handler here .... ))) 2. When you are registering an event handler, you are associating an event id with a chain of interceptors including: the ones you supply (optional) in1 and in2 an extra one on the end, which wraps the event handler itself (we called it ih ) a couple at the beginning of the chain std1 & std2 , put there by the reg-event-db or reg-event-fx . the entire interceptor chain might end up a vector of 5 - [std1 std2 in1 in2 ih] 3. An Interceptor Chain is executed in two stages. First a forwards sweep in which all :before functions are called, and then second, a backwards sweep in which the :after functions are called. A context map will be threaded through all these calls. An Interceptor chain is a reified \"call stack\". 4. Interceptors do interesting things to context : add to :coeffects (data inputs to the handler) process side :effects (returned by a handler) produce logs further process In the next Tutorial, we'll look at (side) Effects in more depth. Later again, we'll look at Coeffects.","title":"Summary"},{"location":"Interceptors/#appendix-built-in-interceptors","text":"re-frame comes with some built-in Interceptors: debug : log each event as it is processed. Shows incremental clojure.data/diff reports. trim-v : a convenience. More readable handlers. And some Interceptor factories (functions that return Interceptors): enrich : perform additional computations (validations?), after the handler has run. More derived data flowing. after : perform side effects, after a handler has run. Eg: use it to report if the data in app-db matches a schema. path : a convenience. Simplifies our handlers. Acts almost like update-in , to get and set a subtree of the app-db. Stores the path of the subtree in its :comment . In addition, a Library like re-frame-undo provides an Interceptor factory called undoable which checkpoints app state. To use them, first require them: ( ns my.core ( :require [ re-frame.core :refer [ debug path ]])","title":"Appendix - Built-in Interceptors"},{"location":"Loading-Initial-Data/","text":"Bootstrapping Application State \u00b6 To bootstrap a re-frame application, you need to: register handlers: subscription (via reg-sub ) events (via reg-event-db or reg-event-fx ) effects (via reg-fx ) coeffects (via reg-cofx ) kickstart reagent (views) Load the right initial data into app-db which might, for example, be a merge of: Some default values Values stored in LocalStorage Values obtained via service calls to server Point 3 is the interesting bit and will be the main focus of this page, but let's work our way through them ... 1. Register Handlers \u00b6 re-frame's various handlers all work in the same way. You declare and register your handlers in the one step, like this \"event handler\" example: ( re-frame/reg-event-db ;; event handler will be registered automatically :some-id ( fn [ db [ _ value ]] ... do some state change based on db and value )) As a result, there's nothing further you need to do because handler registration happens as a direct result of loading the code (presumably via a